{"projects": [{"components": [{"description": "", "name": "TrapperKeeper"}, {"description": "", "name": "TrapperKeeper / UI"}], "description": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "externalName": "Trapperkeeper", "issues": [{"affectedVersions": [], "assignee": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "attachments": [], "comments": [], "components": [], "created": "2023-01-14T09:21:00.000000", "creator": "623c12b950bb2b0070b6b384", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3d409e59"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o0ljup:"}], "description": "Please implement support for [sd_notify()|https://www.freedesktop.org/software/systemd/man/sd_notify.html] in Trapperkeeper.\n\n`sd_notify()` is a mechanism to notify the service manager (systemd) of state changes. It can signal when a service is ready, or in the process of reloading or stopping. In addition, it provides a watchdog functionality which can allow the service manager to recognize an unresponsive service and take appropriate measures.\n\nThe existing [--restart-file|https://github.com/puppetlabs/trapperkeeper/blob/main/documentation/Restart-File.md] option provides a similar feature (signalling readiness) but its usage is much more convoluted with respect to the service manager because a substantial amount of extra code is needed to handle polling the restart file ([example|https://github.com/puppetlabs/ezbake/blob/main/resources/puppetlabs/lein-ezbake/template/global/ext/cli/start.erb]).\n\n`sd_notify()` on the other hand only requires setting `Type=notify` in the service unit configuration, and `WatchdogSec=N` to enable the watchdog feature.\n\nThis could be implemented relatively easily with the help of the LGPL-2 licensed [SDNotify|https://github.com/faljse/SDNotify] third-party library.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10473", "fixedVersions": [], "id": "10473", "issueType": "New Feature", "key": "TK-499", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b950bb2b0070b6b384", "status": "Open", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Implement support for sd_notify()", "timeSpent": "PT0S", "updated": "2023-01-27T10:10:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "6220dbdaa12450006887cfd3", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2021-09-21T14:29:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@769467e6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyk4d5:kk0z3k"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_504388022_*|*_10007_*:*_1_*:*_150519728_*|*_3_*:*_1_*:*_606145948_*|*_10009_*:*_1_*:*_2438000301_*|*_5_*:*_1_*:*_0"}], "description": "One of the puppetdb tests failed in a way that indicated that the metrics endpoint was not requiring authorization when that was expected.  We think it's likely because this code was failing (for whatever reason) to find the AuthorizationService during startup and so it just quietly disabled authentication here: https://github.com/puppetlabs/trapperkeeper-metrics/blob/main/src/clj/puppetlabs/trapperkeeper/services/metrics/metrics_service.clj#L84-L85\n\nSo we think we should consider fixing it so that (if it's not already) it's possible to clearly express an intent to require authorization, and then have the service init just fail in that case if the AuthorizationService can't be found.\n\nWith respect to the solution, one option might be to add a metrics config option like\n{code:ini}\nauthentication = may | must | no\n{code}\n\nAnd of course all else equal, it'd be better if it were feasible to arrange this without having to change the tk config \"everywhere\".", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10548", "fixedVersions": [], "id": "10548", "issueType": "Bug", "key": "TK-497", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Fixed", "resolutionDate": "2021-11-03T10:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "trapperkeeper-metrics: allow requiring authorization", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "body": "[~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100] doesn't consider this a priority, so closing this. If the security team or customers ask for this, we can reconsider.", "created": "2021-09-15T11:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2021-09-01T16:02:00.000000", "creator": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5374d9d8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hykebj:4090000694a9404"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_501942784_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_690702148"}], "description": "Our [cipher suite preferences|https://confluence.puppetlabs.com/display/SRE/TLS+Usage+Standard] (which we get from [Mozilla|https://wiki.mozilla.org/Security/Server_Side_TLS]) include two cipher suites that we [currently don't accept|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/8ccdfa02e67cfc301ad3a78c4df5e8fb4b9482b2/src/puppetlabs/trapperkeeper/services/webserver/jetty9_config.clj#L66-L72]:\n* {{TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256}}\n* {{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256}}\n\nAs far as we know, these cipher suites are not available for Java 8, but in theory a client preferring these ciphers should be able to fall back if they're unavailable.\n\nIf we decide this is a worthwhile investment, we should verify that everything works as expected for Java 8 (i.e. we fall back to an appropriate cipher suite and nothing blows up).", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10547", "fixedVersions": [], "id": "10547", "issueType": "Improvement", "key": "TK-496", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "resolution": "Won't Do", "resolutionDate": "2021-09-15T11:19:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for CHACHA20 TLS 1.2 ciphers", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "attachments": [], "comments": [{"author": "557058:e0340dee-9d48-48c3-8c6a-02597af847c9", "body": "I just built from scratch with that section removed on an EL8 FIPS system and everything seems to be working!", "created": "2021-08-24T17:36:00.000000"}, {"author": "557058:91233464-4152-4228-81dd-172d43a52a03", "body": "Moved to epic for RHEL8 FIPS server support", "created": "2021-12-14T13:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2021-08-24T16:04:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5d3d521b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyk3ms:002000i"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "24/Aug/21"}], "description": "*TK component Version:* puppetlabs/trapperkeeper-webserver-jetty9 4.1.8\n\nThe puppetlabs/trapperkeeper-webserver-jetty9 component provides the core webserver logic for Puppet Server, PuppetDB, and PE JVM services. This component contains the following unconditional blocklist logic targeting the {{sun.security.pkcs11.SunPKCS11}} security provider:\n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/4.1.8/src/puppetlabs/trapperkeeper/services/webserver/jetty9_core.clj#L44-L61\n\nThis logic was inherited from one of the original PuppetDB releases back in 2012 and resolves an issue where the provider could prevent Java 6 from using TLSv1. The following message is printed to {{puppetserver.log}} when this logic is triggered:\n\n{noformat}\n2021-08-24T21:50:27.151Z INFO  [main] [p.t.s.w.jetty9-core] Removing buggy security provider SunPKCS11-NSS version 1.8\n{noformat}\n\nNowadays, the logic prevents Java from loading FIPS-enabled security providers on RedHat 8.\n\nGiven Java 6 and TLSv1 are both past end of life, we should review this block and drop it if it no longer provides a benefit.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10316", "fixedVersions": [], "id": "10316", "issueType": "Bug", "key": "TK-495", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "status": "Open", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Blocking the sun.security.pkcs11.SunPKCS11 security provider prevents FIPS-enabled security providers on RH8", "timeSpent": "PT0S", "updated": "2022-06-10T06:15:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "attachments": [], "comments": [{"author": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "body": "Awaiting confirmation from [~accountid:5fd3e4989edf2800758fda74] on the preferred cipher suite order, since the list and table on https://confluence.puppetlabs.com/display/SRE/TLS+Usage+Standard don't agree (though we suspect that the table is authoritative).\n\nAlso awaiting an answer from [~accountid:5fd3e4989edf2800758fda74] on why https://confluence.puppetlabs.com/display/SRE/TLS+Usage+Standard only includes three TLS 1.3 cipher suites, as opposed to the five listed on https://wiki.openssl.org/index.php/TLS1.3 ", "created": "2021-08-31T16:44:00.000000"}, {"author": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "body": "According to Diego, we're following Mozilla's cipher suite recommendations: https://wiki.mozilla.org/Security/Server_Side_TLS\n\nThis confirms that the list on Confluence is correct (the table has been removed to eliminate confusion) and confirms that we are intentionally only including three of the five TLS 1.3 cipher suites.\n\nSlack convo with Diego: https://puppet.slack.com/archives/C024YNKBFFZ/p1630502890004900?thread_ts=1630448554.003700&cid=C024YNKBFFZ", "created": "2021-09-01T12:45:00.000000"}, {"author": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "body": "okay, TLS 1.3 support has been released in trapperkeeper-webserver-jetty9 4.2.0, which has been released in clj-parent 4.8.0.", "created": "2021-09-02T19:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2021-08-11T15:23:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6b925094"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyk48n:q0200000io"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "This should be documented at the epic-level."}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Aug/21"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_55204014_*|*_1_*:*_1_*:*_1288472053_*|*_10007_*:*_1_*:*_91888759_*|*_3_*:*_2_*:*_25244358_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_71878121_*|*_10006_*:*_1_*:*_10261873_*|*_10005_*:*_1_*:*_427326449"}], "description": "TLS 1.3 support has been backported to Java 8 in 8u272 which was release in October 2020. It will have been pulled in by any user that is getting Java security updates and is in all supported LTS OS streams (Redhat 7, Ubuntu 18.04, ...).\n\n\u00a0\n\nMoreover it appears that adding the TLSv1.3 protocol and cipher suites to the existing TLSv1.2 cipher suites is handled correctly, making TLS1.3 connections where available and downgrading to TLSv1.2 when not.\n\n\u00a0\n\nOutcomes: \n* Add the TLSv1.3 and applicable cipher suites to tk-jetty9 and release it in all support FOSS streams (eg Puppet Server and PDB 6.x and 7.x). The TLS 1.3 ciphers suites that should be added to the existing TLSv1.2 suites are listed here: https://confluence.puppetlabs.com/display/SRE/TLS+Usage+Standard\n* Double check the existing cipher suites against the preferred order listed here: https://confluence.puppetlabs.com/display/SRE/TLS+Usage+Standard\n\n\nThis work should be completed and release to users prior to the PE build where we want to enable TLSv1.3.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10655", "fixedVersions": ["TK-JETTY9 4.2.0"], "id": "10655", "issueType": "Task", "key": "TK-494", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Fixed", "resolutionDate": "2021-09-03T10:41:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Enable TLS 1.3 by default in tk-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:25:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10013"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:05:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10014"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:17:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10015"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10016"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10017"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10018"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10019"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:43:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10020"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10021"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10022"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:25:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10025"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:37:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10026"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:53:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10027"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:05:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10028"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:33:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10029"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T14:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10030"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10031"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:39:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10032"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:51:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10033"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:31:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10034"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:43:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10035"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10036"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:41:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10038"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:53:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10039"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:21:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10040"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:33:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10041"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T14:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10042"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10043"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:39:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10044"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:51:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10045"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10046"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10047"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10048"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10049"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:29:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10053"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:41:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10054"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:09:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10055"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:21:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10056"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10057"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10058"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10059"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10060"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:31:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10061"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:47:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10062"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10063"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10064"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:29:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10069"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:57:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10070"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:09:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10071"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:37:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10072"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10073"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10074"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10075"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10076"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:35:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10077"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:47:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10078"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10079"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10080"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:45:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10083"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:57:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10084"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:25:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10085"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:37:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10086"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10087"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:31:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10088"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:43:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10089"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10090"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10091"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:35:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10092"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:03:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10093"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10094"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:33:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10095"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:45:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10096"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:13:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10097"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:25:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10098"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10099"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:31:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10100"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:43:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10101"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10102"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10103"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:51:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10104"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10105"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10106"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:21:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10107"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:33:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10108"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:01:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10109"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:13:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10110"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10111"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:19:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10112"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10113"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10114"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:39:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10115"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:51:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10116"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10117"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10118"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:49:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10119"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:01:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10120"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:29:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10121"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T14:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10122"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:07:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10123"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:35:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10124"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:47:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10125"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:59:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10126"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10127"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:39:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10128"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10129"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:22:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10132"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:37:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10133"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T12:49:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10134"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:17:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10135"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-15T13:29:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10136"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T14:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10137"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:23:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10138"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:35:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10139"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T15:47:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10140"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:15:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10141"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:27:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10142"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T16:55:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10143"}, {"attacher": "623c13dfee1b5a0070293665", "created": "2020-12-16T17:11:00.000000", "name": "icon.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10144"}], "comments": [{"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser t63sor10577899pgc.40 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:21:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser cp5sor1720937plb.71 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:22:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser l3sor10452255pjz.16 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:25:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u1sor10920451plz.68 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:25:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser g4sor3899470pgs.68 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:29:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser lx18sor10592710pjb.32 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:29:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser x5sor7041755plm.35 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:33:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u35sor9600443pgk.34 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:33:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u8sor945926pgl.60 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:37:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser ha18sor5768391pjb.17 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:37:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser j10sor1861620pjs.0 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:41:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 136sor9844999pfz.33 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:41:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser iq22sor10500810pjb.38 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:45:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d134sor10536457pga.16 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:45:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d20sor10533812pgi.25 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:49:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d22sor6180pjz.10 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:49:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser h38sor10492629pgb.21 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:53:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q13sor3018684pgi.20 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:53:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser y2sor9186pjv.20 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:57:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser a145sor10252841pfa.51 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T12:57:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser j5sor11272405pld.57 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:01:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser b3sor5873pji.35 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:01:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser t63sor10629612pgc.40 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:05:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e4sor3273405pfh.74 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:05:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser x12sor11258306plo.66 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:09:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser k4sor9995776pfg.90 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:09:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser m12sor8763234pgj.41 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:13:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser a3sor3943127pgg.38 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:13:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser o8sor11390422plk.56 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:17:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser s24sor4832441pgv.58 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:17:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e3sor828232pfe.98 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:21:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser p8sor8667plk.0 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:21:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e8sor10431481pgn.57 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:25:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser c16sor11330562pls.53 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:25:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser b31sor10383027pgm.55 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:29:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d5sor9867976pfo.11 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:29:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser me13sor57979pjb.15 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:33:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser z12sor4406036pfa.28 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:33:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser r203sor8672529pfc.42 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:37:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser k7sor2906358pga.24 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:37:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser v31sor1184450pga.36 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:41:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 24sor10735681pgz.51 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-15T13:41:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser s11sor1642788pjp.5 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T14:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser f9sor1852790plb.37 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T14:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser f18sor1511046pfe.71 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T14:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser x5sor1878949plm.35 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T14:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser y22sor902278pgl.66 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser g19sor1493949pfk.91 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser z15sor1442080pfg.93 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e12sor1629159pgd.65 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser t18sor1491689pfq.56 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d1sor1889199pls.17 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser a145sor1562696pfa.51 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q12sor1497550pfc.100 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser r203sor1501360pfc.42 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser i7sor1645276pgr.31 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser me13sor1671074pjb.15 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser ci9sor1614615pjb.11 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser s19sor1887848plq.39 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:27:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e3sor1530523pfe.98 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:27:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser az12sor1908382plb.47 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:31:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser v5sor1656957pjl.22 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:31:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser v1sor1666068pgl.64 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:35:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser n6sor1674176pgn.47 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:35:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser i69sor1703477pgc.11 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:39:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser v5sor1664027pjl.22 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:39:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser f14sor1681376pgj.35 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:43:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser bc5sor1910389plb.70 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:43:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser m10sor1692812pgp.78 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:47:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e12sor1664299pgd.65 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:47:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser t36sor1585609pfg.9 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:51:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser l3sor1680424pjz.16 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:51:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser fw10sor1664033pjb.17 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser h11sor1896956plr.5 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser l16sor166649pgk.10 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser p8sor1932308plk.0 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T15:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q19sor87231pfg.59 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser g18sor1545858pfb.4 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u5sor1688016pjr.37 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser iq22sor1697855pjb.38 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u13sor1677254pjn.32 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d21sor1546367pfq.3 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser i7sor1700341pgr.31 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d22sor1702149pjz.10 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser w21sor1611435pfc.31 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser i124sor1601709pfe.23 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser f15sor1758221pgf.23 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser bb12sor1714411pjb.10 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser w18sor1594809pfu.29 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:27:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser cv8sor1750933pjb.20 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:27:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser p6sor1756929pgd.84 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:31:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q6sor1579258pfu.64 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:31:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser k7sor1586773pfu.26 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:35:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q14sor1617500pfj.22 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:35:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 11sor1962801plg.10 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:39:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser n21sor1606225pfu.81 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:39:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e1sor1937838pls.33 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:43:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser m22sor1741881pgu.85 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:43:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser t2sor1733810pji.26 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:47:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser o24sor1957530pll.60 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:47:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u22sor1644015pfn.19 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:51:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser w6sor1581537pfu.40 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:51:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser k5sor1755815pjp.1 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d7sor1811729pgd.7 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:55:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser k6sor1767405pjm.26 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser f141sor1613842pfa.0 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T16:59:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser d2sor1762772pjl.12 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser z25sor1806113pgu.29 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:03:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser a193sor1606783pfa.78 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser u22sor1662057pfn.19 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:07:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser q6sor1617704pfu.64 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser c9sor2028005plo.23 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:11:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 70sor1624406pfv.34 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 1sor1808980pgy.81 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:15:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser e6sor285414pfj.86 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser o8sor2017600plk.56 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:19:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser 10sor1986117plb.52 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser g17sor1789543pju.16 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:23:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to ken@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser b68sor1652346pfb.77 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:27:00.000000"}, {"author": "623c13dfee1b5a0070293665", "body": "** Address not found **\n\nYour message wasn't delivered to jeremy.barlow@puppet.com because the address couldn't be found, or is unable to receive mail.\n\nLearn more here: https://support.google.com/mail/?p=NoSuchUser\n\nThe response was:\n\n550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/?p=NoSuchUser az12sor2041500plb.47 - gsmtp\n\n----- Message truncated -----", "created": "2020-12-16T17:27:00.000000"}, {"author": "70121:0dee9d30-e83c-4b75-8f90-47d9152f5fcd", "body": "I've been able to track down the issue, and it was related specifically to how the tests were being called from the clojure CLI (as opposed to leiningen). When removing extraneaous paths from the classpath, the tests now work fine.", "created": "2024-02-15T18:09:00.000000"}], "components": ["TrapperKeeper"], "created": "2020-12-15T12:18:00.000000", "creator": "5cf96166b7268e0e7bb41131", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3e827ef1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o05if4:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Dec/20"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_99985867400_*|*_6_*:*_1_*:*_0"}], "description": "While packaging TK 3.1.0 in Debian, I encountered a testsuite failure when using clj-time 0.15.2 as a dependency.\n\nYou have the version of this dependency pinned at 0.11.0, but this version is already 5 years old and 4 major releases behind what we have packaged in Debian at the moment (we have 0.15.2).\n\nThis is the stack trace I get:\n{code:java}\nlein test\nCompiling 1 source files to /<<PKGBUILDDIR>>/target/classeslein test puppetlabs.trapperkeeper.bootstrap-testlein test puppetlabs.trapperkeeper.config-testlein test puppetlabs.trapperkeeper.core-test\n2020-12-15 18:33:41,073 DEBUG [main] [p.t.logging] Debug logging enabled\n2020-12-15 18:33:41,076 DEBUG [main] [p.t.internal] Initializing lifecycle worker loop.\n2020-12-15 18:33:41,104 DEBUG [async-dispatch-1] [p.t.internal] Lifecycle worker executing :boot lifecycle task.\n2020-12-15 18:33:41,105 DEBUG [async-dispatch-1] [p.t.internal] Running lifecycle function 'init' for service ':ConfigService'\n2020-12-15 18:33:41,107 DEBUG [async-dispatch-1] [p.t.internal] Finished running lifecycle function 'init' for service ':ConfigService'\n2020-12-15 18:33:41,108 DEBUG [async-dispatch-1] [p.t.internal] Running lifecycle function 'init' for service ':ShutdownService'\n2020-12-15 18:33:41,108 DEBUG [async-dispatch-1] [p.t.internal] Finished running lifecycle function 'init' for service ':ShutdownService'\n2020-12-15 18:33:41,109 DEBUG [async-dispatch-1] [p.t.internal] Running lifecycle function 'start' for service ':ConfigService'\n2020-12-15 18:33:41,109 DEBUG [async-dispatch-1] [p.t.internal] Finished running lifecycle function 'start' for service ':ConfigService'\n2020-12-15 18:33:41,109 DEBUG [async-dispatch-1] [p.t.internal] Running lifecycle function 'start' for service ':ShutdownService'\n2020-12-15 18:33:41,110 DEBUG [async-dispatch-1] [p.t.internal] Finished running lifecycle function 'start' for service ':ShutdownService'\n2020-12-15 18:33:41,110 DEBUG [async-dispatch-1] [p.t.internal] Lifecycle worker completed :boot lifecycle task; awaiting next task.\n2020-12-15 18:33:41,111 INFO  [main] [p.t.internal] Beginning shutdown sequence\n2020-12-15 18:33:41,112 DEBUG [async-dispatch-3] [p.t.internal] Received shutdown command, shutting down services\n2020-12-15 18:33:41,112 DEBUG [async-dispatch-3] [p.t.internal] Clearing lifecycle worker channels for shutdown.\n2020-12-15 18:33:41,113 DEBUG [async-dispatch-3] [p.t.internal] Service shutdown complete, exiting lifecycle worker loop\n2020-12-15 18:33:41,113 INFO  [main] [p.t.internal] Finished shutdown sequencelein test puppetlabs.trapperkeeper.custom-exit-behavior-testlein test puppetlabs.trapperkeeper.examples.bootstrapping.test-serviceslein test puppetlabs.trapperkeeper.internal-testlein test puppetlabs.trapperkeeper.logging-testlein test puppetlabs.trapperkeeper.optional-deps-testlein test puppetlabs.trapperkeeper.plugins-testlein test :only puppetlabs.trapperkeeper.plugins-test/test-plugin-serviceERROR in (test-plugin-service) (plugins.clj:31)\nUncaught exception, not in assertion.\nexpected: nil\n  actual: java.lang.IllegalArgumentException: Class or namespace data_readers.clj found in both /<<PKGBUILDDIR>>/debian/maven-repo/org/flatland/ordered/debian/ordered-debian.jar and /<<PKGBUILDDIR>>/debian/maven-repo/clj-time/clj-time/debian/clj-time-debian.jar\n at puppetlabs.trapperkeeper.plugins$handle_duplicate_BANG_.invokeStatic (plugins.clj:31)\n    puppetlabs.trapperkeeper.plugins$handle_duplicate_BANG_.invoke (plugins.clj:24)\n    puppetlabs.trapperkeeper.plugins$process_file.invokeStatic (plugins.clj:48)\n    puppetlabs.trapperkeeper.plugins$process_file.invoke (plugins.clj:42)\n    clojure.core$partial$fn__5839.invoke (core.clj:2625)\n    clojure.core.protocols$fn__8159.invokeStatic (protocols.clj:168)\n    clojure.core.protocols/fn (protocols.clj:124)\n    clojure.core.protocols$fn__8114$G__8109__8123.invoke (protocols.clj:19)\n    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)\n    clojure.core.protocols$fn__8146.invokeStatic (protocols.clj:75)\n    clojure.core.protocols/fn (protocols.clj:75)\n    clojure.core.protocols$fn__8088$G__8083__8101.invoke (protocols.clj:13)\n    clojure.core$reduce.invokeStatic (core.clj:6828)\n    clojure.core$reduce.invoke (core.clj:6810)\n    puppetlabs.trapperkeeper.plugins$process_container.invokeStatic (plugins.clj:62)\n    puppetlabs.trapperkeeper.plugins$process_container.invoke (plugins.clj:52)\n    clojure.lang.ArraySeq.reduce (ArraySeq.java:116)\n    clojure.core.protocols$interface_or_naive_reduce.invokeStatic (protocols.clj:72)\n    clojure.core.protocols$fn__8159.invokeStatic (protocols.clj:169)\n    clojure.core.protocols/fn (protocols.clj:124)\n    clojure.core.protocols$fn__8114$G__8109__8123.invoke (protocols.clj:19)\n    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)\n    clojure.core.protocols$fn__8146.invokeStatic (protocols.clj:75)\n    clojure.core.protocols/fn (protocols.clj:75)\n    clojure.core.protocols$fn__8088$G__8083__8101.invoke (protocols.clj:13)\n    clojure.core$reduce.invokeStatic (core.clj:6828)\n    clojure.core$reduce.invoke (core.clj:6810)\n    puppetlabs.trapperkeeper.plugins$verify_no_duplicate_resources.invokeStatic (plugins.clj:89)\n    puppetlabs.trapperkeeper.plugins$verify_no_duplicate_resources.invoke (plugins.clj:75)\n    puppetlabs.trapperkeeper.plugins$add_plugin_jars_to_classpath_BANG_.invokeStatic (plugins.clj:99)\n    puppetlabs.trapperkeeper.plugins$add_plugin_jars_to_classpath_BANG_.invoke (plugins.clj:91)\n    puppetlabs.trapperkeeper.core$eval18891$boot_with_cli_data__18898$fn__18899.invoke (core.clj:128)\n    puppetlabs.trapperkeeper.core$eval18891$boot_with_cli_data__18898.invoke (core.clj:97)\n    puppetlabs.trapperkeeper.testutils.bootstrap$bootstrap_with_empty_config.invokeStatic (bootstrap.clj:76)\n    puppetlabs.trapperkeeper.testutils.bootstrap$bootstrap_with_empty_config.invoke (bootstrap.clj:69)\n    puppetlabs.trapperkeeper.plugins_test$fn__21917.invokeStatic (plugins_test.clj:39)\n    puppetlabs.trapperkeeper.plugins_test/fn (plugins_test.clj:37)\n    clojure.test$test_var$fn__9737.invoke (test.clj:717)\n    clojure.test$test_var.invokeStatic (test.clj:717)\n    clojure.test$test_var.invoke (test.clj:708)\n    clojure.test$test_vars$fn__9763$fn__9768.invoke (test.clj:735)\n    clojure.test$default_fixture.invokeStatic (test.clj:687)\n    clojure.test$default_fixture.invoke (test.clj:683)\n    clojure.test$test_vars$fn__9763.invoke (test.clj:735)\n    schema.test$validate_schemas$fn19426__19435$fn__19436.invoke (test.clj:11)\n    schema.test$validate_schemas$fn19426__19435.invoke (test.clj:11)\n    clojure.lang.AFn.applyToHelper (AFn.java:152)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:31)\n    clojure.lang.RestFn.invoke (RestFn.java:397)\n    schema.test$validate_schemas.invokeStatic (test.clj:11)\n    schema.test$validate_schemas.invoke (test.clj:6)\n    clojure.test$compose_fixtures$fn__9731$fn__9732.invoke (test.clj:694)\n    clojure.test$default_fixture.invokeStatic (test.clj:687)\n    clojure.test$default_fixture.invoke (test.clj:683)\n    clojure.test$compose_fixtures$fn__9731.invoke (test.clj:694)\n    clojure.test$test_vars.invokeStatic (test.clj:731)\n    clojure.test$test_all_vars.invokeStatic (test.clj:737)\n    clojure.test$test_ns.invokeStatic (test.clj:758)\n    clojure.test$test_ns.invoke (test.clj:743)\n    user$eval224$fn__285.invoke (form-init3506208461285429649.clj:1)\n    clojure.lang.AFn.applyToHelper (AFn.java:156)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.core$apply.invokeStatic (core.clj:667)\n    clojure.core$apply.invoke (core.clj:660)\n    leiningen.core.injected$compose_hooks$fn__154.doInvoke (form-init3506208461285429649.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:665)\n    clojure.core$apply.invoke (core.clj:660)\n    leiningen.core.injected$run_hooks.invokeStatic (form-init3506208461285429649.clj:1)\n    leiningen.core.injected$run_hooks.invoke (form-init3506208461285429649.clj:1)\n    leiningen.core.injected$prepare_for_hooks$fn__159$fn__160.doInvoke (form-init3506208461285429649.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:31)\n    clojure.lang.RestFn.invoke (RestFn.java:408)\n    clojure.core$map$fn__5866.invoke (core.clj:2755)\n    clojure.lang.LazySeq.sval (LazySeq.java:42)\n    clojure.lang.LazySeq.seq (LazySeq.java:51)\n    clojure.lang.Cons.next (Cons.java:39)\n    clojure.lang.RT.next (RT.java:713)\n    clojure.core$next__5386.invokeStatic (core.clj:64)\n    clojure.core$reduce1.invokeStatic (core.clj:944)\n    clojure.core$reduce1.invokeStatic (core.clj:934)\n    clojure.core$merge_with.invokeStatic (core.clj:3059)\n    clojure.core$merge_with.doInvoke (core.clj:3051)\n    clojure.lang.RestFn.applyTo (RestFn.java:139)\n    clojure.core$apply.invokeStatic (core.clj:667)\n    clojure.test$run_tests.invokeStatic (test.clj:768)\n    clojure.test$run_tests.doInvoke (test.clj:768)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:665)\n    clojure.core$apply.invoke (core.clj:660)\n    user$eval224$fn__297$fn__330.invoke (form-init3506208461285429649.clj:1)\n    user$eval224$fn__297$fn__298.invoke (form-init3506208461285429649.clj:1)\n    user$eval224$fn__297.invoke (form-init3506208461285429649.clj:1)\n    user$eval224.invokeStatic (form-init3506208461285429649.clj:1)\n    user$eval224.invoke (form-init3506208461285429649.clj:1)\n    clojure.lang.Compiler.eval (Compiler.java:7177)\n    clojure.lang.Compiler.eval (Compiler.java:7167)\n    clojure.lang.Compiler.load (Compiler.java:7636)\n    clojure.lang.Compiler.loadFile (Compiler.java:7574)\n    clojure.main$load_script.invokeStatic (main.clj:475)\n    clojure.main$init_opt.invokeStatic (main.clj:477)\n    clojure.main$init_opt.invoke (main.clj:477)\n    clojure.main$initialize.invokeStatic (main.clj:508)\n    clojure.main$null_opt.invokeStatic (main.clj:542)\n    clojure.main$null_opt.invoke (main.clj:539)\n    clojure.main$main.invokeStatic (main.clj:664)\n    clojure.main$main.doInvoke (main.clj:616)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.lang.Var.applyTo (Var.java:705)\n    clojure.main.main (main.java:40)lein test :only puppetlabs.trapperkeeper.plugins-test/test-no-duplicatesERROR in (test-no-duplicates) (plugins.clj:31)\nUncaught exception, not in assertion.\nexpected: nil\n  actual: java.lang.IllegalArgumentException: Class or namespace data_readers.clj found in both /<<PKGBUILDDIR>>/debian/maven-repo/org/flatland/ordered/debian/ordered-debian.jar and /<<PKGBUILDDIR>>/debian/maven-repo/clj-time/clj-time/debian/clj-time-debian.jar\n at puppetlabs.trapperkeeper.plugins$handle_duplicate_BANG_.invokeStatic (plugins.clj:31)\n    puppetlabs.trapperkeeper.plugins$handle_duplicate_BANG_.invoke (plugins.clj:24)\n    puppetlabs.trapperkeeper.plugins$process_file.invokeStatic (plugins.clj:48)\n    puppetlabs.trapperkeeper.plugins$process_file.invoke (plugins.clj:42)\n    clojure.core$partial$fn__5839.invoke (core.clj:2625)\n    clojure.core.protocols$fn__8159.invokeStatic (protocols.clj:168)\n    clojure.core.protocols/fn (protocols.clj:124)\n    clojure.core.protocols$fn__8114$G__8109__8123.invoke (protocols.clj:19)\n    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)\n    clojure.core.protocols$fn__8146.invokeStatic (protocols.clj:75)\n    clojure.core.protocols/fn (protocols.clj:75)\n    clojure.core.protocols$fn__8088$G__8083__8101.invoke (protocols.clj:13)\n    clojure.core$reduce.invokeStatic (core.clj:6828)\n    clojure.core$reduce.invoke (core.clj:6810)\n    puppetlabs.trapperkeeper.plugins$process_container.invokeStatic (plugins.clj:62)\n    puppetlabs.trapperkeeper.plugins$process_container.invoke (plugins.clj:52)\n    clojure.core.protocols$fn__8159.invokeStatic (protocols.clj:168)\n    clojure.core.protocols/fn (protocols.clj:124)\n    clojure.core.protocols$fn__8114$G__8109__8123.invoke (protocols.clj:19)\n    clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)\n    clojure.core.protocols$fn__8146.invokeStatic (protocols.clj:75)\n    clojure.core.protocols/fn (protocols.clj:75)\n    clojure.core.protocols$fn__8088$G__8083__8101.invoke (protocols.clj:13)\n    clojure.core$reduce.invokeStatic (core.clj:6828)\n    clojure.core$reduce.invoke (core.clj:6810)\n    puppetlabs.trapperkeeper.plugins$verify_no_duplicate_resources.invokeStatic (plugins.clj:89)\n    puppetlabs.trapperkeeper.plugins$verify_no_duplicate_resources.invoke (plugins.clj:75)\n    puppetlabs.trapperkeeper.plugins_test$fn__21910.invokeStatic (plugins_test.clj:27)\n    puppetlabs.trapperkeeper.plugins_test/fn (plugins_test.clj:24)\n    clojure.test$test_var$fn__9737.invoke (test.clj:717)\n    clojure.test$test_var.invokeStatic (test.clj:717)\n    clojure.test$test_var.invoke (test.clj:708)\n    clojure.test$test_vars$fn__9763$fn__9768.invoke (test.clj:735)\n    clojure.test$default_fixture.invokeStatic (test.clj:687)\n    clojure.test$default_fixture.invoke (test.clj:683)\n    clojure.test$test_vars$fn__9763.invoke (test.clj:735)\n    schema.test$validate_schemas$fn19426__19435$fn__19436.invoke (test.clj:11)\n    schema.test$validate_schemas$fn19426__19435.invoke (test.clj:11)\n    clojure.lang.AFn.applyToHelper (AFn.java:152)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:31)\n    clojure.lang.RestFn.invoke (RestFn.java:397)\n    schema.test$validate_schemas.invokeStatic (test.clj:11)\n    schema.test$validate_schemas.invoke (test.clj:6)\n    clojure.test$compose_fixtures$fn__9731$fn__9732.invoke (test.clj:694)\n    clojure.test$default_fixture.invokeStatic (test.clj:687)\n    clojure.test$default_fixture.invoke (test.clj:683)\n    clojure.test$compose_fixtures$fn__9731.invoke (test.clj:694)\n    clojure.test$test_vars.invokeStatic (test.clj:731)\n    clojure.test$test_all_vars.invokeStatic (test.clj:737)\n    clojure.test$test_ns.invokeStatic (test.clj:758)\n    clojure.test$test_ns.invoke (test.clj:743)\n    user$eval224$fn__285.invoke (form-init3506208461285429649.clj:1)\n    clojure.lang.AFn.applyToHelper (AFn.java:156)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.core$apply.invokeStatic (core.clj:667)\n    clojure.core$apply.invoke (core.clj:660)\n    leiningen.core.injected$compose_hooks$fn__154.doInvoke (form-init3506208461285429649.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:665)\n    clojure.core$apply.invoke (core.clj:660)\n    leiningen.core.injected$run_hooks.invokeStatic (form-init3506208461285429649.clj:1)\n    leiningen.core.injected$run_hooks.invoke (form-init3506208461285429649.clj:1)\n    leiningen.core.injected$prepare_for_hooks$fn__159$fn__160.doInvoke (form-init3506208461285429649.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:31)\n    clojure.lang.RestFn.invoke (RestFn.java:408)\n    clojure.core$map$fn__5866.invoke (core.clj:2755)\n    clojure.lang.LazySeq.sval (LazySeq.java:42)\n    clojure.lang.LazySeq.seq (LazySeq.java:51)\n    clojure.lang.Cons.next (Cons.java:39)\n    clojure.lang.RT.next (RT.java:713)\n    clojure.core$next__5386.invokeStatic (core.clj:64)\n    clojure.core$reduce1.invokeStatic (core.clj:944)\n    clojure.core$reduce1.invokeStatic (core.clj:934)\n    clojure.core$merge_with.invokeStatic (core.clj:3059)\n    clojure.core$merge_with.doInvoke (core.clj:3051)\n    clojure.lang.RestFn.applyTo (RestFn.java:139)\n    clojure.core$apply.invokeStatic (core.clj:667)\n    clojure.test$run_tests.invokeStatic (test.clj:768)\n    clojure.test$run_tests.doInvoke (test.clj:768)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:665)\n    clojure.core$apply.invoke (core.clj:660)\n    user$eval224$fn__297$fn__330.invoke (form-init3506208461285429649.clj:1)\n    user$eval224$fn__297$fn__298.invoke (form-init3506208461285429649.clj:1)\n    user$eval224$fn__297.invoke (form-init3506208461285429649.clj:1)\n    user$eval224.invokeStatic (form-init3506208461285429649.clj:1)\n    user$eval224.invoke (form-init3506208461285429649.clj:1)\n    clojure.lang.Compiler.eval (Compiler.java:7177)\n    clojure.lang.Compiler.eval (Compiler.java:7167)\n    clojure.lang.Compiler.load (Compiler.java:7636)\n    clojure.lang.Compiler.loadFile (Compiler.java:7574)\n    clojure.main$load_script.invokeStatic (main.clj:475)\n    clojure.main$init_opt.invokeStatic (main.clj:477)\n    clojure.main$init_opt.invoke (main.clj:477)\n    clojure.main$initialize.invokeStatic (main.clj:508)\n    clojure.main$null_opt.invokeStatic (main.clj:542)\n    clojure.main$null_opt.invoke (main.clj:539)\n    clojure.main$main.invokeStatic (main.clj:664)\n    clojure.main$main.doInvoke (main.clj:616)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.lang.Var.applyTo (Var.java:705)\n    clojure.main.main (main.java:40)lein test puppetlabs.trapperkeeper.services-internal-testlein test puppetlabs.trapperkeeper.services-namespaces-test.ns1lein test puppetlabs.trapperkeeper.services-namespaces-test.ns2lein test puppetlabs.trapperkeeper.services-testlein test puppetlabs.trapperkeeper.services.config.typesafe-testlein test puppetlabs.trapperkeeper.services.nrepl.nrepl-service-testlein test puppetlabs.trapperkeeper.services.nrepl.nrepl-test-send-middlewarelein test puppetlabs.trapperkeeper.shutdown-testlein test puppetlabs.trapperkeeper.testutils.bootstraplein test puppetlabs.trapperkeeper.testutils.logginglein test puppetlabs.trapperkeeper.testutils.logging-test\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :trace, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :trace, :message \"hapax legomenon\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :warn, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :trace, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :debug, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :info, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :error, :message \"foo\", :exception nil}\n** Log entry: {:logger \"puppetlabs.trapperkeeper.testutils.logging-test\", :level :debug, :message \"debug\", :exception nil}Ran 90 tests containing 370 assertions.\n0 failures, 2 errors.\nTests failed.\n{code}\nI believe this problem was cause in this commit:\n\n[https://github.com/clj-time/clj-time/commit/e5c9cce321e923464a3480ae04e4a43abdd4fc7e#diff-2028f1049a0197f33f6044f3209b38600955582ed47d5d6e6714bbe768e3fa1a]\n\nclj-time also added a file named \"src/data_readers.clj\", although it differs from the one ordered also has.\n\nI am able to reproduce this exact failure in an environment that should be closer to yours (we build Debian package offline using 100% debian-built packages, so it makes things a little convulted).\n\nYou can simply specify [clj-time \"0.15.2\"] in TK's project.clj, and run \"lein test\" and you should see the same error.\n\nHappy to help debug this more on my side if needed.\n\n\u00a0", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10466", "fixedVersions": [], "id": "10466", "issueType": "Bug", "key": "TK-493", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "5cf96166b7268e0e7bb41131", "resolution": "Cannot Reproduce", "resolutionDate": "2024-02-15T18:09:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "15/Feb/24 6:09 PM", "summary": "Testsuite failure using clj-time 0.15.2 as a dependency", "timeSpent": "PT0S", "updated": "2024-02-15T18:09:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Might want to break this out into smaller chunks, depending on how many projects are affected.", "created": "2020-09-01T16:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2020-08-31T12:13:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1d2d6e37"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-2864"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o0emad:z"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "01/Sep/20"}], "description": "Need to assess how many libraries have issues and then scope the work from there. Note that some changes in these dependencies might require changes in downstream components not owned by Froyo.\n\nTerms to look for: master whitelist blacklist\n\nIf the impact of this is very large it is acceptable to write up new tickets. Alternately if the changes are relatively easy we can just write the code needed as part of this ticket. ", "epicLinkSummary": "Froyo owned changes in terminology", "estimate": "PT0S", "externalId": "10637", "fixedVersions": [], "id": "10637", "issueType": "Improvement", "key": "TK-492", "labels": [], "originalEstimate": "PT0S", "parent": "14926", "parentSummary": "Froyo owned changes in terminology", "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "status": "Ready for Engineering", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update trapperkeeper ecosystem for term changes", "timeSpent": "PT0S", "updated": "2022-03-09T08:56:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2020-08-14T10:42:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@560ca3ee"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o03lig:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_759963898_*|*_1_*:*_1_*:*_1220541861_*|*_10007_*:*_1_*:*_274333948_*|*_5_*:*_1_*:*_0"}], "description": "The Java NIO subsystem uses buffers allocated in off-heap memory to manage certain types of I/O operations. We should expose the count and bytes used by these buffers in the default status output in order to enable detection of leaks or other problems with this area of memory usage:\n\n{code:bash}\ncurl -k 'https://localhost:8140/metrics/v2/read/java.nio:type=BufferPool,*/Count,MemoryUsed,TotalCapacity'\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10635", "fixedVersions": [], "id": "10635", "issueType": "Improvement", "key": "TK-491", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2020-09-09T13:02:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add BufferPool usage to default status output", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2020-08-14T10:08:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7c33baff"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o03li8:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_759958983_*|*_1_*:*_1_*:*_1214151125_*|*_10007_*:*_1_*:*_282755935_*|*_5_*:*_1_*:*_0"}], "description": "By default, TrapperKeeper-status returns overall usage statistics for heap and non-heap memory. Recently we've observed some performance issues that appear to be correlated with changes in non-heap memory usage. To dig further into these changes, it would be useful to include the output of the MemoryPool mbeans:\n\n{code:bash}\ncurl -k 'https://localhost:8140/metrics/v2/read/java.lang:type=MemoryPool,name=*/Usage,Type'\n{code}\n\nThis returns usage statistics for the pools that make up heap and non-heap memory. The information does not cover all sub-divisions of non-heap memory, but important areas like storage for Java classes and JIT compiled methods are covered.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10654", "fixedVersions": [], "id": "10654", "issueType": "Improvement", "key": "TK-490", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2020-09-09T13:02:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add MemoryPool usage to default status output", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2020-07-07T15:37:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6354b0f3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o02xfc:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Enhancement"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "The metrics routes are now covered by trapperkeeper-authorization, so access can be controlled from auth.conf (or the authorization section in general in the tk configuration). There is still a default embedded jolokia-access.xml which restricts access to localhost by ip which needs to be overridden by software intending to use tk-auth instead."}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_156394874_*|*_10007_*:*_1_*:*_45096_*|*_5_*:*_1_*:*_0"}], "description": "Add trapperkeeper-authorization support to trapperkeeper-metrics so that client access can be controlled and metrics can be shared securely.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10544", "fixedVersions": ["SERVER 6.12.1", "TK-METRICS 1.3.1"], "id": "10544", "issueType": "Improvement", "key": "TK-489", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Fixed", "resolutionDate": "2020-07-09T11:04:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add authorization support to trapperkeeper-metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "We will release this a little bit later together with some other tk-metrics changes.", "created": "2020-06-26T14:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2020-06-25T11:37:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4e41fe79"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Customer Feedback"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o02qgg:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Bug Fix"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "SEE PE-29464"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "42594"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jun/20"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_17789315_*|*_1_*:*_1_*:*_16828340_*|*_10007_*:*_1_*:*_61974572_*|*_5_*:*_1_*:*_0"}], "description": "{{trapperkeeper-metrics}} currently configures the Jolokia service with debug logging enabled by default:\n\nhttps://github.com/puppetlabs/trapperkeeper-metrics/blob/1.2.3/src/clj/puppetlabs/trapperkeeper/services/metrics/jolokia.clj#L38-L41\n\nHowever, this setting unfortunately does more than just providing access to DEBUG-level messages. It also causes some things to be logged at ERROR level, like backtraces for \"missing\" JMX items that should just result in a 404 message (SERVER-2826):\n\nhttps://github.com/rhuss/jolokia/blob/v1.6.2/agent/core/src/main/java/org/jolokia/http/HttpRequestHandler.java#L264-L266\n\nHaving Jolokia in debug mode by default gives access to information that can be useful, but logging stack traces for \"normal\" 404s means that information is coming at a cost of a drastically lowered signal-to-noise ratio in the logs.\n\nI can't recall an incident where we needed to debug Jolokia in the past couple years, so it's likely a good trade-off to just shut {{debug}} off by default and enable it in {{metrics.conf}} when needed.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10633", "fixedVersions": ["SERVER 6.12.1"], "id": "10633", "issueType": "Bug", "key": "TK-488", "labels": ["jira_escalated"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2020-06-26T14:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Disable Jolokia debug mode by default in trapperkeeper.metrics", "timeSpent": "PT0S", "updated": "2022-02-03T06:58:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "attachments": [], "comments": [{"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "There's a PR up for this (though still needs tests if we think it's acceptable): https://github.com/puppetlabs/trapperkeeper/pull/289", "created": "2021-12-14T10:47:00.000000"}], "components": ["TrapperKeeper"], "created": "2020-05-28T15:31:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6868ba0a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyk3fk:i0090bv1w3zr"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}], "description": "There's currently no way to request an immediate shutdown from an init or start method with a custom exit status and messages (instead of a backtrace) as now allowed by request-shutdown.\n\nConsider making that possible, perhaps by throwing an ex-info with the same map that request-shutdown expects.\n\n\u00a0", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10586", "fixedVersions": [], "id": "10586", "issueType": "Improvement", "key": "TK-487", "labels": ["I&M&H-OnDeck", "low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "status": "Ready for Review", "statusCategory": "In Progress", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow immediate exit with custom status/messages", "timeSpent": "PT0S", "updated": "2023-02-15T10:36:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2020-05-19T15:58:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@104059f8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o01z1c:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Deprecation"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "We have deprecated the v1 metrics endpoint, which was recently disabled by default. It will be removed entirely in a future release. Please use the v2 endpoint instead."}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_90256636_*|*_1_*:*_1_*:*_51954_*|*_10007_*:*_2_*:*_87040538_*|*_3_*:*_1_*:*_3226955_*|*_5_*:*_1_*:*_0"}], "description": "The v1 metrics endpoint from trapperkeeper-metrics has some security issues and was recently disabled by default. We want to remove it entirely in Puppet 7, so now it needs to be deprecated, so anyone who re-enables it will be warned that we are taking it away.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10543", "fixedVersions": ["SERVER 5.3.14", "SERVER 6.12.0"], "id": "10543", "issueType": "Task", "key": "TK-486", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2020-05-21T18:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Deprecate the v1 metrics endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2019-08-27T16:10:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@36512882"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyke4v:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Security Fix"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "We have updated the list of cipher suites allowed by default in Jetty to be even more restrictive. We have also defaulted to only accepting TLSv1.2. Users can configure Jetty to allow older TLS versions, which will also enable some weaker cipher suites for compatibility. See https://puppet.com/docs/pe/2019.1/enable_tlsv1.html"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_426721231_*|*_1_*:*_1_*:*_783449293_*|*_10007_*:*_1_*:*_166060126_*|*_3_*:*_1_*:*_2762822_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_326507095"}], "description": "tk-jetty9 should only allow:\n{code:java}\nTLS_DHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_DHE_RSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 {code}\nand \n{{TLSv1.2}} by default\n\n\nSee conversation around this comment:\nhttps://puppet.slack.com/archives/CF57S3RK9/p1566941432317400\n\n{quote} \njosh  @jpartlow I think we could/should drop SSL_CK_DES_192_EDE3_CBC_WITH_SHA due to use of 3DES. And TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA is not needed since we don't support/use DSS keys\n\njacob  We should probably consider dropping all of the _SHA suites (and only having the _SHA256 & _SHA384 versions), but that feels like a potentially big change, without taking the time to see exactly how that might affect supported clients.\nThough, the _SHA384 versions don't appear to have been available on the system. I'm getting those from one of the bigger list of ciphers I'm looking at.\n\njacob  Looks like we should also look at removing the *_CBC_* ciphers.\nI was looking in the wrong place when I didn't see the _SHA384 ones.\n\njacob  @justinstoller Went through the jetty9_allowed_ciphers list, and it looks like we should cut it down to this (remove all CBC, DH (but not DHE), and DSS):\nTLS_DHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_DHE_RSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\nCBC is generally being phased out in favor of GCM. DH doesn't provide perfect forward secrecy as DHE does, and DSS generally isn't used any more by pretty much anything.\n{quote}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10579", "fixedVersions": ["SERVER 6.6.0"], "id": "10579", "issueType": "Improvement", "key": "TK-484", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Done", "resolutionDate": "2019-09-16T09:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Further restrict valid cipher-suites", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2019-08-13T10:30:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6b76e1bd"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzwd0v:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_40533733129_*|*_6_*:*_1_*:*_0"}], "description": "The config loading tests test whether a config is loaded from the cwd. This was done previously by setting the \"user.dir\" system property to a directory in dev-resources. Setting the \"user.dir\" property is illegal in Java 11. The naive solution in [PR 285|https://github.com/puppetlabs/trapperkeeper/pull/285] was to simply move that file into the cwd during the duration of the test.\n\nIt would be much nicer to run the tests themselves in a temporary test directory that we can move files in and out of. [99ee409|https://github.com/puppetlabs/trapperkeeper/commit/99ee409d30960c68b94c037f1fe36cf7d06cd898] is a start to that. It creates a profile \"confined-tests\" that sets the \"user.dir\" to \"./target\", creates an alias \"confined-test\" that runs tests with that profile (the idea being we could update travis to run that alias). It also adds test helpers to get an absolute path to the tar. get dir (which is treated as our temporary testing dir) and to get absolute file paths to files in dev-resources.\n\nHowever, I've run into an issue with this:\n{code}\n09:27:56 sellout:trapperkeeper justin (rootedtests) \u2016 lein confined-test\nWarning: implicit hook found: i18n.plugin/hooks\nHooks are deprecated and will be removed in a future version.\nCompiling 1 source files to /Users/justin/Backup/code/work/trapperkeeper/target/classes\nlein test puppetlabs.trapperkeeper.config-test\nlein test :only puppetlabs.trapperkeeper.config-test/test-config-service\nERROR in (test-config-service) (FileSystems.java:176)\nUncaught exception, not in assertion.\nexpected: nil\n  actual: java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.FileSystems$DefaultFileSystemHolder\n at java.nio.file.FileSystems.getDefault (FileSystems.java:176)\n    java.io.File.toPath (File.java:2234)\n    me.raynes.fs$as_path.invokeStatic (fs.clj:171)\n    me.raynes.fs$as_path.invoke (fs.clj:167)\n    me.raynes.fs$directory_QMARK_.invokeStatic (fs.clj:210)\n    me.raynes.fs$directory_QMARK_.doInvoke (fs.clj:203)\n    clojure.lang.RestFn.invoke (RestFn.java:410)\n    puppetlabs.trapperkeeper.config$get_files_from_config.invokeStatic (config.clj:84)\n\n{code}\n\nWhich very well may be a configuration issue on my own machine, but I've run against the timebox I allotted for this work. Hence this ticket to revisit and hopefully improve the naive work around for not being able to set \"user.dir\" in Java 11.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10577", "fixedVersions": [], "id": "10577", "issueType": "Task", "key": "TK-483", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Won't Do", "resolutionDate": "2020-11-24T12:52:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Move tests to run within a temporary test directory", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "This will be in Lovejoy/latest tk project releases.", "created": "2019-08-08T16:08:00.000000"}], "components": ["TrapperKeeper"], "created": "2019-06-13T18:16:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6bb7eac1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzv4j3:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Aug/19"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4820629072_*|*_10007_*:*_1_*:*_10131725_*|*_5_*:*_1_*:*_0"}], "description": "The [upstream repository|https://github.com/circleci/clj-yaml] for TrapperKeeper's clj-yaml dependency is now archived and has the following message:\n\n{quote}\nThis respository was originally a fork of the original and is no longer being maintained. The project is now a part of clj-commons.\n{quote}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10541", "fixedVersions": [], "id": "10541", "issueType": "Improvement", "key": "TK-482", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2019-08-08T16:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Switch from circleci/clj-yaml to clj-commons/clj-yaml", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "The flatland error has been fixed.\n\nThe warnings will only be fixed once we start building (as well as running) with Java 11. So far there is no concrete plan to start doing this, because we still need to support Java 8 for some platforms (notably FIPS), and building with Java 8 allows us to run on both.", "created": "2019-09-24T18:05:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "From what I've seen so far, this warning is harmless from a functionality perspective --- but that isn't obvious from the error message. This has caused customers to dig into it during support cases, which causes it to be a distraction that leads away from the root cause of issues.\n\nWe should clean this up --- otherwise we're paying an ongoing price to identify and dismiss it and training ourselves and our users to ignore new warnings that appear in logs.", "created": "2020-04-07T09:54:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Sounds like we just need to update the {{puppetlabs/kitchensink}} library to use a newer version of {{org.tcrawley/dynapath}}. We're using 0.2.4 and the interaction with {{java.net.URLClassLoader}} was supposedly dropped in 1.0.0:\n\nhttps://github.com/tobias/dynapath/issues/10", "created": "2020-04-08T15:28:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "From SERVER-2421, it sounds like Dynapath 1.0 breaks the service reload for Puppet Server.", "created": "2020-04-09T10:00:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Marking this as closed given TK metrics has been functioning on Java 11 for more than a year now. The \"illegal reflective access\" warning is coming from deeper in the tech stack, is currently harmless, and is better tracked in SERVER-2761 and PE-29947.", "created": "2021-03-02T14:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2019-06-13T17:59:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2d6e6a20"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzv4in:"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "38249,38783,40560"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Sep/19"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_8899572933_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_45349861266"}], "description": "The testsuite for trapperkeeper-metrics currently has a couple of issues when run under Java 11. The first is that {{flatland/ordered}}, which is a transitive dependency of {{trapperkeeper}} via {{circleci/clj-yaml}} must be at version 1.5.7 or higher to resolve an overloaded method:\n\n{noformat}\n$ lein test\n...blah...\nException in thread \"main\" java.lang.IllegalArgumentException: Must hint overloaded method: toArray, compiling:(flatland/ordered/set.clj:19:1)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6875)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6669)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6625)\n\tat clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6001)\n\tat clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6319)\n...\n{noformat}\n\nOnce that is cleared up, there are some concerning warnings about Reflection that should be cleaned up:\n\n{noformat}\nWARNING: An illegal reflective access operation has occurred\nWARNING: Illegal reflective access by dynapath.defaults$eval27060$fn__27061 to method java.net.URLClassLoader.addURL(java.net.URL)\nWARNING: Please consider reporting this to the maintainers of dynapath.defaults$eval27060$fn__27061\nWARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\nWARNING: All illegal access operations will be denied in a future release\n\nlein test puppetlabs.metrics-test\n\nlein test puppetlabs.trapperkeeper.services.metrics.metrics-core-test\n\nlein test puppetlabs.trapperkeeper.services.metrics.metrics-service-test\n\nlein test puppetlabs.trapperkeeper.services.metrics.metrics-testutils\n\nRan 31 tests containing 326 assertions.\n0 failures, 0 errors.\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10319", "fixedVersions": [], "id": "10319", "issueType": "Improvement", "key": "TK-481", "labels": ["jira_escalated", "ondeck1"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2021-03-02T14:16:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add Java 11 support to trapperkeeper-metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "1", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2019-05-16T13:28:00.000000", "creator": "70121:b72c16a2-594d-45f8-90bc-c6bc6c9510a8", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b8cdac7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o00jwv:u"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_342402_*|*_10007_*:*_1_*:*_514307648_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_27724191186"}], "description": "Cider is the standard nrepl client in emacs. It relies on a set of nrepl middlewares to enable its full functionality.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10240", "fixedVersions": [], "id": "10240", "issueType": "Improvement", "key": "TK-480", "labels": ["skeletor-ci-maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:b72c16a2-594d-45f8-90bc-c6bc6c9510a8", "resolution": "Won't Fix", "resolutionDate": "2020-04-07T09:36:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "nrepl service should support cider middleware", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2019-01-15T10:48:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5efd635e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o0d1q7:w9"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_12898_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_18148836216_*|*_10005_*:*_1_*:*_80589013993"}], "description": "Consider restricting the schemes to say file:// and jar://, assuming we don't want to allow arbitrary network access here by default.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10540", "fixedVersions": [], "id": "10540", "issueType": "Story", "key": "TK-479", "labels": ["security"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Won't Do", "resolutionDate": "2022-03-03T05:59:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider restricting trapperkeeper's bootstrap URI schemes", "timeSpent": "PT0S", "updated": "2022-03-03T05:59:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2018-12-05T11:19:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "The ACL schema support an {{rbac}} map"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3380600a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzrijz:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_87276418_*|*_1_*:*_1_*:*_14619_*|*_10007_*:*_1_*:*_2866382658_*|*_3_*:*_1_*:*_177352893_*|*_5_*:*_1_*:*_0"}], "description": "Currently, the {{allow}} key of the auth.conf schema only allows {{certname}} or {{extensions}} keys. This needs to be extended to also support an {{rbac}} key that can take a permission string as a value.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10539", "fixedVersions": [], "id": "10539", "issueType": "Sub-task", "key": "TK-478", "labels": [], "originalEstimate": "PT0S", "parent": "10641", "parentSummary": "Handle RBAC rule in tk-auth", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2019-01-10T17:03:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for rbac rule to the ACL schema", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2018-11-27T16:51:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d9f39eb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyl2l3:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_77846467_*|*_1_*:*_1_*:*_15143_*|*_3_*:*_1_*:*_19916884_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_4301755599"}], "description": "We should have an acceptance-level test for RBAC rules in tk-auth. We should be sure to test at least:\n1) a token with the appropriate permission (allow)\n2) a token without permission (deny)\n3) a request without a token (deny)\n\nThis test should most likely go in pe-puppet-server-extension's test suite, since it is a PE-only feature of tk-auth, and doesn't require any special casing in RBAC. But we should double check this with the RBAC maintainers.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10442", "fixedVersions": [], "id": "10442", "issueType": "Task", "key": "TK-477", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2019-01-17T14:57:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Write acceptance test for RBAC tk-auth rule", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Three more things that need to happen here:\n1. Validate the permission string in auth.conf on server start, must be a string of format {{thing:thing:thing}}\n2. Surface rbac exceptions (like token-revoked or token-expired) as 403s, not 500s\n3. Disallow denying based on an rbac perm (this breaks rbac's mental model)", "created": "2018-12-17T16:28:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "-4. Fix the ACEValue to not misidentify RBAC rules as ExtensionRules-\n\nJust kidding, this isn't happening. The thing we pass in the {{:value}} field of an ACE for an {{:rbac}} type is just a string, the permission string. So this schema is already doing the right thing.", "created": "2018-12-18T13:03:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-11-27T16:45:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "* requests with tokens matching a rule with an RBAC permission defined are only allowed if the token has the specified permission(s)"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7c794330"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzrdjj:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_87269176_*|*_1_*:*_1_*:*_16591_*|*_10007_*:*_1_*:*_625739620_*|*_3_*:*_2_*:*_2228266542_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_861371271"}], "description": "If a request matches a rule that has a {{permissions}} key defined, and that request has a token, we need to query the RBAC server for whether that token has the specified permission. If it does, we allow the request. Otherwise, we deny it. In the case that more than one permission is specified, the token must have all the permissions.\n\nExample permissions rule:\n{code}\nallow: {\n               rbac: {\n                   permissions: [ \"cert_status:get:*\" ]\n               }\n            }\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10389", "fixedVersions": [], "id": "10389", "issueType": "Sub-task", "key": "TK-476", "labels": [], "originalEstimate": "PT0S", "parent": "10641", "parentSummary": "Handle RBAC rule in tk-auth", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2019-01-10T17:03:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Query RBAC server when a request with a token matches a rule with a permissions key", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "body": "[~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69] currently clj-rbac-client is a private repo.\u00a0 Are we going to need to open it up?\u00a0 I'm not sure there is a good reason to keep it private.", "created": "2018-11-29T16:19:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Yeah I just ran into that. So far no one has been able to think of a reason not to open-source it. If you're also of that opinion, we'll go ahead with that.", "created": "2018-11-29T17:25:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Yes, please open-source the repo. ", "created": "2018-11-30T10:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-11-27T16:36:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "* tk-auth pulls in clj-rbac-client as a dependency\n* the interface for making requests to the RBAC server is well defined and contained\n* the interface is tested using a mock RBAC setup"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7b425356"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzrdj3:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Nov/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_15682_*|*_10007_*:*_1_*:*_93316251_*|*_3_*:*_2_*:*_256465273_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_429872420"}], "description": "In order to make requests to the RBAC server, tk-auth needs to use the [RBAC client|https://github.com/puppetlabs/clj-rbac-client]. Although this is a PE only feature, since it can't be used with a functioning RBAC server, for now we are planning to integrate this directly into FOSS. We need to pull in this dependency and possibly write some wrapper functions inside tk-auth to pass along the appropriate information from the requests that come in and need to be processed via requests to RBAC.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10304", "fixedVersions": [], "id": "10304", "issueType": "Sub-task", "key": "TK-475", "labels": [], "originalEstimate": "PT0S", "parent": "10641", "parentSummary": "Handle RBAC rule in tk-auth", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2018-12-06T17:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Integrate clj-rbac-client into tk-auth", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Getting this update into clj-parent now, and from there into puppetserver/pe-pse.", "created": "2019-01-09T12:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-11-27T16:27:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "* auth.conf can contain a {{permissions}} key on a rule that triggers queries to the RBAC server when matched and the request contains an RBAC token\n* the request is allowed or denied based on the response from RBAC for the token in the request"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@24d69fed"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyl2kn:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_87262465_*|*_1_*:*_1_*:*_13991_*|*_10007_*:*_1_*:*_625732588_*|*_3_*:*_2_*:*_2592450319_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_498302169"}], "description": "We want to add a new form of authentication to tk-auth that allows the user to specify an RBAC permission for a tk-auth rule. This might look something like:\n\n{code}\n{\n            match-request: {\n                path: \"/puppet-ca/v1/certificate_status/\"\n                type: path\n                method: get\n            }\n            allow: {\n               rbac: {\n                   permissions: [ \"cert_status:get:*\" ]\n               }\n            }\n            sort-order: 500\n            name: \"puppetlabs cert status\"\n}\n{code}\n\nThe permission string will map to a permission known by the RBAC server and should follow our existing conventions for RBAC permission object shorthand. If a request comes in for this route with an RBAC token associated with it, tk-auth should ask the RBAC server whether that token has that permission, and only allow the request to go through if it does.\n\nThese permission rules should be an alternative to any cert-based rules for the endpoint: the request must either match the cert OR the permission, it is not required to fulfill both.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10641", "fixedVersions": [], "id": "10641", "issueType": "Story", "key": "TK-474", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "resolution": "Done", "resolutionDate": "2019-01-10T17:03:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Handle RBAC rule in tk-auth", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "[~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69] What version of TK should this have a Fix Version for?", "created": "2018-11-30T13:15:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Are we considering it a bug fix? If so, 2.3.1 I guess. Looks like we don't have any of the recent fix versions in JIRA, but I might be able to make one.", "created": "2018-11-30T14:08:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "Bumping clj-parent with the TK 2.3.1 version: https://github.com/puppetlabs/clj-parent/pull/146", "created": "2018-12-03T15:16:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "clj-parent 1.7.18 and 2.4.1 should pull in the updated trapperkeeper-webserver-jetty9 version 2.3.1.", "created": "2018-12-03T16:35:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "Components are being updated, pe-console-services and pe-orchestration services are currently up to date: http://pebuildinfo.slice.puppetlabs.net/component/puppetlabs/trapperkeeper-webserver-jetty9", "created": "2018-12-04T14:52:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "The updated pe-puppetdb should be promoted tomorrow.", "created": "2018-12-05T16:02:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "A pe-puppetdb promotion with the fixed Jetty9 dep has landed in 2018.1.x: http://pebuildinfo.slice.puppetlabs.net/component/puppetlabs/trapperkeeper-webserver-jetty9 . They still need to merge up those changes and promote to the later PE branches.", "created": "2018-12-07T14:36:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "Is this done?", "created": "2018-12-19T08:39:00.000000"}, {"author": "557058:613151bd-b161-4bc3-9e32-335fdcef4d89", "body": "It looks like pe-puppetdb on 2019.1.x is on 2.3.1, but we still need to bump 2019.0.x. I'll get that changed.", "created": "2018-12-19T09:44:00.000000"}, {"author": "557058:613151bd-b161-4bc3-9e32-335fdcef4d89", "body": "It hasn't been promoted yet, but puppetdb has been updated to contain tk-jetty9 2.3.1 where needed.", "created": "2018-12-20T15:44:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-11-27T12:18:00.000000", "creator": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "* Jetty/TK does not report what version it is in the HTTP headers of it's responses or error pages"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@f98e792"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzrddr:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Bug Fix"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "Jetty no longer reports its version. Its version was reported incorrectly before, to resolve this we've removed the version header. Not reporting the version is a security best practice."}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "33368"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Nov/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_3288406345_*|*_1_*:*_1_*:*_494801_*|*_10007_*:*_1_*:*_262064070_*|*_5_*:*_1_*:*_0"}], "description": "Security scanners detect when we report the Jetty server version as \"9.4.z-SNAPSHOT\" in their scans. This means that they will assume we are running a vulnerable 9.4 version that contains cve-2017-7658. Nick Lewis found that when we build TK as an uberjar, something about the environment confuses Jetty so that it no longer knows its build version and thus reports SNAPSHOT. We should disable reporting the server version entirely, as it isn't useful for debugging and just causes these sort of false-reports of security vulnerabilities.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10463", "fixedVersions": ["TK-JETTY9 2.3.1"], "id": "10463", "issueType": "Task", "key": "TK-473", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "resolution": "Fixed", "resolutionDate": "2019-01-07T14:41:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Stop reporting Jetty server version", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Turns out that the answer is to call .getFormattedMessage() on LoggingEvent objects instead of .getMessage.", "created": "2018-09-24T22:32:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-09-24T22:24:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1cc5da1d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzq34v:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_714594_*|*_10007_*:*_1_*:*_22620957109_*|*_6_*:*_1_*:*_0"}], "description": "TrapperKeeper provides a puppetlabs.trapperkeeper.testutils.logging namespace that has tools for capturing logs during tests and asserting that specific messages were produced. However, the event->map function in this namespace does not extract the full message from ch.qos.logback.classic.spi.LoggingEvent objects created from slf4j loggers. Specifically, if the message is parameterized, then the un-rendered template is captured instead of the full message.\n\nFor example, the following simple test case:\n\n{code:clojure}\n(ns logging-test\n  (require [clojure.test :refer :all]\n           [puppetlabs.trapperkeeper.testutils.logging :as logging])\n  (import (org.slf4j LoggerFactory)))\n\n(deftest match-slf4j-messsages\n  (testing \"captures parameterized slf4j messages\"\n    (logging/with-test-logging\n      (let [test-logger (LoggerFactory/getLogger \"tk-test\")]\n      (.info test-logger \"Log message: {}\" \"odelay\")\n      (is (logging/logged? #\"odelay\"))))))\n{code}\n\nFails:\n\n{noformat}\nlein test :only logging-test\n\nlein test logging-test\n\nlein test :only logging-test/match-slf4j-messsages\n\nFAIL in (match-slf4j-messsages) (logging_test.clj:11)\ncaptures parameterized slf4j messages\nexpected: (logging/logged? #\"odelay\")\n  actual: (not (logging/logged? #\"odelay\"))\n\nRan 1 tests containing 1 assertions.\n1 failures, 0 errors.\nTests failed.\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10311", "fixedVersions": ["TK  2.0.0"], "id": "10311", "issueType": "Bug", "key": "TK-471", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2019-06-13T18:12:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TrapperKeeper testutils.logging doesn't match parameterized slf4j messages", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "To implement this, we'd need to do two things:\n\n  - Subclass {{org.eclipse.jetty.server.handler.RequestLogHandler}} and add behavior to capture and clear the MDC after each request. The Jetty team has published [an example implementation|https://github.com/jetty-project/jetty-and-logback-example/blob/master/jetty-slf4j-mdc-handler/src/main/java/org/eclipse/jetty/examples/logging/MDCHandler.java] of this sort of handler.\n\n  - Implement {{ch.qos.logback.classic.pattern.MDCConverter}} from logback-classic for logback-access in order to provide {{%X}} and {{%mdc}} support for access logs.\n  ", "created": "2018-04-29T09:49:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "Awesome work, Charlie!", "created": "2018-08-24T14:03:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Shipped in version 2.3.0 of trapperkeeper-webserver-jetty9", "created": "2018-09-24T21:18:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-04-29T09:42:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5b1d4a47"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzlm0v:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "24/Aug/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_190908769_*|*_10007_*:*_1_*:*_9933526976_*|*_10009_*:*_1_*:*_2704540980_*|*_6_*:*_1_*:*_0"}], "description": "The SLF4J library implements a concept called the \"Mapped Diagnostic Context\" or MDC:\n\nhttps://logback.qos.ch/manual/mdc.html\n\nThe MDC is a thread-local hash map where info can be stored that is easily accessible to loggers using the {{%X}} or {{%mdc}} log patterns. The MDC is very useful for associating diagnostic data with HTTP requests, for example:\n\n  - JRuby processing time used to service a request.\n  - Items such as client certname or certificate attributes.\n\nh3. Desired Functionality\n\nThe TrapperKeeper Jetty server should manage the MDC such that:\n\n  - Any items placed into the MDC of a worker thread during a request are cleared at the end the request.\n\n  - A copy of the MDC is available to logback-access so that items may be logged using the {{%X}} and {{%mdc}} specifiers:  https://logback.qos.ch/manual/layouts.html#mdc", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10639", "fixedVersions": [], "id": "10639", "issueType": "Improvement", "key": "TK-470", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2018-09-24T21:18:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add Mapped Diagnostic Context support to Jetty servers", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "61af86343618cd006f430854", "body": "[~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69]\u00a0do the tests already exist? or is this ticket to brainstorm & implement said tests? this is a low-prio question fwiw", "created": "2021-12-06T13:15:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Yeah, we were thinking of using the existing clojure tests in the various repos, run as a Travis/GH Actions job in the clj-paren repo when a PR is opened. This would save 4 teams manually running those tests every time a dep is bumped. It would be a huge time saver, but requires just enough coordination (or one person/team's extended deep dive into everyone else's setups) that it's never been prioritized. This would be a great hack-day project, even if the result was just Froyo's tests being run automatically in this way. That would provide an example other teams might be able to copy.\n\n(this has long been a pet issue of mine, that I just never get around to actually doing anything with)", "created": "2021-12-06T13:56:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This might be of interest to the new PE team, as it would make the job of verifying dep updates _much_ easier. I don't think we should close it, it's hugely valuable, and with a consolidated team, it might actually be possible to pick an approach and just implement it.", "created": "2022-01-12T18:09:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-04-25T10:43:00.000000", "creator": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "clj-parent PRs have integration tests that test it with all of the major components that use it"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5ffd2cb6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-2117"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|o0e4ry:a"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/Dec/21"}], "description": "To help ensure all consumers can stay on the same version of clj-parent when dependencies get updated, we should add some sort of integration test to the clj-parent PR hooks, that tests it with each of the major projects that pull it in. If the update causes issues for any of them, the problem should be resolved before the update can be merged.\n\nThe thought for this arose after talking with [~accountid:70121:4c2994e4-73a9-4e99-971a-6d93d39be223] about some updates to clj-parent that could have implications for PuppetDB, forcing them to stay pinned to older version. Having a sane branching strategy for clj-parent would be easier if we also had good integration testing around changes.", "epicLinkSummary": "Improve Froyo Component CI", "estimate": "PT0S", "externalId": "10537", "fixedVersions": [], "id": "10537", "issueType": "Improvement", "key": "TK-469", "labels": [], "originalEstimate": "PT0S", "parent": "17104", "parentSummary": "Improve Froyo Component CI", "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "status": "Accepted", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Updates to clj-parent should pass integration tests against its major consumers", "timeSpent": "PT0S", "updated": "2022-03-09T08:54:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:6fc1f430-f771-4686-a97e-21c5e35f9100", "body": "Seems like the aggregate should be calculated by adding the processing time for each request to a single variable.  ", "created": "2018-04-12T17:34:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Noticed that this sort of \"aggregate\" pops up in other places, such as the Puppet Profiling section of Puppet server.\n\nAdding a sum to the Timers was opened as a feature request in the upstream metrics project:\n\nhttps://github.com/dropwizard/metrics/issues/712\n\nA pull request to add the functionality was merged, but is slated for 5.0 which is currently unreleased:\n\nhttps://github.com/dropwizard/metrics/pull/1022\n\nSeems like the best solution to this problem may be to take the 5.0 release when it comes out and swap {{aggregate}} over to using the timer sum.\n\nOr, if 5.0 takes ages to ship, backport the functionality to the {{trapperkeeper-metrics}} library and then drop it when 5.0 hits.", "created": "2018-04-26T09:47:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This still has not been released.", "created": "2019-09-26T09:35:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Annnnd, two years later, Dropwizard-Metrics 5.x is still just a release candidate. Might be time to consider switching to a different metrics engine --- especially one that will carry us forward to a Kubernetes world where everything is expected to speak Prometheus.\n\nhttps://micrometer.io/ looks promising.", "created": "2021-12-13T09:49:00.000000"}, {"author": "61af86343618cd006f430854", "body": "not high enough priority to staff", "created": "2022-01-26T11:17:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Re-opening this one as I just noticed we're using \"aggregate\" to sort metrics when returning the \"top n\" most expensive catalog compilation operations:\n\nhttps://github.com/puppetlabs/puppetserver/blob/7.9.4/src/clj/puppetlabs/services/puppet_profiler/puppet_profiler_core.clj#L104-L118\n\nI've always found these lists useful, but hard to interpret and reason about as they often did not line up with the context of a performance issue. Now the behavior makes sense.\n\nThe values these metrics are trying to display are critical to evaluating and advising customers on performance issues.", "created": "2023-02-06T10:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-04-11T18:38:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@af75e62"}, {"fieldName": "CS Business Value", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "3 - $$$$"}, {"fieldName": "CS Frequency", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - 5-25% of Customers"}, {"fieldName": "CS Impact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "When support is helping a customer troubleshoot performance issues the metrics available make it difficult to see outlier outside of the last 5 minutes. Ideally instead of the aggregate we would like to see what percentage of time is spent on what operations so that it's more clear what is the likely cause of the performance problem."}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "CS Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "3 - Serious"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Inspection"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzl8j3:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Apr/18"}], "description": "The trapperkeeper-comidi-metrics library reports three metrics for each HTTP route instrumented:\n\n  - count: A count of requests processed since service start.\n  - mean: The mean processing time for the last 5 minutes.\n  - aggregate: A number produced by multiplying the count and mean together.\n\nSince the count has a time scale of \"since service start\" and the mean has a time scale of \"last 5 minutes\", the product of the two is not a meaningful measurement of total time spent in a HTTP route for either time scale.\n\nhttps://github.com/puppetlabs/trapperkeeper-comidi-metrics/blob/master/src/puppetlabs/metrics/http.clj#L98", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10462", "fixedVersions": [], "id": "10462", "issueType": "Bug", "key": "TK-468", "labels": ["final_triage", "low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "status": "Open", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "\"aggregate\" HTTP metric reported by trapperkeeper-comidi-metrics is not a meaningful metric", "timeSpent": "PT0S", "updated": "2023-02-06T10:23:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Still happens with Puppet Server 6:\n\n{noformat}\n[root@pe-201911-master ~]# /opt/puppetlabs/server/bin/puppetserver --help\nusage: puppetserver ([--help] | [--version]) <command> [<args>]\n\nThe most commonly used puppetserver commands are:\n   ca\n   foreground\n   gem\n   irb\n   reload\n   ruby\n   start\n   stop\n\nSee 'puppetserver <command> -h' for more information on a specific command.\n\n[root@pe-201911-master ~]# /opt/puppetlabs/server/bin/puppetserver foreground -h\nOpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=96m", "created": "2019-09-26T12:35:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "There are some really... interesting coding choices that led to this. Should definitely be fixed, probably at the trapperkeeper level (the weird stuff is in kitchensink, but it's less invasive to just handle it in trapperkeeper).\n\nhttps://github.com/puppetlabs/clj-kitchensink/blob/master/src/puppetlabs/kitchensink/core.clj#L878 throws an \"exception\" with the help message, TK should probably just catch it and print it out https://github.com/puppetlabs/trapperkeeper/blob/master/src/puppetlabs/trapperkeeper/internal.clj#L177.", "created": "2019-10-01T17:59:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "[~accountid:70121:4c2994e4-73a9-4e99-971a-6d93d39be223] did your recent exit status work make this any better?", "created": "2020-03-12T14:30:00.000000"}, {"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "I suspect it may have -- I'll test.", "created": "2020-03-16T10:18:00.000000"}, {"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "Looks like it -- i.e. looks like moving to TK 3.1.0 should fix the problem.\n", "created": "2020-03-16T10:20:00.000000"}, {"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "Hmm, thought I'd add a fixversion, but TK 3.1.0 doesn't exist, and I may not have permission to add it.", "created": "2020-03-16T10:23:00.000000"}, {"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "Should be fixed in version 3.1.0.", "created": "2020-03-16T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-04-02T14:27:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4b57d22b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-2122"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzl14f:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "01/Oct/19"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_47272362564_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_2_*:*_14402636454"}], "description": "When the {{--help}} flag is Passed to the {{foreground}} command of a TrapperKeeper service, an error message is raised that contains a formatted help string. This is dumped unceremoniously to STDERR instead of being printed nicely to STDOUT.\n\nh2. Reproduction Case\n\n  - Install Puppet Server 5.3.0 on CentOS 7:\n\n{code:bash}\nrpm -Uvh http://yum.puppetlabs.com/puppet5/puppet5-release-el-7.noarch.rpm\nyum install -y puppetserver\n{code}\n\n  - Invoke {{puppetserver foreground}} with the {{--help}} flag:\n\n{code:bash}\n/opt/puppetlabs/server/bin/puppetserver foreground --help\n{code}\n\nh3. Outcome\n\nThe help text is barfed to STDERR as part of a stacktrace:\n\n{noformat}\n# /opt/puppetlabs/server/bin/puppetserver foreground --help\n\n20:24:12.129 [main] DEBUG puppetlabs.trapperkeeper.core - Finished TK main lifecycle, shutting down Clojure agent threads.\nException in thread \"main\" clojure.lang.ExceptionInfo: throw+: {:kind :puppetlabs.kitchensink.core/cli-help, :msg \"  -d, --debug                                   Turns on debug mode\\n  -b, --bootstrap-config BOOTSTRAP-CONFIG-FILE  Path to bootstrap config file\\n  -c, --config CONFIG-PATH                      Path to a configuration file or directory of configuration files, or a comma-separated list of such paths. See the documentation for a list of supported file types.\\n  -p, --plugins PLUGINS-DIRECTORY               Path to directory plugin .jars\\n  -r, --restart-file RESTART-FILE               Path to a file whose contents are incremented each time all of the configured services have been started.\\n  -h, --help                                    Show help\"} {:kind :puppetlabs.kitchensink.core/cli-help, :msg \"  -d, --debug                                   Turns on debug mode\\n  -b, --bootstrap-config BOOTSTRAP-CONFIG-FILE  Path to bootstrap config file\\n  -c, --config CONFIG-PATH                      Path to a configuration file or directory of configuration files, or a comma-separated list of such paths. See the documentation for a list of supported file types.\\n  -p, --plugins PLUGINS-DIRECTORY               Path to directory plugin .jars\\n  -r, --restart-file RESTART-FILE               Path to a file whose contents are incremented each time all of the configured services have been started.\\n  -h, --help                                    Show help\"}\n\tat slingshot.support$stack_trace.invoke(support.clj:201)\n\tat puppetlabs.kitchensink.core$cli_BANG_.invokeStatic(core.clj:878)\n\tat puppetlabs.kitchensink.core$cli_BANG_.invoke(core.clj:840)\n\tat puppetlabs.trapperkeeper.internal$eval13808$parse_cli_args_BANG___13813$fn__13814.invoke(internal.clj:179)\n\tat puppetlabs.trapperkeeper.internal$eval13808$parse_cli_args_BANG___13813.invoke(internal.clj:162)\n\tat puppetlabs.trapperkeeper.core$main.invokeStatic(core.clj:173)\n\tat puppetlabs.trapperkeeper.core$main.doInvoke(core.clj:160)\n\tat clojure.lang.RestFn.invoke(RestFn.java:551)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:186)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.core$apply.invokeStatic(core.clj:646)\n\tat clojure.core$apply.invoke(core.clj:641)\n\tat puppetlabs.trapperkeeper.main$_main.invokeStatic(main.clj:7)\n\tat puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:4)\n\tat clojure.lang.RestFn.invoke(RestFn.java:551)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:186)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.core$apply.invokeStatic(core.clj:646)\n\tat clojure.main$main_opt.invokeStatic(main.clj:314)\n\tat clojure.main$main_opt.invoke(main.clj:310)\n\tat clojure.main$main.invokeStatic(main.clj:421)\n\tat clojure.main$main.doInvoke(main.clj:384)\n\tat clojure.lang.RestFn.invoke(RestFn.java:703)\n\tat clojure.lang.Var.invoke(Var.java:442)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:205)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.main.main(main.java:37)\n{noformat}\n\nh3. Expected Outcome\n\nHelp should be printed to STDOUT, nicely formatted:\n\n{noformat}\n# /opt/puppetlabs/server/bin/puppetserver foreground --help 2>/dev/null\n\n  -d, --debug                                   Turns on debug mode\n  -b, --bootstrap-config BOOTSTRAP-CONFIG-FILE  Path to bootstrap config file\n  -c, --config CONFIG-PATH                      Path to a configuration file or directory of configuration files, or a comma-separated list of such paths. See the documentation for a list of supported file types.\n  -p, --plugins PLUGINS-DIRECTORY               Path to directory plugin .jars\n  -r, --restart-file RESTART-FILE               Path to a file whose contents are incremented each time all of the configured services have been started.\n  -h, --help                                    Show help\n{noformat}", "epicLinkSummary": "General Improvements", "estimate": "PT0S", "externalId": "10441", "fixedVersions": ["TK 3.1.0"], "id": "10441", "issueType": "Bug", "key": "TK-467", "labels": [], "originalEstimate": "PT0S", "parent": "15096", "parentSummary": "General Improvements", "priority": "Minor", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2020-03-16T10:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TrapperKeeper CLI entrypoint responds to --help by throwing an exception", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "PR opened.", "created": "2018-03-08T10:44:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "I'll get this released and into puppetserver. Does this need to go into an older branch of puppetserver than master? (If the answer is yes, we may have to branch clj-parent.)", "created": "2018-06-08T16:03:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "[~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69] From the fix version, this should have landed in 1.5.x, which means it should roll up into Puppet Server 5.5.x and PE 2018.1.\n\nThose versions are where we'll want it --- not being able to easily detect reloads from users and systemd scripts adds hours and days to debugging a class of service startup issues. Multiply that by the 2 year support horizon of PE 2018.1 and there is significant time savings to landing the change in that branch.", "created": "2018-06-08T16:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-03-01T10:12:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1f5a4b43"}, {"fieldName": "CS Business Value", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "4 - $$$$$"}, {"fieldName": "CS Frequency", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - 5-25% of Customers"}, {"fieldName": "CS Impact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "The impact to users of this isn't very high, but it could have a significant impact in reducing the time to resolution for support tickets which both saves support time, and also results in happier customers."}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "CS Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - Annoyance"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzkckn:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Mar/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_7882653757_*|*_1_*:*_1_*:*_606702621_*|*_10007_*:*_1_*:*_81380783_*|*_5_*:*_1_*:*_0"}], "description": "Consider the following log snippet:\n\n{noformat}:10:09,008 INFO  [qtp1612415802-116] [puppetserver] Puppet Compiled catalog for pe-201735-master.puppetdebug.vlan in environment production in 5.81 seconds:10:09,008 INFO  [qtp1612415802-116] [puppetserver] Puppet Caching catalog for pe-201735-master.puppetdebug.vlan:10:10,161 INFO  [qtp1612415802-116] [puppetserver] Puppet 'replace_catalog' command for pe-201735-master.puppetdebug.vlan submitted to PuppetDB with UUID 2ecc1018-9fc5-445c-bbfc-1fd072d5ce6f:10:26,782 INFO  [qtp1612415802-114] [puppetserver] Puppet 'store_report' command for pe-201735-master.puppetdebug.vlan submitted to PuppetDB with UUID 167f6b60-d04b-4b24-af42-aea53fda13bc:10:34,669 INFO  [async-dispatch-4] [p.s.j.jruby-metrics-service] JRuby Metrics Service: stopping metrics sampler job:10:34,671 INFO  [async-dispatch-4] [p.s.j.jruby-metrics-service] JRuby Metrics Service: stopped metrics sampler job:10:34,673 INFO  [async-dispatch-4] [p.s.j.i.jruby-agents] Draining JRuby pool.:10:34,675 INFO  [async-dispatch-4] [p.s.j.i.jruby-agents] Borrowed all JRuby instances, proceeding with cleanup.:10:34,698 INFO  [clojure-agent-send-pool-3] [p.s.j.i.jruby-internal] Cleaned up old JRubyInstance with id 1.:10:34,699 INFO  [clojure-agent-send-pool-3] [p.s.j.i.jruby-agents] Finished draining pool.\n{noformat}\n\nWhen exactly did Puppet Server handle a SIGHUP? It's not clear from the logs when the reload cycle was kicked off.\n\nWe do log a message at debug level when handling the {{HUP}} signal:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/1.5.5/src/puppetlabs/trapperkeeper/internal.clj#L305\n\nThis should be boosted to the default log level for Puppet, INFO.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10359", "fixedVersions": ["TK 1.5.6"], "id": "10359", "issueType": "Improvement", "key": "TK-466", "labels": ["cspapercuts"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2018-06-08T15:57:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TrapperKeeper apps should log a message at the default log level when reloaded", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Closing this out as I must have been under-caffienated when I filed it. The Graphite Reporter is part of puppetlabs.trapperkeeper.services.metrics.metrics-core", "created": "2018-09-24T21:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-02-16T08:49:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4a9fb533"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzk3fz:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_396272979_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_18654444437"}], "description": "Puppet Server has a great feature where it can be configured to ship selected metrics to graphite on a user-defined interval. However, this feature is currently specific to Puppet Server and users need to monitor an entire Puppet stack which includes PuppetDB and PE services. Because of this need to monitor multiple services, another tool often gets used for the job and the graphite reporter goes unused.\n\nWe should move this feature from Puppet Server to the trapperkeeper-metrics library so that it is universally available.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10536", "fixedVersions": [], "id": "10536", "issueType": "New Feature", "key": "TK-465", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Cannot Reproduce", "resolutionDate": "2018-09-24T21:41:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Move graphite reporter to TrapperKeeper metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "attachments": [], "comments": [{"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "Cause of issue: in recent versions of Bidi, the Pattern schema was updated: https://github.com/juxt/bidi/commit/ca14e6e629bb665db17cafada87752de174f33b3\n\nThis update changes SegmentedPattern such that empty lists will no longer be accepted. However, this code will regularly try to submit as an argument an empty list when it reaches the end of a sequential pattern: https://github.com/puppetlabs/comidi/blob/master/src/puppetlabs/comidi.clj#L173 (Note that this is a recursion and this function is defined for the second argument to use the Pattern schema from bidi).\n\nTo fix this, we need the sequential? clause here to not recurse if we're on the final segment of the pattern. In that case we need to just call update-in on route-info and return that.", "created": "2018-01-17T11:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2018-01-17T11:20:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2763f225"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzj97j:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Jan/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_22113100_*|*_1_*:*_1_*:*_271137_*|*_10007_*:*_1_*:*_83748521_*|*_3_*:*_1_*:*_1486312_*|*_5_*:*_1_*:*_86980175635_*|*_6_*:*_1_*:*_0"}], "description": "Updating comidi to 2.1.3 to try to address server-1954 revealed a problem with bidi 2.1.3 and comidi. Running the tests results in 7 errored tests that have stacktraces such as the following:\n\n{code}\nlein test :only puppetlabs.comidi-test/update-route-info-test\n\nERROR in (update-route-info-test) (comidi.clj:149)\nregex path element gets added to the path\nexpected: (= {:path [\"/foo/\" [\"REGEX: .*\" :foo]], :request-method :any} (-> (update-route-info* orig-route-info [\"/foo/\" [#\".*\" :foo]]) (update-in [:path] replace-regexes-for-equality-check)))\n  actual: clojure.lang.ExceptionInfo: Input to update-route-info* does not match schema: [nil (named (not (not-empty ())) pattern)]\n at puppetlabs.comidi$eval7129$update_route_info_STAR___7134.invoke (comidi.clj:149)\n    puppetlabs.comidi$eval7129$update_route_info_STAR___7134$fn__7135.invoke (comidi.clj:171)\n    puppetlabs.comidi$eval7129$update_route_info_STAR___7134.invoke (comidi.clj:149)\n    puppetlabs.comidi$eval7129$update_route_info_STAR___7134$fn__7135.invoke (comidi.clj:171)\n    puppetlabs.comidi$eval7129$update_route_info_STAR___7134.invoke (comidi.clj:149)\n    puppetlabs.comidi_test$fn__7494.invokeStatic (comidi_test.clj:57)\n    puppetlabs.comidi_test/fn (comidi_test.clj:22)\n    clojure.test$test_var$fn__7983.invoke (test.clj:716)\n    clojure.test$test_var.invokeStatic (test.clj:716)\n    clojure.test$test_var.invoke (test.clj:707)\n    clojure.test$test_vars$fn__8005$fn__8010.invoke (test.clj:734)\n    clojure.test$default_fixture.invokeStatic (test.clj:686)\n    clojure.test$default_fixture.invoke (test.clj:682)\n    clojure.test$test_vars$fn__8005.invoke (test.clj:734)\n    schema.test$validate_schemas$fn7457__7466$fn__7467.invoke (test.clj:11)\n    schema.test$validate_schemas$fn7457__7466.invoke (test.clj:11)\n    clojure.lang.AFn.applyToHelper (AFn.java:152)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)\n    clojure.lang.RestFn.invoke (RestFn.java:397)\n    schema.test$validate_schemas.invokeStatic (test.clj:11)\n    schema.test$validate_schemas.invoke (test.clj:6)\n    clojure.test$compose_fixtures$fn__7977$fn__7978.invoke (test.clj:693)\n    clojure.test$default_fixture.invokeStatic (test.clj:686)\n    clojure.test$default_fixture.invoke (test.clj:682)\n    clojure.test$compose_fixtures$fn__7977.invoke (test.clj:693)\n    clojure.test$test_vars.invokeStatic (test.clj:730)\n    clojure.test$test_all_vars.invokeStatic (test.clj:736)\n    clojure.test$test_ns.invokeStatic (test.clj:757)\n    clojure.test$test_ns.invoke (test.clj:742)\n    user$eval85$fn__136.invoke (form-init4146822488081439596.clj:1)\n    clojure.lang.AFn.applyToHelper (AFn.java:156)\n    clojure.lang.AFn.applyTo (AFn.java:144)\n    clojure.core$apply.invokeStatic (core.clj:648)\n    clojure.core$apply.invoke (core.clj:641)\n    leiningen.core.injected$compose_hooks$fn__19.doInvoke (form-init4146822488081439596.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:646)\n    clojure.core$apply.invoke (core.clj:641)\n    leiningen.core.injected$run_hooks.invokeStatic (form-init4146822488081439596.clj:1)\n    leiningen.core.injected$run_hooks.invoke (form-init4146822488081439596.clj:1)\n    leiningen.core.injected$prepare_for_hooks$fn__24$fn__25.doInvoke (form-init4146822488081439596.clj:1)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)\n    clojure.lang.RestFn.invoke (RestFn.java:408)\n    clojure.core$map$fn__4785.invoke (core.clj:2646)\n    clojure.lang.LazySeq.sval (LazySeq.java:40)\n    clojure.lang.LazySeq.seq (LazySeq.java:49)\n    clojure.lang.Cons.next (Cons.java:39)\n    clojure.lang.RT.boundedLength (RT.java:1749)\n    clojure.lang.RestFn.applyTo (RestFn.java:130)\n    clojure.core$apply.invokeStatic (core.clj:648)\n    clojure.test$run_tests.invokeStatic (test.clj:767)\n    clojure.test$run_tests.doInvoke (test.clj:767)\n    clojure.lang.RestFn.applyTo (RestFn.java:137)\n    clojure.core$apply.invokeStatic (core.clj:646)\n    clojure.core$apply.invoke (core.clj:641)\n    user$eval85$fn__148$fn__179.invoke (form-init4146822488081439596.clj:1)\n    user$eval85$fn__148$fn__149.invoke (form-init4146822488081439596.clj:1)\n    user$eval85$fn__148.invoke (form-init4146822488081439596.clj:1)\n    user$eval85.invokeStatic (form-init4146822488081439596.clj:1)\n    user$eval85.invoke (form-init4146822488081439596.clj:1)\n    clojure.lang.Compiler.eval (Compiler.java:6927)\n    clojure.lang.Compiler.eval (Compiler.java:6917)\n    clojure.lang.Compiler.load (Compiler.java:7379)\n    clojure.lang.Compiler.loadFile (Compiler.java:7317)\n    clojure.main$load_script.invokeStatic (main.clj:275)\n    clojure.main$init_opt.invokeStatic (main.clj:277)\n    clojure.main$init_opt.invoke (main.clj:277)\n    clojure.main$initialize.invokeStatic (main.clj:308)\n    clojure.main$null_opt.invokeStatic (main.clj:342)\n    clojure.main$null_opt.invoke (main.clj:339)\n    clojure.main$main.invokeStatic (main.clj:421)\n    clojure.main$main.doInvoke (main.clj:384)\n    clojure.lang.RestFn.invoke (RestFn.java:421)\n    clojure.lang.Var.invoke (Var.java:383)\n    clojure.lang.AFn.applyToHelper (AFn.java:156)\n    clojure.lang.Var.applyTo (Var.java:700)\n    clojure.main.main (main.java:37)\n{code}\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10535", "fixedVersions": [], "id": "10535", "issueType": "Bug", "key": "TK-464", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Fixed", "resolutionDate": "2018-01-18T17:14:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Comidi breaks with bidi > 2.1.0", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "This issue is potentially worsened by https://puppet.atlassian.net/browse/PUP-7744, since that can cause CRLs to be longer.", "created": "2017-12-07T12:55:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This can also be partially mitigated by enabling the [infrastructure CRL|https://puppet.com/docs/puppetserver/6.0/infrastructure_crl.html].", "created": "2018-10-29T17:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-12-07T12:55:00.000000", "creator": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4865d015"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyk48n:q0200000jr0lim"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "48185"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Oct/18"}], "description": "Seen in the field with PE. In trapperkeeper-webserver-jetty9 (and possibly other versions), it naively loads the full contents of the file provided by the :ssl-crl-path config option. If the file is huge and you don't have enough heap, it's OOM time.\n\nI think this is coming from https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/java/com/puppetlabs/trapperkeeper/services/webserver/jetty9/utils/InternalSslContextFactory.java. We see tons of sun.security.x509.X509CRLEntryImpl objects (retained by sun.security.x509.X509CRLImpl) in the heap dump from the one incident. I'm not sure whether this impacts the underlying Jetty SslContextFactory or not; but either way to we should try to get this to load the data more carefully.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10302", "fixedVersions": [], "id": "10302", "issueType": "Bug", "key": "TK-463", "labels": ["jira_escalated", "reliability", "ssl"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "status": "Accepted", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "[TK-Jetty] Large CRLs can cause OOM", "timeSpent": "PT0S", "updated": "2022-04-27T13:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I would recommend doing the {{!prs}} work (TK-461) first for goalie-ing additional incoming PRs. The tk-status (TK-458) and tk-jetty9 (TK-459) should be ready to release and give someone some time to research what those projects do. Prior to promoting those changes into pe-puppet-server-extensions someone should update the travis script within it (PE-22975). The SERVER-2025 can be picked up anywhere in there and would be a great chance to review some actual clojure code (rather than the machinery around maintaining the code bases).\n\nI didn't add them here, but the search below has 7 tickets, almost all of them require small changes to error handling, configuration validation, or lifecycle messaging, mainly with tk-jetty9, but also with tk-scheduler. They are low hanging but low priority work that the person who takes this Epic on should feel free to work on as many of them as they want.\n\nhttps://puppet.atlassian.net/issues/?jql=project%20%3D%20tk%20and%20labels%20in%20(low-hanging-fruit)%20and%20status%20!%3D%20Closed", "created": "2017-11-27T23:07:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I'm going to also throw random clojure/tk library works that come in into these comments, if we decide to go with them we can ticket them up:\n\nhttps://github.com/puppetlabs/ring-middleware/issues/46\nhttps://github.com/puppetlabs/pe-trapperkeeper-metrics/pull/24\nhttps://github.com/puppetlabs/clj-typesafe-config/pull/16\nThis ticket may need documentation work, depending on if someone can work through it with poster: SERVER-2019", "created": "2017-11-28T11:25:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "The linked github issues/pulls were either resolved prior to taking on this epic (the prs) or only included talking through the issue with the community member (the issue).", "created": "2018-01-12T15:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-11-22T16:35:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Platform Core"}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "A new person to the team, by the end of this epic should understand\n* Kerminator commands and their role in triaging PRs\n* The role tk-jetty9, tk-status, and tk-metrics play within Puppet Server and other clojure projects\n* JMX\n* How clojure libraries are released\n* How Puppet Server and clojure libraries are promoted into PE\n\nIf the additional work linked in the comments is taken on they should also understand:\n* The role tk-scheduler plays within Server\n* The runtime lifecycle of TK services\n* Clojure protocols and the protocols for tk-scheduler and tk-jetty9 \n* Exception handling within Clojure and Java interop"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@70afe1e6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Color", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-color", "value": "ghx-label-1"}, {"fieldName": "Epic Name", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-label", "value": "TK Eco Maint"}, {"fieldName": "Epic Status", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-status", "value": "Done"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Issue color", "fieldType": "com.pyxis.greenhopper.jira:jsw-issue-color", "value": "dark_grey"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hytdbr:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_455563050_*|*_6_*:*_1_*:*_0_*|*_10015_*:*_1_*:*_3947307846_*|*_10014_*:*_1_*:*_2187426565"}], "description": "This ticket includes some general maintenance work that members of the Puppet clojure community often do as side work. It primarily includes general housekeeping \"keeping the lights on\" work, but should be a good introduction to several of our clojure projects. Whoever takes on this work should feel free to spend some time learning what the projects they update do and how they relate to our products.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10440", "fixedVersions": [], "id": "10440", "issueType": "Epic", "key": "TK-462", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Fixed", "resolutionDate": "2018-02-06T23:13:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Clojure ecosystem maintenance onboarding", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2017-11-22T16:04:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@35a0734c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-462"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzicif:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_439579107_*|*_5_*:*_1_*:*_87768490860_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_3683787961_*|*_10005_*:*_1_*:*_18427203"}], "description": "Familiarize yourself with Kerminator and the {{!prs}} commands (try \"!help prs\" in chat or open a one on one with Kerminator and try the commands without the preceding \"!\").\n\nCreate a \"team\" for core\n\nAdd to it the repos listed on this page: https://confluence.puppetlabs.com/display/ENG/Puppet+Server+Team+Repositories\n\n", "epicLinkSummary": "Clojure ecosystem maintenance onboarding", "estimate": "PT0S", "externalId": "10383", "fixedVersions": [], "id": "10383", "issueType": "Task", "key": "TK-461", "labels": [], "originalEstimate": "PT0S", "parent": "10440", "parentSummary": "Clojure ecosystem maintenance onboarding", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Done", "resolutionDate": "2020-10-21T11:42:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create !prs team with relevant repos for platform core team", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "This was merged and shipped as part of trapperkeeper-status 1.0.0.", "created": "2018-04-08T09:56:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-11-07T12:13:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b6ce644"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzi20f:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_818141_*|*_10007_*:*_1_*:*_13120183649_*|*_6_*:*_1_*:*_0"}], "description": "The {{java.lang.Threading}} MBean exposes a ThreadCount and PeakThreadCount that can be used to detect spikes in the number of threads spawned by a JVM. We should expose these as part of the defualt metrics returned by trapperkeeper-status.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10357", "fixedVersions": [], "id": "10357", "issueType": "Improvement", "key": "TK-460", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2018-04-08T09:56:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add thread count to metrics returned by status service", "timeSpent": "PT0S", "updated": "2022-02-03T06:58:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "This went into puppetserver#master rather than 5.1.x as part of the clj-parent 1.6.0 release", "created": "2018-01-12T15:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-11-07T12:06:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@26a4af61"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-462"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hylmrj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_514325158_*|*_1_*:*_1_*:*_3804038_*|*_10007_*:*_1_*:*_248984106_*|*_3_*:*_1_*:*_13550200_*|*_5_*:*_1_*:*_86991412410_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_5448471476"}], "description": "This ticket will involve:\n* Merge the release prep PR (https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/188),\n* Do a release (jenkins automation)\n* Take up the release into puppetlabs/clj-parent\n* Update puppetserver#5.1.x -> pe-puppet-server-extensions#hoyt -> pe-puppetserver#hoyt\n* Merge 5.1.x up to master and hoyt branches up to irving\n\nWe can, and should, double up the work for releasing clj-parent and later with the work for uptaking tk-status in https://puppet.atlassian.net/browse/TK-458\n\nHere's the release automation: https://cinext-jenkinsmaster-enterprise-prod-1.delivery.puppetlabs.net/view/clojure-libraries/view/trapperkeeper-webserver-jetty9/job/enterprise_trapperkeeper-webserver-jetty9_release-clj_master/", "epicLinkSummary": "Clojure ecosystem maintenance onboarding", "estimate": "PT0S", "externalId": "10439", "fixedVersions": [], "id": "10439", "issueType": "Task", "key": "TK-459", "labels": [], "originalEstimate": "PT0S", "parent": "10440", "parentSummary": "Clojure ecosystem maintenance onboarding", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Done", "resolutionDate": "2020-10-21T11:42:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Release new version of trapperkeeper-webserver-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "Since this included new status info it went into puppetserver#master instead of 5.1.x. (as part of clj-parent 1.6.0)", "created": "2018-01-12T15:32:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-11-07T12:06:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5aaab13d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-462"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hylmrb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_514388468_*|*_1_*:*_1_*:*_3842683_*|*_10007_*:*_1_*:*_248938576_*|*_3_*:*_1_*:*_11260954_*|*_5_*:*_1_*:*_86991396122_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_5450751299"}], "description": "This ticket will involve:\n* Merge the work in: https://github.com/puppetlabs/trapperkeeper-status/pull/83\n* Do release prep (update version to be 2.0.0-SNAPSHOT in project.clj, update changelog)\n* Do a release (jenkins automation)\n* Take up the release into puppetlabs/clj-parent\n* Update puppetserver#5.1.x -> pe-puppet-server-extensions#hoyt -> pe-puppetserver#hoyt\n* Merge 5.1.x up to master and hoyt branches up to irving\n\nWe can, and should, double up the work for releasing clj-parent and later with the work for uptaking tk-ws-jetty9 in https://puppet.atlassian.net/browse/TK-459\n\nHere's the release automation job for this project: https://cinext-jenkinsmaster-enterprise-prod-1.delivery.puppetlabs.net/view/clojure-libraries/view/all/job/enterprise_trapperkeeper-status_release-clj_master/", "epicLinkSummary": "Clojure ecosystem maintenance onboarding", "estimate": "PT0S", "externalId": "10534", "fixedVersions": [], "id": "10534", "issueType": "Task", "key": "TK-458", "labels": [], "originalEstimate": "PT0S", "parent": "10440", "parentSummary": "Clojure ecosystem maintenance onboarding", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Done", "resolutionDate": "2020-10-21T11:42:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Release new version of trapperkeeper-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2017-10-30T16:30:00.000000", "creator": "557058:5aed1ed3-f3b3-4dd3-bebb-5b3bf9907bc5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5ee6c30d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzhvn3:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Nov/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1398702157_*|*_6_*:*_1_*:*_0"}], "description": "This ticket is just to verify that the Create Ticket link in https://confluence.puppetlabs.com/display/ENG/Maintenance is up to date. [http://24.media.tumblr.com/tumblr_m32m03lv8J1qivhiio1_400.gif] and close this ticket as proof that it made it to the correct triage board!", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10533", "fixedVersions": [], "id": "10533", "issueType": "Bug", "key": "TK-457", "labels": ["cs_pr_review"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:5aed1ed3-f3b3-4dd3-bebb-5b3bf9907bc5", "resolution": "Fixed", "resolutionDate": "2017-11-15T20:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Triage Test", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "The whole scheduler service has been rewritten since this ticket was filed. If this is still a problem, feel free to reopen.", "created": "2019-09-26T17:26:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Took a look at the latest trapperkeeper-scheduler tag and it looks like we're still throwing a generic \"scheduled job threw error\" message:\n\nhttps://github.com/puppetlabs/trapperkeeper-scheduler/blob/1.1.2/src/puppetlabs/trapperkeeper/services/scheduler/job.clj#L65\n\nJobs should have an identifier that the error message includes.", "created": "2019-09-27T09:46:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Another example came up in chat today from {{pe-puppetserver}} in a PE 2019.5 install:\n\n{noformat}\n2020-04-30T15:09:15.442+02:00 ERROR [5bfe2010-d419-43a6-86af-1964b2e49e67_Worker-3] [p.t.s.s.job] scheduled job threw error\njava.lang.NullPointerException: null\n        at puppetlabs.trapperkeeper.services.scheduler.job$_execute.invokeStatic(job.clj:46)\n        at puppetlabs.trapperkeeper.services.scheduler.job$_execute.invoke(job.clj:37)\n        at puppetlabs.trapperkeeper.services.scheduler.job.execute(Unknown Source)\n        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)\n        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)\n2020-04-30T15:09:15.443+02:00 INFO  [5bfe2010-d419-43a6-86af-1964b2e49e67_Worker-3] [o.q.c.JobRunShell] Job SCHEDULER_DEFAULT.1afc9c94c570-213c0297-8aeb-40bb-9b5e-fe71ba821a25 threw a JobExecutionException:\norg.quartz.JobExecutionException: java.lang.NullPointerException\n        at puppetlabs.trapperkeeper.services.scheduler.job$_execute.invokeStatic(job.clj:65)\n        at puppetlabs.trapperkeeper.services.scheduler.job$_execute.invoke(job.clj:37)\n        at puppetlabs.trapperkeeper.services.scheduler.job.execute(Unknown Source)\n        at org.quartz.core.JobRunShell.run(JobRunShell.java:202)\n        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)\nCaused by: java.lang.NullPointerException: null\n        at puppetlabs.trapperkeeper.services.scheduler.job$_execute.invokeStatic(job.clj:46)\n        ... 4 common frames omitted\n{noformat}\n\nWithout an identifier, there is no way to tell what failed. Without a stack traces from the job its self instead of the scheduler, there's no way to tell where the problem occurred.", "created": "2020-05-01T09:37:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "We might be able to get more from the exception handler here : https://github.com/puppetlabs/trapperkeeper-scheduler/blob/master/src/puppetlabs/trapperkeeper/services/scheduler/job.clj#L65", "created": "2020-05-01T11:04:00.000000"}, {"author": "557058:55b23daa-f1aa-41fd-b10d-bf49a61932da", "body": "We're thinking that this PR should resolve this issue: https://github.com/puppetlabs/pe-puppet-server-extensions/pull/1223", "created": "2020-11-22T14:13:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "That PR looks like it resolves a specific instance of analytics submission failing.\n\nHowever, what we really need from error handling in this area is the ability to tell which job threw an error. This will allow us to determine if analyitics failed, or if some other consumer of the TK Scheduler had an issue.\n\nIt's good that we've fixed a specific instance of this, but without better error handling we will still be just as blind the next time it pops up.", "created": "2020-12-02T12:25:00.000000"}, {"author": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "body": "I believe the library will do an adequate job of logging the location when there is actually some code for it to execute.  In this particular circumstance since there was no function available to execute, it didn't produce anything in the stack output.\n\nAre there other exceptions that you are aware of that aren't null ptr exceptions where the call is ambiguous?", "created": "2020-12-02T14:01:00.000000"}, {"author": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] my apologies, I didn't realize the PR mentioned wasn't the tk-scheduler repo.  This is the commit I added to it which found the underlying problem Molly linked.  https://github.com/puppetlabs/trapperkeeper-scheduler/commit/308b24e31185c055c2302ddb607936fcf8d1f9f3  I believe it is the root cause of the lack of information in the scheduled execution.", "created": "2020-12-02T14:24:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Aha! That looks like it will give us a stack trace to the code that tried to submit an invalid job --- which should make it easy to identify future occurrences of this issue.", "created": "2020-12-02T14:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-10-20T16:37:00.000000", "creator": "557058:de0e2f80-1ec2-47f2-8b6b-f1c0efbde320", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@43486122"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzhlm7:"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "41398"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Sep/19"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_61001342470_*|*_4_*:*_1_*:*_1262488_*|*_6_*:*_2_*:*_58738494_*|*_10005_*:*_1_*:*_69218767215"}], "description": "When a scheduled job crashes it logs \"scheduled job threw error \njava.lang.NullPointerException: null\", which doesn't help to identify what job failed or how to get more information about it.\n\nFor example, here's what we currently display:\n\n{code}\n2017-10-20 12:09:17,351 ERROR [pool-2-thread-2] [p.t.s.s.scheduler-core] scheduled job threw error \njava.lang.NullPointerException: null \nat puppetlabs.trapperkeeper.services.scheduler.scheduler_core$wrap_with_error_logging$fn__46332.invoke(scheduler_core.clj:16) \nat clojure.lang.AFn.run(AFn.java:22) \nat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) \nat java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) \nat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) \nat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) \nat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) \nat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) \nat java.lang.Thread.run(Thread.java:748) \n{code}\n\nIt would be nice to include some detail about the job that failed, such as its name or function - any additional information would improve troubleshooting around this area.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10355", "fixedVersions": [], "id": "10355", "issueType": "Improvement", "key": "TK-456", "labels": ["jira_escalated", "low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:de0e2f80-1ec2-47f2-8b6b-f1c0efbde320", "resolution": "Fixed", "resolutionDate": "2021-12-06T12:32:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Scheduler Service: Log more information when a job errors out", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "1", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "There's two ways we could do this, either releasing a new version 0.6.1 that includes just this improvement backported, or just bumping the version of tk-status from 0.6.0 to 0.7.0 (the version that contains the fix requested). Based the [diff between them|https://github.com/puppetlabs/trapperkeeper-status/compare/0.6.0...0.7.0] I'd vote to go with the cherry-pick of just the ticket work into a 0.6.x branch.\n\nThere may be some conflicts between internationalized strings vs non-internationalized strings in cherry-picking but I don't think there's any major implications (there is already internationalized messages within tk-status 0.6).\n\nI also think anyone can take this as its a relatively small, clean, and contained amount of work.\n\n", "created": "2017-10-09T15:49:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "merged to tk-status/0.6.x at https://github.com/puppetlabs/trapperkeeper-status/commit/26934c20e67d16e071e38c32aae62f72a39c3eef", "created": "2017-10-16T11:11:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "PR to ci-job-configs for CI additions merged to master at https://github.com/puppetlabs/ci-job-configs/commit/274a4f9748a5744d6f740c5320a5ecee6dcce405", "created": "2017-10-16T17:52:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "pe-puppetserver pr to bump pe-file-sync merged to 2016.4.x at https://github.com/puppetlabs/pe-puppetserver/commit/e88b04a40a442b2e8c203d12c2413340436e5fe1\n\n", "created": "2017-10-24T12:14:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "pe-pepse pr to update tk-status and pe-file-sync merged to 2016.4.x at https://github.com/puppetlabs/pe-puppet-server-extensions/commit/b1f04fd52b10cf909c204ba0981988bb105fa63d", "created": "2017-10-24T12:15:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-10-05T13:48:00.000000", "creator": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@752fc18f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzh94n:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Oct/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_788742005_*|*_1_*:*_1_*:*_679520898_*|*_10007_*:*_1_*:*_261440315_*|*_5_*:*_1_*:*_0"}], "description": "This brings https://puppet.atlassian.net/browse/TK-401 into the LTS line.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10638", "fixedVersions": [], "id": "10638", "issueType": "Improvement", "key": "TK-455", "labels": ["lts-exception"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "resolution": "Fixed", "resolutionDate": "2017-10-25T14:17:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bring Status Service improvement into LTS", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "This went out in {{trapperkeeper-status}} 1.0.0.", "created": "2018-03-01T09:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-10-02T10:11:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72bb42b3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzh5hr:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_610790947_*|*_10007_*:*_1_*:*_12351271664_*|*_6_*:*_1_*:*_0"}], "description": "During a recent performance issue, increased GC activity was a key marker of the problem. In order to capture this info easily, we should add the following JMX metrics to the set of measurements returned by the status service at DEBUG level by collecting the {{LastGcInfo}} attribute from the following mbeans:\n\n{code}\njava.lang:name=*,type=GarbageCollector\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10460", "fixedVersions": [], "id": "10460", "issueType": "Improvement", "key": "TK-454", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2018-03-01T09:45:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add LastGcInfo to metrics returned by the status service", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:1381f112-1c4e-4869-ba34-30602d945124", "attachments": [], "comments": [{"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "The priority is low, but the upside is high if we decide that this needs blocks shipping AOT'd uberjars (which would halve the startup times of all of our PE services).", "created": "2017-09-09T04:04:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Dan - assigning back to you since nobody in triage knows what the expected action should be here. What change do you want to make? ", "created": "2017-09-11T15:13:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "I don't know what change I want to make, since the problem is not understood. The first step is to figure out why this happens with TrapperKeeper service definitions (and seemingly *only* with them) when AOT'd & non-AOT'd namespaces are mixed. Only then can we begin to figure out what the solution should be.", "created": "2017-09-11T15:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-09-08T18:24:00.000000", "creator": "557058:1381f112-1c4e-4869-ba34-30602d945124", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f6763c0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzgkef:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Sep/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_247720092_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_141596254097"}], "description": "When I AOT-compile code that includes TK service definitions and then bring the jar with the AOT'd code in as a dependency to a project where those TK services were defined -- so the namespace exists both in AOT form in the jar, and in source form in the project's source directories -- I get an error when I try to compile the namespace:\n\n{code}\nException in thread \"main\" java.lang.RuntimeException: Unable to resolve symbol: orchestrator-dispatch-service in this context, compiling:(puppetlabs/orchestrator/dispatch.clj:542:1)\n{code}\n\nThis is a little bizarre to me because the defservice form that should define that symbol is *right there*, but when I try to evaluate the form, I get that error. I don't understand why. I can macro-expand it.\n\n[~accountid:63d4062f69c7ae3958d276ed] has described getting the same error in a different situation with a jar containing AOT'd code. In his case, he has an uberjar with all the namespaces listed in the bootstrap.cfg AOT-compiled. When he tries to add a new service (that was not AOT'd) to the bootstrap.cfg, he gets the same kind of error:\n{code}\nException in thread \"main\" java.lang.RuntimeException: Unable to resolve symbol: nrepl-service in this context, compiling:(puppetlabs/trapperkeeper/services/nrepl/nrepl_service.clj:48:1)\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10300", "fixedVersions": [], "id": "10300", "issueType": "Bug", "key": "TK-453", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Minor", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:1381f112-1c4e-4869-ba34-30602d945124", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:30:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK services can't be found when AOT'd code is mixed with non-AOT'd code", "timeSpent": "PT0S", "updated": "2022-03-08T10:30:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "The PR updating filesystem-watcher has been merged: https://github.com/puppetlabs/clj-parent/pull/79\n\nNow we need to update tk-jetty9 following the merge and release of https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/183.", "created": "2017-08-29T12:39:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "clj-parent 1.4.1 with update tk-jetty9 has been released.", "created": "2017-08-29T15:00:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69] please add release notes for this issue, if needed.", "created": "2017-08-31T08:09:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-08-22T11:50:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6d2349cc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzg8nz:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Aug/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_14135_*|*_10007_*:*_1_*:*_336587979_*|*_3_*:*_2_*:*_92355881_*|*_5_*:*_1_*:*_1370315150_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_187260264"}], "description": "Update for roll-up into *puppetserver 5.1.0*\n\n*In Scope*\n* Issue an update of the trapperkeeper-filesystem-watcher version in clj-parent/master to version 1.1.0\n* Release clj-parent 1.4.0\n\n* Note that there's a bit of a chicken and egg problem here too - which will likely result in two releases of clj-parent. We also need to update the dep on tk-jetty9 in this repo, but to a version of tk-jetty9 that depends on this version of clj-parent we're going to release", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10238", "fixedVersions": ["TK-JETTY9 2.1.0"], "id": "10238", "issueType": "Task", "key": "TK-452", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2017-09-14T11:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update tk-fs-watcher in clj-parent to 1.1.0, release - for Server 5.x", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "When you say that the {{create-watcher}} function now accepts the recursive option, is that supposed to be instead of passing it to {{add-watch-dir}}? It looks like both functions can optionally take options lists.", "created": "2017-08-24T17:18:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Also you mentioned there was a backport that was not needed in the 5.x branch, is that the SslContextFactory java file? As in, should I just be able to use the regular SslContextFactory?", "created": "2017-08-24T17:39:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "merged to master at https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/bd2510f1921c62723737d720af6918d1f1845f94", "created": "2017-08-29T12:43:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-08-22T11:47:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45a53001"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzg8o7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "Release notes included in puppetserver repo"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "24/Aug/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_79639356_*|*_1_*:*_1_*:*_222323_*|*_10007_*:*_1_*:*_4415910_*|*_3_*:*_1_*:*_413970397_*|*_5_*:*_1_*:*_1298932748_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_189545899"}], "description": "This ticket tracks work to enable runtime refresh of the CRL in tk-jetty 2.x series, which will roll up to *puppetserver 5.1.0*\n\nThis will result in the feature release of version 2.1.0.\n\n*In Scope*\n* Review https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/178 for context\n* Merge up TK-Jetty 9 1.x branch to master branch, taking no changes\n* Create a new PR on TK-Jetty 9 master branch containing the equivalent functionality of PR #178\n* Note that the watch service schema has changed since that PR went up and the create-watcher function now accepts the recursive option\n* Update dependency on clj-parent that includes new version of the tk watch service (See TK-149)\n* Issue a release of tk-jetty 9 with this content \n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10380", "fixedVersions": [], "id": "10380", "issueType": "New Feature", "key": "TK-451", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2017-09-14T11:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support runtime refresh of Jetty CRL (in tk-jetty9  2.1.0)", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "5e3375e183d74c0e821851f3", "body": "Cannot reproduce internally and the customer did not respond. Closing for now.\u00a0", "created": "2018-04-04T12:46:00.000000"}, {"author": "557058:836ef76e-8051-48a3-8dc7-005f79695b0e", "body": "Reopening due to a new case", "created": "2019-02-11T14:28:00.000000"}, {"author": "557058:91233464-4152-4228-81dd-172d43a52a03", "body": "This should be fixed due to PE-27497. If a file was deleted while we were traversing the directory, then an exception was raised. /cc [~accountid:557058:c241032a-c552-4408-9a96-dcd5a643ff69]", "created": "2019-12-17T17:18:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Wait, no, this the state _after_ I made that change. The exception now raises in a different spot than the one originally reported in that PE ticket. We've been wondering if this happens in the wild, it happens four or five times daily in the PE integration pipelines right now. I have yet to figure out how we're even getting to the code path that is now raising. It shouldn't be called if the file in question isn't a directory, which clearly these lock files are not. It would throw a \"not a directory\" exception if it wasn't throwing a \"no such file\" exception. See https://github.com/JetBrains/jdk8u_jdk/blob/master/src/solaris/classes/sun/nio/fs/LinuxWatchService.java#L241-L250.", "created": "2019-12-17T17:34:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Now this should be fixed, after we merged additional changes (see https://github.com/puppetlabs/trapperkeeper-filesystem-watcher/pull/24). These have been released in the latest round of Z releases. Please reopen if the error occurs again.", "created": "2020-03-12T15:04:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-08-16T15:28:00.000000", "creator": "5e3375e183d74c0e821851f3", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4c3e3231"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Customer Feedback"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzg1w7:"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "33714"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Aug/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_507351399_*|*_4_*:*_1_*:*_34126600368_*|*_6_*:*_2_*:*_27052865469_*|*_10005_*:*_1_*:*_19441363066"}], "description": "A customer is seeing transient errors in the file watch service are shutting down the puppetserver when a CRL lock file is created and removed during a file sync. The end result is that puppet server is shutting down on a missing file that is already ignored in file sync.\n\nQuestions\n\n1. Does puppet be create a crl lock file such as /etc/puppetlabs/puppet/ssl/crl.pem20170816-34808-1r9mrwz.lock ?\n2. Should the .gitignore that file sync uses also be used by the file watch service?\n3. Should errors in the file watch service shutdown pe-puppetserver?\n\n\n{code}\n2017-08-16 07:06:01,465 INFO  [clojure-agent-send-off-pool-0] [p.t.s.w.filesystem-watch-core] Got 2 event(s) in directory /etc/puppetlabs/puppet/ssl/ca\n2017-08-16 07:06:01,465 INFO  [clojure-agent-send-off-pool-0] [p.t.s.w.filesystem-watch-core] Got 2 event(s) in directory /etc/puppetlabs/puppet/ssl/ca/signed\n2017-08-16 07:06:01,465 INFO  [clojure-agent-send-off-pool-0] [p.t.s.w.filesystem-watch-core] Got 1 event(s) in directory /etc/puppetlabs/puppet/ssl/ca/requests\n2017-08-16 07:06:01,465 INFO  [clojure-agent-send-off-pool-0] [p.e.s.f.file-sync-storage-core] Automatically committing due to changes in staging-dir '/etc/puppetlabs/puppet/ssl'\n2017-08-16 07:06:01,466 INFO  [clojure-agent-send-off-pool-3627] [p.e.s.f.file-sync-storage-core] Committing staging directory /etc/puppetlabs/puppet/ssl to file sync storage service\n2017-08-16 07:06:01,507 INFO  [clojure-agent-send-off-pool-3627] [p.e.s.f.file-sync-storage-core] Committing repo /etc/puppetlabs/puppet/ssl\n2017-08-16 07:06:01,510 INFO  [clojure-agent-send-off-pool-3627] [p.e.s.f.file-sync-storage-core] Committing the following changes:\n  Added Files: ca/signed/newagent.domain.com.pem\n  Removed Files:\n  Changed Files: ca/inventory.txt, ca/serial\n\n2017-08-16 07:06:01,532 INFO  [clojure-agent-send-off-pool-3627] [p.e.s.f.file-sync-storage-core] Completed commit of repo :ca-data\n2017-08-16 07:06:02,065 ERROR [clojure-agent-send-off-pool-0] [p.t.internal] shutdown-on-error triggered because of exception!\njava.nio.file.NoSuchFileException: /etc/puppetlabs/puppet/ssl/crl.pem20170816-34808-1r9mrwz.lock\n        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)\n        at sun.nio.fs.UnixException.asIOException(UnixException.java:111)\n        at sun.nio.fs.LinuxWatchService$Poller.implRegister(LinuxWatchService.java:246)\n        at sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260)\n        at sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:329)\n        at java.lang.Thread.run(Thread.java:745)\n{code}", "environment": "PE 2017.1.1 with HA configured on Ubuntu 16.04", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10532", "fixedVersions": [], "id": "10532", "issueType": "Bug", "key": "TK-450", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "5e3375e183d74c0e821851f3", "resolution": "Fixed", "resolutionDate": "2020-03-12T15:04:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Transient file watch errors shutdown puppetserver", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "There's no additional testing or docs for this change, it will be eventually released and brought into Hoyt.", "created": "2017-07-27T15:52:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-07-26T17:27:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@801f409"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Method Found", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzfknj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_10525_*|*_10007_*:*_1_*:*_80431534_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_243212"}], "description": "In trapperkeeper-webserver-jetty9 we attempt to register {{TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA256}} however that fails and sends an info message to the logs. This is because that cipher suite is not implemented by the JVM. Elliptical Diffie-Hellmen implements {{AES 256}} with {{SHA}} or {{SHA_384}}, but not with {{SHA_256}}.\n\nIt shouldn't be a security vulnerability as registration continues with our other valid ciphers and the invalid cipher is ignored, however we should clean this up ASAP for hygienic reasons.\n\nThis was found by [~accountid:557058:71582ab7-ed41-48f8-a53e-545356d7dee4]. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10438", "fixedVersions": [], "id": "10438", "issueType": "Bug", "key": "TK-449", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Fixed", "resolutionDate": "2017-07-27T15:52:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Invalid cipher suite registered in tk-ws-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "This has been determined a requirement for the first release as a way to mitigate an issue we're seeing where if a subdirectory is created in the watched directory that is not readable (ie due to access permissions), this will cause the server to fail with:\n{code}\n2017-07-26 09:16:03,435 ERROR [clojure-agent-send-off-pool-5] [p.t.internal] shutdown-on-error triggered because of exception!\njava.nio.file.AccessDeniedException: /etc/puppetlabs/puppet/ssl/ca/foo\n\tat sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)\n\tat sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:427)\n\tat java.nio.file.Files.newDirectoryStream(Files.java:457)\n\tat java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)\n\tat java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)\n\tat java.nio.file.Files.walkFileTree(Files.java:2662)\n\tat java.nio.file.Files.walkFileTree(Files.java:2742)\n{code}\n\nWhile this isn't necessarily expected to be a common occurrence, it's better to be safe. We discovered it in CI when the SSL dir contents were removed, and then the `$ssldir/ca/private` dir wasn't created until later after the server was running, with inaccessible permissions.\n", "created": "2017-07-26T10:24:00.000000"}, {"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "[~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c] Would this puppy need rel notes?", "created": "2017-08-03T13:50:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:41dc5120-addb-42c7-aff4-2d00c35c948c] yep, definitely going to need to add some docs for this, as well as TK-149 ", "created": "2017-08-03T17:12:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "PR to pe-file-sync to update the recursive option to be on `create-watcher` is here: https://github.com/puppetlabs/pe-file-sync/pull/348", "created": "2017-08-09T15:39:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "released in tk-fs-watcher 1.1.0", "created": "2017-08-23T10:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-07-13T16:24:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2b2c2521"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "No Action"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hylmvr:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "New Feature"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jul/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_423958331_*|*_1_*:*_1_*:*_346597837_*|*_10007_*:*_1_*:*_1270940950_*|*_3_*:*_1_*:*_722868792_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_755670257"}], "description": "For the work being done for TK-149, we're looking into using the trapperkeeper-filesystem-watcher library to watch for changes to the directory where the CRL file that the Jetty webserver uses.  Currently, tk-fs-watcher only supports [recursively watching an entire directory tree|https://github.com/puppetlabs/trapperkeeper-filesystem-watcher/blob/1.0.1/src/clj/puppetlabs/trapperkeeper/services/watcher/filesystem_watch_core.clj#L57-L60] but for this use case it would be more efficient to just be able to watch the immediate directory in which the CRL file resides. _Ideally, it would be even better to be able to just watch for changes to the CRL file itself but it appears that the [Path.register|https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#register-java.nio.file.WatchService-java.nio.file.WatchEvent.Kind...-] functionality that tk-fs-watcher uses will only support directory-level watching._\n\nThe work for this ticket would involve enhancing the tk-fs-watcher with a way to avoid having to recursively watch all files in a directory tree - to instead be able to watch changes to the immediate directory only.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10572", "fixedVersions": ["TK-FS-WATCHER 1.1.0"], "id": "10572", "issueType": "Task", "key": "TK-448", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-08-23T10:12:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support non-recursive directory watching in tk-fs-watcher", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "We create an instance of our custom GraphiteReporter here https://github.com/puppetlabs/trapperkeeper-metrics/blob/5242cddd97a460a48fd703914280f70d08c53a04/src/clj/puppetlabs/trapperkeeper/services/metrics/metrics_core.clj#L126-L137. It is defined here https://github.com/puppetlabs/trapperkeeper-metrics/blob/5242cddd97a460a48fd703914280f70d08c53a04/src/java/com/puppetlabs/trapperkeeper/metrics/GraphiteReporter.java.", "created": "2018-02-26T16:08:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Upstream PR that adds the filtering feature: https://github.com/dropwizard/metrics/pull/1048", "created": "2018-02-26T16:15:00.000000"}, {"author": "61af86343618cd006f430854", "body": "nope", "created": "2022-01-26T11:17:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-06-08T09:52:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1a80aae7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymtvj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Feb/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_456204105_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_31538113310_*|*_10005_*:*_1_*:*_114289561706"}], "description": "We use a custom reporter for graphite exporting so that we can configure which attributes (eg. \"p99\", \"m15\") that are exported for each metric. This feature has landed in upstream with TK-442 and we can now move to using the built-in GraphiteReporter. We should investigate doing this.", "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10377", "fixedVersions": [], "id": "10377", "issueType": "Task", "key": "TK-447", "labels": ["final_triage", "reduce-maint", "refactoring"], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Won't Do", "resolutionDate": "2022-01-26T11:17:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Replace custom Reporter with builtin GraphiteReporter", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "This is superseded by TK-487, for which I have a PR up (still needs tests, if we think it's acceptable.).", "created": "2021-12-14T10:45:00.000000"}, {"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "https://github.com/puppetlabs/trapperkeeper/pull/289", "created": "2021-12-14T10:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-06-05T15:05:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7d0d7e8b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzego7:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_92406044_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_142714803989"}], "description": "This is useful when a program has already reported a friendly error message on say stderr and/or to the log. The issue arose when puppetdb wanted to initiate a shutdown after detecting that the currently available database was unsupported.\n\nI could imagine allowing an exit status argument to (shutdown ...), though I suppose we'd have to define how competing requests are handled.\n\nAnother option might be support for throwing something like\n{code:clojure}\n(ex-info ... {:kind ::tk/notify-and-exit :status 2 :message \"something for *err*, etc.\"})\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10531", "fixedVersions": [], "id": "10531", "issueType": "Improvement", "key": "TK-445", "labels": ["final_triage", "help_wanted"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Duplicate", "resolutionDate": "2021-12-14T10:45:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow shutting down with non-zero exit status, but no backtrace", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "Puppet Server team is not going to have time for this one anytime soon, so ...help wanted!", "created": "2017-06-06T16:44:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-06-05T14:10:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7b9c6897"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzeglz:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/Jun/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_95600058_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_108243808205"}], "description": "The configuration of web servers and routing has become fairly complex to parse due to new features and backwards compatibility. I've reimplemented a fair amount of this in tests over time, but it would be better to have an API I can rely on.\n\nThe main question I need to answer is, what is the url to a particular trapperkeeper service? It can be left up to the client whether to find http or https url.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10353", "fixedVersions": [], "id": "10353", "issueType": "New Feature", "key": "TK-444", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Won't Do", "resolutionDate": "2020-11-10T11:27:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "API to query webserver/webrouting configs", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "This has been merged into clj-http-client and released in version 0.9.0 of that library.\n\nWe're in the process of promoting that through clj-parent and up-taking into puppetserver. When we bring it into puppetserver we need to set up puppetserver to take advantage of the ability to disable the metrics. That work is ticketed in SERVER-1841.", "created": "2017-06-14T15:35:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-05-31T14:03:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@56883d4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3ezr:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Jun/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_83773627_*|*_1_*:*_1_*:*_527881120_*|*_10007_*:*_1_*:*_3512246_*|*_3_*:*_2_*:*_95318207_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_504637018"}], "description": "Currently, clj-http-client automatically creates a metric for every url and for every url + method. While this may be helpful in some use cases, at least for Puppet Server we have metric-ids for all the metrics we care about, so these url/url and method metrics are unneeded.\n\nWe should add a setting that can be set when creating an http client that determines whether to create url metrics or not - something like `enable-url-metrics?` - and then we can set this to false in puppet server to turn these metrics off. This shouldn't need to be a user-configurable setting (for puppet server users).", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10429", "fixedVersions": [], "id": "10429", "issueType": "Task", "key": "TK-443", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2017-06-14T15:35:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client: Add setting to turn off url metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "When we do this we may end up needing to make some changes to work we did in clj-http-client for PE-16276 which ended up needing to duplicate/modify the {{GraphiteReporter}} class. It looks like dropwizard/metrics now has the ability to choose which attributes of a metric to report to Graphite. See comment on PE-16935 for more info.", "created": "2017-06-01T17:16:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "TK-447 has been created to track replacing the custom reporter with the updated GraphiteReporter from upstream.", "created": "2017-06-14T14:38:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "This bump has happened within clj-parent and tk-metrics and tk-metrics 1.1.0 was released with the update. We're keeping this open, however, until we get this taken up into puppetserver. The version of clj-parent that will bring this into puppetserver is the same one that will also resolve SERVER-1841. SERVER-1841 is also needed for Puppet Server 5 and that version of clj-parent, as far as I know, represents the final dependency bumps for Puppet Server 5.", "created": "2017-06-14T15:39:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-05-31T13:59:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3cebe001"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3eyv:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Jun/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_49814840_*|*_1_*:*_1_*:*_155060_*|*_10007_*:*_1_*:*_556287054_*|*_3_*:*_1_*:*_164235598_*|*_5_*:*_1_*:*_1136199484_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_509982798"}], "description": "Currently, clj-parent and all the TK libraries that depend on it are using {{io.dropwizard.metrics/metrics-core}} 3.1.2. The most recent release is 3.2.2. In particular, there was a fix to a threadlocal memory leak (https://github.com/dropwizard/metrics/issues/742) that we would like to get in.\n\nAfter we do this, it would be good to do some more memory testing to make sure that we're seeing similar memory usage. It may be good to just duplicate the memory testing + heap dump done in the last comment of SERVER-1735.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10236", "fixedVersions": ["TK Puppet5.0"], "id": "10236", "issueType": "Task", "key": "TK-442", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2017-06-15T09:41:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bump dropwizard/metrics version", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2017-04-18T17:27:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3afc1b23"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcbiv:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_110193_*|*_10007_*:*_1_*:*_73489459_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_7583842_*|*_10006_*:*_1_*:*_159075022"}], "description": "For use with Puppet Server 5, we should do a release of the latest changes in the master branch of trapperkeeper-webserver-jetty9, 2.0.", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10351", "fixedVersions": ["TK Puppet5.0"], "id": "10351", "issueType": "Task", "key": "TK-441", "labels": [], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-04-21T12:11:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Do tk-jetty9 2.0 release", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "and then do a release of tk-w-j9.", "created": "2017-04-18T17:06:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I added TK-441 for doing the actual tk-jetty9 2.0 release.", "created": "2017-04-18T17:27:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Just today, the Jetty team dropped a 9.4.4 version to Maven Central.  If we're going to bump the version anyway, maybe we should just bump to that instead of 9.4.3.", "created": "2017-04-19T09:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-04-18T16:50:00.000000", "creator": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7bc01738"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcbin:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Apr/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_77190739_*|*_1_*:*_1_*:*_1807798_*|*_10007_*:*_1_*:*_1346052_*|*_3_*:*_1_*:*_220446_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_156847660"}], "description": "Bump the jetty-version in project.clj (https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/project.clj#L1) to the latest version on maven central (https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.eclipse.jetty%22).", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10233", "fixedVersions": ["TK Puppet5.0"], "id": "10233", "issueType": "Task", "key": "TK-440", "labels": [], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "resolution": "Fixed", "resolutionDate": "2017-04-21T10:47:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bump tk-ws-jetty9 Jetty version to 9.4.3", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "PR merged to trapperkeeper#master at [24e8f5|https://github.com/puppetlabs/trapperkeeper/commit/24e8f5435ad2ec0753c4137df4fdd454081e6c6d].  Resulting test run [passed|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper_unit-clj_master/7/].  Marking this as resolved.", "created": "2017-04-05T09:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-03-27T09:58:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@74862c63"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcwo7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_61503008_*|*_1_*:*_1_*:*_653285_*|*_10007_*:*_1_*:*_714634730_*|*_5_*:*_1_*:*_0"}], "description": "If an exception is thrown within a Trapperkeeper app which can be coerced to a map but that has no {{:type}} key in it, Trapperkeeper will mishandle the exception map and display the error inappropriately as a result.\n\nThis issue was raised on [this github ticket|https://github.com/puppetlabs/trapperkeeper/issues/264] in the Trapperkeeper repo and was found to occur in some cases where compilation exceptions were mishandled.  I wasn't able to reproduce the issue with a simple case I attempted, where I inserted some bad code into a Trapperkeeper service that I tried to bootstrap.  I was, however, able to recreate the error by inserting the following line into Trapperkeeper's {{main}} function in [core.clj|https://github.com/puppetlabs/trapperkeeper/blob/1.5.2/src/puppetlabs/trapperkeeper/core.clj#L171]:\n\n{code:clojure}\n(throw (clojure.lang.ExceptionInfo. \"bad\" {}))\n{code}\n\nIn my case, the mishandled exception output looked like this:\n\n{noformat}\nlein run --config ./examples/java_service --bootstrap-config ./examples/java_service/bootstrap.cfg\nException in thread \"main\" java.lang.AssertionError: Assert failed: (keyword? kw), compiling:(/private/var/folders/y5/24bhmms53nv2b4g8gyq6tl340000gn/T/form-init6625350671834637310.clj:1:125)\n\tat clojure.lang.Compiler.load(Compiler.java:7391)\n\tat clojure.lang.Compiler.loadFile(Compiler.java:7317)\n\tat clojure.main$load_script.invokeStatic(main.clj:275)\n\tat clojure.main$init_opt.invokeStatic(main.clj:277)\n\tat clojure.main$init_opt.invoke(main.clj:277)\n\tat clojure.main$initialize.invokeStatic(main.clj:308)\n\tat clojure.main$null_opt.invokeStatic(main.clj:342)\n\tat clojure.main$null_opt.invoke(main.clj:339)\n\tat clojure.main$main.invokeStatic(main.clj:421)\n\tat clojure.main$main.doInvoke(main.clj:384)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat clojure.lang.Var.invoke(Var.java:383)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:156)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.main.main(main.java:37)\nCaused by: java.lang.AssertionError: Assert failed: (keyword? kw)\n\tat puppetlabs.kitchensink.core$without_ns.invokeStatic(core.clj:613)\n\tat puppetlabs.kitchensink.core$without_ns.invoke(core.clj:613)\n\tat puppetlabs.trapperkeeper.core$main.invokeStatic(core.clj:177)\n\tat puppetlabs.trapperkeeper.core$main.doInvoke(core.clj:160)\n        ...\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10231", "fixedVersions": [], "id": "10231", "issueType": "Bug", "key": "TK-439", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-04-05T09:45:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Handle exceptions having no type from main", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "attachments": [], "comments": [{"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "[~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] Seems like this needs release notes, no?", "created": "2017-07-07T11:48:00.000000"}, {"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "Charlie says this is not needed anymore, closing.", "created": "2017-07-11T13:59:00.000000"}, {"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "[~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] Can you add Docs if needed or mark \"not needed\"?", "created": "2017-07-24T16:47:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-03-13T12:05:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2671893c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz8mi7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Jul/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_708508950_*|*_3_*:*_1_*:*_521209202_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_5255191_*|*_10006_*:*_1_*:*_9139892111"}], "description": "The trapperkeeper-status service currently provides a way for a service to register a name and callback function which is invoked to gather status info for an http request.  There could be cases in which we want to rename or deprecate an existing service but not immediately break a user's ability to request info by the old service name for some period of time.\n\nFor example, we're considering doing this in Puppet Server as part of the work to move the pe-* services (e.g., pe-master) into OSS.  For OSS, we'd like to use service names which do not have \"pe-\" prefixes in them.  For PE, we're considering having users use the OSS names instead of the pe- ones in order to encourage code / documentation re-use.  For some number of PE releases at least, however, we'd need to preserve support for the \"pe-\" names to preserve backward compatibility.\n\nFor this ticket, we would add some sort of capability to the status service to register an alias for a service which, when used, would perform a redirect to a different service name.  In the Puppet Server case, for example, this could allow a request made to \".../status/v1/services/pe-master\" to return an HTTP 301 response with a new location of \".../status/v1/services/master\".\n\nAn overload of the {{register-status}} function might take {{service-name}} and {{service-alias}} parameter, with logic to handle an alias redirect being implemented behind calls made to the {{get-status}} and status ring-handler. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10519", "fixedVersions": [], "id": "10519", "issueType": "New Feature", "key": "TK-438", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Fix", "resolutionDate": "2017-07-11T13:59:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Register service alias with redirect for status endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "created": "2017-03-06T08:59:00.000000", "name": "jstack.txt", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10131"}], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] - fyi, here's a bug I filed from the test hang we've been seeing.  I haven't reproduced this one locally yet.", "created": "2017-03-06T09:00:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I spent some time looking into this test failure.  I was able to reproduce the issue multiple times locally just by running the failing test in a loop repeatedly.  On one run, I had the test run 10000 times, for which only one test failure, the 9th instance, occurred.  On another run, the first failure I saw was about 9200 instances into the run.\n\nWhile the problem seems to be timing-related, I couldn't find an obvious change to make to the test to make it fail more predictably.  Even with some sleep statements inserted at various points in the test, the failure rate was similarly very small.\n\nA few observations around instances of the failure:\n\n* From an {{lsof}} of the test process during the hang, I can see that both the client and server side of a socket for port 8080 is active.  I made a change to the test to timeout the client side of the connection after 2 minutes of inactivity, see [this PR|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/168].  With that in place, I did still see one instance of the failure.  In this case, {{lsof}} showed that the client side of the connection was closed after the timeout but that the server side of the connection remained open, but in a TCP CLOSE_WAIT state.\n* From a thread dump with {{jstack}} during the hang, I didn't see any Jetty-related threads active - no acceptors, selectors, or workers.\n* On one run, I attached the YourKit profiler to the test process and took multiple memory dumps across iterations of the test run.  I did not see any evidence of Jetty-related objects leaking across test iterations.  Core Jetty objects like the {{Server}} and those related to connectors remained flat at 1 instance allocated throughout the run.\n\nWhile I suspect that these test failures expose a Jetty bug, I'm inclined to not try to pursue that further for now, for a few reasons:\n\n# The reproduction rate is extremely low.  Even if we were, with a pure-Java test case, able to reproduce the failure at least once locally, the infrequent reproduction rate would seem to make it very unlikely that the Jetty team would be able to make much progress in troubleshooting it further.\n# Even when the problem happens, the worst that seems to happen is that a socket descriptor is leaked in a CLOSE_WAIT state.  A restarted server is able to re-bind a listener on the same port without needing to restart the whole JVM process, likely indicating that a restart of the webserver service per a SIGHUP would not necessarily expose a problem.  If enough of these failures were to occur over the life of a JVM process, I suppose the process could eventually run out of file descriptors.  Again, though, it isn't obvious that this would happen very frequently.\n# So far, we've only been able to reproduce the problem when the {{shutdown-timeout-seconds}} setting is set to 0.  The server defaults to 30 seconds for this setting, so it seems unlikely that many consumers would intentionally set the value to 0.\n\nFor now, it probably makes sense to just monitor this test failure in CI to see if it occurs frequently enough that we might want to suppress the test, or research into this further if we see any more \"real world\" instances of this problem come to light.  At least, with the changes in the attached PR, we should hopefully see that when the test fails due to this issue that an assertion appears in the test output - and not a test suite hang.", "created": "2017-03-29T14:27:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Changes to the \"no graceful shutdown\" test were merged into tk-jetty9#master at [bcc7c6|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/bcc7c6609946b72b7f1d7da85b2cafc30a4a0a1c] and the resulting [tests passed|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-webserver-jetty9_unit-clj_master/14/].  Closing this issue out and will revisit again later if/when this issue may flare up again.", "created": "2017-04-05T09:34:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-03-06T08:59:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@63edb7fc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcckv:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/May/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_571260029_*|*_1_*:*_1_*:*_1320468712_*|*_10007_*:*_1_*:*_15863397_*|*_3_*:*_1_*:*_90220699_*|*_5_*:*_1_*:*_7270966331_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_592687249"}], "description": "Since the upgrade to Jetty 9.4.1 at [59cf429|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/tree/59cf429053eb60301362aa7b1ec5328a6a3843e7], the \"no graceful shutdown when stop timeout is set to 0\" test has been frequently hanging (about 2 out of every 5 times run so far) when run via Jenkins CI.  For example, see the output of [this run|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-webserver-jetty9_unit-clj_master/JDK=oraclejdk8,label=unit/12/console]:\n\n{noformat}\nlein test puppetlabs.trapperkeeper.services.webserver.jetty9-service-proxy-test\n2017-03-06 07:18:19,610 WARN  [o.e.j.u.t.QueuedThreadPool] qtp2069888126{STOPPING,8<=12<=200,i=10,q=11} rejected EPC Pend/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@5f69487d\n2017-03-06 07:18:19,611 WARN  [o.e.j.u.t.s.ExecutingExecutionStrategy] Rejected execution of EPC Pend/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@5f69487d\n\nlein test puppetlabs.trapperkeeper.services.webserver.jetty9-service-test\n\nBuild timed out (after 20 minutes). Marking the build as aborted.\nBuild was aborted\n{noformat}\n\nFrom the attached jstack thread dump taken while the test was running, I could see that the test was hanging on [this line|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/59cf429053eb60301362aa7b1ec5328a6a3843e7/test/clj/puppetlabs/trapperkeeper/services/webserver/jetty9_service_test.clj#L726].  The HTTP request made to the /hello endpoint blocks for 20 minutes until the test run is killed off.  From the jstack trace, it is apparent that Jetty selector and worker threads are still running despite the test previously having called stop on the Jetty server.\n\nThis may ultimately highlight a race condition / defect in Jetty itself - not sure yet.  The block where the hang occurs is currently wrapped with the {{with-test-logging}} macro.  I think it would be good to try to remove this wrapper and reproduce this error.  There may be useful detail in the Jetty log output which could help pinpoint the source of the error.  ", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10571", "fixedVersions": ["TK Puppet5.0"], "id": "10571", "issueType": "Bug", "key": "TK-437", "labels": [], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-06-28T13:17:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-jetty9 \"no graceful shutdown\" test frequently hangs in Jenkins", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] - I talked this over with [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] today and he seemed to think it was reasonable.  Wanted to get your thoughts about this before we would actually start the work, though.  What do you think?", "created": "2017-03-03T17:38:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "I think this seems reasonable... I wonder though if it would be better to either get rid of `initialize-registry-settings` or to just modify its behavior - we still haven't released 1.0.0 of tk-metrics so we wouldn't even need to bump an x version or anything. Having `append-registry-settings` create the registry settings if they don't already exist, and also having an `initialize-registry-settings` function seems weird to me. So I say we just have one function and have it's behavior be to add registry settings if they don't exist yet, or merge in the new settings if they do exist.\n\nThe merge behavior seems like it might be a bit complicated (needing to update a vector within a map), but given we have a schema for the result and control the keys, it seems like it should be doable.\n", "created": "2017-03-07T09:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] Thanks.  I guess I don't have a strong preference on the names of the functions and you're right that since this work would be done for a major release of tk-metrics, I think it would be okay to change the behavior to have a single function which accommodates both the create and append behavior.  Maybe we could just continue to use {{initialize-registry-settings}} but have the behavior allow for calls made beyond the first to append additional defaults rather than just erroring out.  WDYT?  [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] - you have any preferences?", "created": "2017-03-08T12:21:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-03-03T17:36:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f9ceb63"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcc2v:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Mar/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_433365619_*|*_1_*:*_1_*:*_260096460_*|*_10007_*:*_1_*:*_76399030_*|*_3_*:*_1_*:*_258715632_*|*_6_*:*_1_*:*_0"}], "description": "In the [PR discussion|https://github.com/puppetlabs/puppetserver/pull/1333#discussion_r103974339] for SERVER-1262, we realized that having a single list of metrics added for the \"puppetserver\" registry could be problematic if some of the metrics are managed by code in OSS Puppet Server vs. other metrics being managed by code which only runs in PE Puppet Server (via PE File Sync).  It would seem better to be able to somehow split the lists to be managed so that they could be updated independently for OSS vs. PE.  This would allow us to, for PE Puppet Server, derive the jruby, profiler, and puppet http metric names from code in OSS Puppet Server but be able to add / change the list of file-sync metrics from code in pe-puppet-server-extensions (without needing to change source code in OSS Puppet Server in order to do so).  This isn't possible to do today because the tk-metrics service only allows the settings for a domain to be registered one time, via an {{initialize-registry-settings}} call.  A second call to that function for the same domain would throw an error.\n\nFor this ticket, I was thinking we could create a new function in the tk-metrics service API with a name like {{append-registry-settings}}, which would basically work like {{initialize-registry-settings}} does when called for a domain that has not already been registered.  When called a second or additional time for the same domain, however, the function would merge/append the supplied registered settings with the settings previously stored for the domain.  Like {{initialize-registry-settings}}, a call to {{append-registry-settings}} would throw an error if called after the start lifecycle for the tk-metrics service had been run.\n\nWith this approach, each settings registration done for the puppetserver domain would use the {{append-registry-settings}} call in order to aggregate the complete list of default metrics allowed from the different services which provide those metrics.", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10428", "fixedVersions": ["TK Puppet5.0"], "id": "10428", "issueType": "Improvement", "key": "TK-436", "labels": [], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2017-03-15T16:19:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for appending registry settings", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2017-02-02T16:37:00.000000", "creator": "557058:1381f112-1c4e-4869-ba34-30602d945124", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1bf4306"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hym98v:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6816598_*|*_10007_*:*_1_*:*_581076801_*|*_3_*:*_1_*:*_17160_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_1210174777"}], "description": "In order for PE-AIO to be a viable testing tool, it should be able to create any missing databases and users that are used by the rest of PE besides the tool being tested. Currently, we have no code that provides a way to programmatically create postgres databases and users using postgres's built-in commands for these purposes. This is part of the reason that most of our projects require the user to run postgres's `createdb` and `createuser` CLI tools in order to set up test databases. PuppetDB has some test utilities that do this, but they don't sanitize their input, so they aren't suitable as general-purpose utilities to this end.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10298", "fixedVersions": [], "id": "10298", "issueType": "New Feature", "key": "TK-435", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:1381f112-1c4e-4869-ba34-30602d945124", "resolution": "Fixed", "resolutionDate": "2017-02-23T12:05:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Utilities to create & delete postgres databases & users", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "i18n support was merged to the tk-scheduler#master branch at [719a41|https://github.com/puppetlabs/trapperkeeper-scheduler/commit/719a412ac74e200585df42a7572dbac99ca2c1b7].  i18n CI job was also added for tk-scheduler.  I ran the pipeline once and confirmed that the job ran and passed successfully.  Closing this issue out...", "created": "2017-02-07T09:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-02-02T13:55:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@18990688"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1550"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzbpxb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_18570_*|*_10007_*:*_1_*:*_403678828_*|*_3_*:*_1_*:*_12217138_*|*_5_*:*_1_*:*_0"}], "description": "Same work as was done for other repos in SERVER-1550 but for the trapperkeeper-scheduler repo.", "epicLinkSummary": "String externalization for Internationalization in SysEng-related repos", "estimate": "PT0S", "externalId": "10427", "fixedVersions": [], "id": "10427", "issueType": "Improvement", "key": "TK-434", "labels": [], "originalEstimate": "PT0S", "parent": "15316", "parentSummary": "String externalization for Internationalization in SysEng-related repos", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2017-02-07T09:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Externalize user facing strings in the tk-scheduler repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Released in trapperkeeper-metrics 0.6.0 and pe-trapperkeeper-metrics 0.3.0, both of which are in clj-parent 0.4.0.", "created": "2017-02-08T19:10:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:43:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-02-02T13:42:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@68eb18e7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymca7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Feb/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_175117015_*|*_1_*:*_1_*:*_95687973_*|*_10007_*:*_1_*:*_266452781_*|*_3_*:*_1_*:*_785214_*|*_5_*:*_1_*:*_12071246474_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_27459"}], "description": "Many consumers of the trapperkeeper-metrics service, like pe-puppet-server-extensions, currently dig into the {{metrics}} section of the Trapperkeeper config in order to pull out the {{server-id}} that they append into the names of individual metrics that they register.  Generally speaking, it seems like bad form for a service to dig out the TK configuration that is defined for/by another service - e.g., potentially causing any future need to change the config format to have to ripple across a number of services.  For this ticket, we would create a new protocol function on the trapperkeeper-metrics service, {{get-server-id}}, which dependent services could call to derive the {{server-id}} instead of digging into the TK configuration directly.", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10262", "fixedVersions": ["TK Puppet5.0"], "id": "10262", "issueType": "Improvement", "key": "TK-433", "labels": [], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-02-08T19:10:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add a get-server-id function to the tk-metrics service protocol", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2017-02-01T11:57:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@e59d274"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzbmw7:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_536085795_*|*_6_*:*_1_*:*_0"}], "description": "If {{client-auth}} is unset in TK config it defaults to {{need}}.  If a client doesn't present a cert, the server refuses to connect but logs nothing above DEBUG level:\n\n{code}\n2017-02-01 10:45:32,959 DEBUG [qtp453815228-22] [o.e.j.s.HttpConnection]\njavax.net.ssl.SSLHandshakeException: null cert chain\n\tat sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1421)\n\tat sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)\n\tat sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:813)\n\tat sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)\n\tat javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)\n\tat org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:516)\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:239)\n\tat org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)\n\tat java.lang.Thread.run(Thread.java:745)\nCaused by: javax.net.ssl.SSLHandshakeException: null cert chain\n\tat sun.security.ssl.Alerts.getSSLException(Alerts.java:192)\n\tat sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)\n\tat sun.security.ssl.Handshaker.fatalSE(Handshaker.java:304)\n\tat sun.security.ssl.Handshaker.fatalSE(Handshaker.java:292)\n\tat sun.security.ssl.ServerHandshaker.clientCertificate(ServerHandshaker.java:1804)\n\tat sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:222)\n\tat sun.security.ssl.Handshaker.processLoop(Handshaker.java:969)\n\tat sun.security.ssl.Handshaker$1.run(Handshaker.java:909)\n\tat sun.security.ssl.Handshaker$1.run(Handshaker.java:906)\n\tat java.security.AccessController.doPrivileged(Native Method)\n\tat sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1359)\n\tat org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.fill(SslConnection.java:612)\n{code}\n\nThis is terrible.  Log something at WARN at least, preferrably along the lines of \"Jetty refusing HTTPS connection because client-auth is need / a client certificate is required but was not provided\".", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10518", "fixedVersions": [], "id": "10518", "issueType": "Bug", "key": "TK-432", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2017-02-07T16:52:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jetty/tk-jetty9 logging for missing required cert is horrible", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b], where this relates to the SERVER-1695 ticket that you had requested previously, I'd be curious to get your take on how important you think this might be.  FWIW, I don't think puppet agent uses chunked transfer encoding for any of the requests it makes so this extra work might be superfluous for what you were hoping to get out of SERVER-1695 upfront.  Maybe you know of some cases, though, where some of this might be more valuable, though?", "created": "2017-01-31T13:13:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "In general, I think it would be good to have standardized behavior and configuration for this across PE services. However, I agree that it's probably not that useful at the moment if the Puppet Agent isn't using things like chunked transfer to upload data to the Puppet Server.\n\nOf the top of my head, it seems like report submission and filebucket uploads would be the only places where we might routinely  upload large data sets. Maybe also facts... but it would take a special kind of crazy to push 100s of MB to that endpoint. Which means there's probably someone out there who has tried.", "created": "2017-02-06T04:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-01-31T13:11:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@48b9c362"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzblrb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Jan/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_12481711_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_160854621651"}], "description": "In SERVER-1695, we added a new webserver setting, {{request-body-max-size}}, to trapperkeeper-webserver-jetty9.  This setting causes a web request to be rejected with an HTTP 413 (request entity too large) error when the {{Content-Length}} header in the request exceeds a specific size.  PuppetDB has a similar setting called [max-command-size|https://docs.puppet.com/puppetdb/latest/configure.html#max-command-size].  The implementation of this setting for PuppetDB, however, is more comprehensive than the simple {{request-body-max-size}} implementation is.  We should consider adding the following to the trapperkeeper-webserver-jetty9 implementation from the PuppetDB {{max-command-size}} implementation:\n\n1) When a limit is configured, wrap the incoming InputStream for the request in a {{LimitedInputStream}} which throws an exception when the number of bytes read from the stream exceeds the limit.\n\nSee [this code|https://github.com/puppetlabs/puppetdb/blob/4.3.1/src/puppetlabs/puppetdb/http/command.clj#L69-L83] in PuppetDB for reference.\n\nThis behavior would allow for a chunked HTTP request - one which does not provide a {{Content-Length}} header - to be limited by the setting, which would seem valuable.\n\n2) At the point the limit is tripped for a request, consume / eat the rest of the bytes from the incoming stream.\n\nThis was done in the snippet above in the PuppetDB implementation.  Per comments in the PuppetDB code, this work was done to avoid causing problems for a Ruby-based client when a connection is severed from the server before all of the bytes from the request are forwarded.  We may not want to do this until specifically needed in the tk-jetty9 implementation.  Seems a little better for the case of a badly-behaving client (one that might spew bytes indefinitely, tying up a connection) to not try to exhaust the stream once the limit has been reached.  Worth a discussion maybe, though. \n ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10530", "fixedVersions": [], "id": "10530", "issueType": "Improvement", "key": "TK-431", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:30:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add stream limit and consumption to request-body-max-size webserver setting", "timeSpent": "PT0S", "updated": "2022-03-08T10:30:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The i18n plugin version has been bumped to 0.6.0 for each of these projects and the i18n job has also been added to the mergely pipelines for each as well.  I confirmed that the job is running fine for the trapperkeeper project at least so I expect it will be fine for the others as well.  Closing this out.", "created": "2017-02-03T15:47:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-01-11T10:28:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@22c583e4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymddr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_23360_*|*_10007_*:*_1_*:*_164746922_*|*_3_*:*_1_*:*_105221627_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1736384593"}], "description": "The various Trapperkeeper (and related Clojure library) projects which use i18n should be updated to the latest clj-i18n version, 0.5.1 and have their CI pipelines updated to include the [i18n-clj template|https://github.com/puppetlabs/ci-job-configs/blob/master/resources/job-templates/i18n-clj.yaml].  This will allow the locale POT files to be updated automatically by CI whenever any externalized strings need to be changed based on the latest Clojure code in the projects.  This avoids the need to update the files at compile time and include those changes on a per-PR basis.\n\nRepos to update include:\n\n* trapperkeeper\n* tk-webserver-jetty9\n* tk-metrics\n* tk-auth\n* tk-filesystem-watcher\n* jvm-ssl-utils\n* http-client\n* tk-status\n* ring-middleware", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10570", "fixedVersions": [], "id": "10570", "issueType": "Task", "key": "TK-430", "labels": ["i18n"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2017-02-03T15:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update to i18n 0.5.1 and add i18n-clj job to CI pipeline ", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-webserver-jetty9#master at [dcf31b46|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/dcf31b46d87b2666d30731249bef163af9702a6b].", "created": "2017-01-10T17:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[Jenkins job|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-webserver-jetty9_unit-clj_master/51/] passed after the ticket was merged so marking this resolved.", "created": "2017-01-10T17:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-01-10T13:47:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3d0fd73f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzb57j:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2146202_*|*_10007_*:*_1_*:*_11031096_*|*_3_*:*_1_*:*_3487_*|*_5_*:*_1_*:*_0"}], "description": "When the {{access-log-config}} setting is enabled in the webserver configuration for the trapperkeeper-webserver-jetty9 service and {{gzip-enabled}} is set to true, the tk-jetty9 service erroneously never uses gzip encoding to enable the response - even if the client specifically provides an \"Accept-Encoding: gzip\" header and the size of the response is greater than the minimum size that Jetty's GzipHandler uses as a threshold to encode, 256 bytes.  The response is properly gzip encoded by the server with the same conditions, only with the {{access-log-config}} setting not present in the configuration.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10261", "fixedVersions": [], "id": "10261", "issueType": "Bug", "key": "TK-429", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-01-10T17:26:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "gzip encoding errantly disabled in tk-jetty9 when access-log-config enabled", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:836ef76e-8051-48a3-8dc7-005f79695b0e] how is work on this progressing?", "created": "2017-06-15T07:50:00.000000"}, {"author": "557058:836ef76e-8051-48a3-8dc7-005f79695b0e", "body": "[~accountid:557058:3da95088-202d-4082-a15a-eb2e812f2578] SERVER-1829 covers the Jolokia docs. Predocs arrived 50 minutes ago. I've spent most of the time since then addressing JIRA overhead as requested.", "created": "2017-06-20T14:10:00.000000"}, {"author": "557058:836ef76e-8051-48a3-8dc7-005f79695b0e", "body": "PR filed.", "created": "2017-06-21T17:55:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The combination of https://github.com/puppetlabs/puppetserver/pull/1435 (import of PE metrics docs) and https://github.com/puppetlabs/puppetserver/pull/1433 (metrics V1 and V2 API docs) for Puppet Server should address this ticket.  I'm going to close this out.", "created": "2017-06-23T17:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2017-01-06T10:38:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@79dff6b8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzep5z:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Jun/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1470499688_*|*_3_*:*_1_*:*_8388796405_*|*_10009_*:*_1_*:*_171821214_*|*_5_*:*_1_*:*_416308119_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_4505715409"}], "description": "The trapperkeeper metrics webservice is has been added to most PE services and could use some public-facing documentation describing it's use. The service provides two API endpoints that allow users to retrieve JMX metrics using HTTP.\n\n{{metrics/v1}}:\n\nThis endpoint is fairly simple and was extracted from PuppetDB. The specific metrics available will be different depending on the PE service, but the \"Listing available metrics\" and \"Retrieving a specific metric\" sections of the PDB docs should apply to all services:\n\nhttps://docs.puppet.com/puppetdb/4.3/api/metrics/v1/mbeans.html\n\n{{metrics/v2}}:\n\nThis is a new endpoint that was added in TK-404 and should become available in upcoming releases. This endpoint wraps an external library called Jolokia, so most of the documentation on how to use and configure it has already been written by that project.\n\nMost folks will want to start with the Jolokia docs on how to make metrics requests to the API:\n\nhttps://jolokia.org/reference/html/protocol.html\n\nAdvanced users may want to tweak the configuration of the service:\n\n  - https://github.com/puppetlabs/trapperkeeper-metrics/blob/0.5.0/documentation/configuration.md\n  - https://jolokia.org/reference/html/agents.html#war-agent-installation", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10260", "fixedVersions": ["TK Puppet5.0"], "id": "10260", "issueType": "Improvement", "key": "TK-446", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2017-06-23T17:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add trapperkeeper metrics webservice to the docs", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I've submitted a PR for this for clj-parent, so it will need to go into that, be released, and then the new version of clj-parent will need to be pulled into TK. I figured I'd leave this in \"In Progress\" until there was a PR for TK proper.", "created": "2017-01-30T15:54:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "We decided to use this ticket just for the clj-parent project.", "created": "2017-02-03T11:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-12-20T11:45:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@415026f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hylt5z:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Jan/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1227495796_*|*_3_*:*_1_*:*_330793900_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2328460431"}], "description": "The recently released logback 1.1.8 has a fix in it which enables the size-based logging that we're using in various services to ensure that the {{totalSizeCap}} setting is honored even when hit for files created with the [two period safeguard|http://logback.qos.ch/news.html].  For us, this should mean that if files being logged within the same day exceed the size threshold - e.g., for a cascading failure which spews a ton of redundant log messages - that older logs will be purged, minimizing disk usage.  We should update to this version.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10569", "fixedVersions": [], "id": "10569", "issueType": "Task", "key": "TK-428", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-02-03T11:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Upgrade to logback 1.1.8 to pick up totalSizeCap log rotation fix", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd], now that the fix for this has been merged and released in the latest trapperkeeper-metrics version, 0.5.0, do you think this ticket needs to stay open?  Wasn't sure if you wanted to roll it up into other components, e.g., puppetdb, pe-puppetdb, before doing that.", "created": "2017-01-04T18:59:00.000000"}, {"author": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I think this can be closed. I have created a PR for PuppetDB to bump to this newly released version but it hasn't been merged yet. Once that's one and PDB is then released, I think the gatling metrics collection stuff can be tested (the original driver for the change).", "created": "2017-01-06T08:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-12-14T15:45:00.000000", "creator": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6d1b3625"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzaq07:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "05/Jan/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1880997694_*|*_1_*:*_1_*:*_367916_*|*_10007_*:*_1_*:*_79298598_*|*_5_*:*_1_*:*_0"}], "description": "Querying for many trapperkeeper metrics in bulk causes the below exception\n\n{code}\n2016-12-14 16:40:56,546 WARN  [o.e.j.s.HttpChannel] /metrics/v1/mbeans\njava.io.IOException: Stream closed\n        at java.io.BufferedReader.ensureOpen(BufferedReader.java:122)\n        at java.io.BufferedReader.read(BufferedReader.java:278)\n        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.loadMore(ReaderBasedJsonParser.java:180)\n        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipAfterComma2(ReaderBasedJsonParser.java:2231)\n        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._skipComma(ReaderBasedJsonParser.java:2226)\n        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:632)\n        at cheshire.parse$lazily_parse_array$fn__4967.invoke(parse.clj:53)\n        at clojure.lang.LazySeq.sval(LazySeq.java:40)\n        at clojure.lang.LazySeq.seq(LazySeq.java:49)\n        at clojure.lang.RT.seq(RT.java:521)\n        at clojure.core$seq__4357.invokeStatic(core.clj:137)\n        at clojure.core$map$fn__4785.invoke(core.clj:2637)\n        at clojure.lang.LazySeq.sval(LazySeq.java:40)\n        at clojure.lang.LazySeq.seq(LazySeq.java:49)\n        at clojure.lang.RT.seq(RT.java:521)\n        at clojure.core$seq__4357.invokeStatic(core.clj:137)\n        at clojure.core$seq__4357.invoke(core.clj:137)\n        at cheshire.generate$generate.invokeStatic(generate.clj:132)\n        at cheshire.generate$generate.invoke(generate.clj:116)\n        at cheshire.core$generate_string.invokeStatic(core.clj:73)\n        at cheshire.core$generate_string.invoke(core.clj:48)\n        at puppetlabs.trapperkeeper.services.metrics.ringutils$json_response.invokeStatic(ringutils.clj:7)\n        at puppetlabs.trapperkeeper.services.metrics.ringutils$json_response.invoke(ringutils.clj:5)\n        at puppetlabs.trapperkeeper.services.metrics.metrics_core$build_handler$fn__41674$fn__41675.invoke(metrics_core.clj:104)\n        at compojure.response$eval6981$fn__6982.invoke(response.clj:33)\n        at compojure.response$eval6936$fn__6937$G__6927__6944.invoke(response.clj:6)\n        at puppetlabs.trapperkeeper.services.metrics.metrics_core$build_handler$fn__41674.invoke(metrics_core.clj:96)\n        at ring.middleware.keyword_params$wrap_keyword_params$fn__41226.invoke(keyword_params.clj:35)\n        at ring.middleware.params$wrap_params$fn__30480.invoke(params.clj:64)\n        at ring.middleware.absolute_redirects$wrap_absolute_redirects$fn__41464.invoke(absolute_redirects.clj:38)\n        at ring.middleware.content_type$wrap_content_type$fn__31383.invoke(content_type.clj:30)\n        at ring.middleware.default_charset$wrap_default_charset$fn__41439.invoke(default_charset.clj:26)\n        at ring.middleware.not_modified$wrap_not_modified$fn__31412.invoke(not_modified.clj:52)\n        at bidi.ring$eval31490$fn__31491.invoke(ring.clj:21)\n        at bidi.ring$eval31469$fn__31470$G__31460__31479.invoke(ring.clj:12)\n        at puppetlabs.comidi$make_handler$fn__33034.invoke(comidi.clj:249)\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$ring_handler$fn__39148.invoke(jetty9_core.clj:424)\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)\n{code}\n\nWhich is due to the stream being closed before cheshire has been able to parse all of the request. This is due to the payload being a JSON array and cheshire returning a lazy-seq", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10636", "fixedVersions": [], "id": "10636", "issueType": "Bug", "key": "TK-427", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "resolution": "Fixed", "resolutionDate": "2017-01-06T08:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk metrics closes request input stream before parsing request", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I also tested this with the most recent logback version, 1.1.8, built into puppetserver package for CentOS 7.  I saw the same problem where changes I made to the logback.xml file did not take effect until after I restarted the full puppetserver process.  I had triggered dozens of actions which log messages over several minutes time without seeing the logback scan reconfiguration kick in.", "created": "2016-12-20T11:27:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "One thing I noticed when reviewing logback's changelog is that 1.1.9 increased the threadpool size from 2 to 8 after they saw some long running processes could exhaust their threadpool of 2 easily and cause other services to never run. I'm not familiar with how we use logback in tk or how slf4j uses it, but it's possible that we're hitting this issue and that upgrading to 1.1.9 will help.\n\nI have a PR to bump to logback to 1.1.9 here: https://github.com/puppetlabs/clj-parent/pull/30\nLogback changelog: https://logback.qos.ch/news.html\nLogback ticket in question: https://jira.qos.ch/browse/LOGBACK-1238", "created": "2017-01-30T15:45:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I played around with a mergely build off of the puppetserver master branch, 2.7.2.master.SNAPSHOT.2017.03.01T1110, which had been bumped up to logback 1.1.9.  On CentOS 7 at least, it still doesn't appear that the \"scan\" element in the logback configuration is allowing for configuration changes to be dynamically reloaded.  I started the puppetserver service, bumped log levels in the logback configuration up to debug, and did a number of puppet agent runs.  Even after several hundred agent runs - producing a half-dozen log messages each - and several minutes, no debug-level log messages were written to the log.  Only after a full restart of the puppetserver service did debug-level log messages start being written to the log.\n\nThere have been 3 more releases of logback since the 1.1.9 bump - 1.1.10, 1.2.0, and 1.2.1.  It would be good to try with the later versions to see if scan started working again but I don't see anything obvious in the logback release notes which highlights a fix related to this issue.", "created": "2017-03-01T16:37:00.000000"}, {"author": "557058:745ad6f8-2461-4691-9873-549d5904bb16", "body": "[~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] Excellent find.  If we could get that scanPeriod option added to logback.xml for the next LTS z, that would work for me.  I don't know what the default used to be, but 60 seconds seems a bit long to me.  Is there a lot of overhead with having that file scanned frequently?", "created": "2017-03-02T17:31:00.000000"}, {"author": "557058:836ef76e-8051-48a3-8dc7-005f79695b0e", "body": "[~accountid:623c0b72bef8a60068c796ce] Should I add this workaround to the live docs and close out DOCUMENT-642? Seems like a near-term workaround would unblock it.", "created": "2017-03-02T18:27:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:557058:745ad6f8-2461-4691-9873-549d5904bb16] The default is 60 seconds according to the [documentation|https://logback.qos.ch/manual/configuration.html#autoScan]. As for the performance, it's a little complicated/confusing. Those docs mention that there could be some performance impact to frequent scanning, and they talk about some hoops they have to jump through to keep the scan feature from bogging down applications. \n\nI would hesitate to recommend lowering it down very much if there's not a compelling reason, but I also have very little idea of what the performance impact would actually be\n\n[~accountid:557058:836ef76e-8051-48a3-8dc7-005f79695b0e] Yeah, this workaround should work for that ticket", "created": "2017-03-03T12:03:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "I think we should just put \"60 seconds\" in the configuration. It fixes this issue and makes the existance of the setting visible to users. Explicit is better than implicit in this case.", "created": "2017-11-07T09:47:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "We've added the documentation to puppetserver. We should validate that this works as expected and if so update the default values in our logback.xml and resolve this, I think.", "created": "2017-11-07T12:00:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "It'd need to be a mass update to logback.xml in all PE and Open Source projects --- do we have a centralized list of where all these config files are? Last time I looked, some were in resources/ directories, others in ezbake directories and still others in pe-specific packaging.", "created": "2017-11-07T13:15:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I don't know of a canonical list.", "created": "2017-11-07T14:17:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This seems like this just needs a little follow-up on which spots need to be updated. [~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] do you have any update on that, or should we look into it?", "created": "2018-02-13T17:15:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "This should be a trivial change to the logback.xml files --- main blocker is finding an authoritative list of where all of those live and making sure that pe- variants of things like Puppet Server and PuppetDB are updated along with PE services like orchestration and console.\n\nAnother one that would be good to knock out at the same time is PE-13490, which asks for time zones to be added to our Java logs. Currently everything is timestamped with server local time but know time zone --- which makes logs hard to interpret without supporting information that provides the offset from UTC.", "created": "2018-02-13T19:03:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] made PRs to fix this issue, marking as resolved.", "created": "2018-03-29T17:39:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Re-opening for the time being since bits have landed in pe-puppetserver, but I haven't gotten around to filing PRs for puppetserver yet.", "created": "2018-03-29T18:10:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "PRs up for Puppet Server 6 and PuppetDB 6.", "created": "2018-05-14T12:48:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Closing as fixed since PRs for Puppet Server and PuppetDB are merged.", "created": "2018-09-17T12:59:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Also, for posterity and the benefit of future generations, the \"authoritative list\" of where these files live in the various and sundry repositories that combine into PE and Open Source packages boils down to:\n\n  - Read the EZBake docs and source code. Figure out how it's config merging works.", "created": "2018-09-17T13:03:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-12-14T12:42:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@41314793"}, {"fieldName": "CS Business Value", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "4 - $$$$$"}, {"fieldName": "CS Frequency", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "4 - 50-90% of Customers"}, {"fieldName": "CS Impact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "Support interactions would be much smoother if we just set this to scan every 60 seconds. It would remove the need to ask customers to restart puppetserver during troubleshooting which can be lengthy at many customers."}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "CS Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - Annoyance"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyl2sn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Jan/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1742438709_*|*_10007_*:*_1_*:*_10887077542_*|*_3_*:*_1_*:*_3955103750_*|*_4_*:*_1_*:*_47029_*|*_5_*:*_1_*:*_1780639_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_38879773792"}], "description": "In the logback.xml configuration files for various projects, we've been setting the \"scan\" attribute to \"true\" in hopes of having logback automatically notice / reload configuration file changes on the fly.  We had observed that it was working for Trapperkeeper-based applications at one point in time but it no longer appears to be working, most recently tested with logback-classic version 1.1.7.  We should investigate this further to see if there's something we need to change in Trapperkeeper to continue supporting the feature and/or if there's a bug in logback itself.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10529", "fixedVersions": ["SERVER 6.0.0"], "id": "10529", "issueType": "Bug", "key": "TK-426", "labels": ["cspapercuts", "usability"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2018-09-17T12:59:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate apparent breakage of \"scan\" for logback configuration", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-30T16:07:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1f99efb2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Assessment"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzagsn:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Mar/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_520548703_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_165690740083"}], "description": "{code}\n2016-11-30 15:00:08,546 INFO  [async-dispatch-6] [p.t.s.w.jetty9-service] Shutting down web server(s).\n2016-11-30 15:00:08,548 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Shutting down web server.\n2016-11-30 15:00:08,550 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Web server shutdown\n2016-11-30 15:00:08,551 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Shutting down web server.\n2016-11-30 15:00:08,552 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Web server shutdown\n2016-11-30 15:00:08,552 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Shutting down web server.\n2016-11-30 15:00:08,553 INFO  [async-dispatch-6] [p.t.s.w.jetty9-core] Web server shutdown\n{code}\nIn that log snippet, it appears that 3 jetty servers are being shutdown.  That's reasonable - but without having a fairly in-depth understanding of jetty's concept of a \"server\" and how we use multiple servers within a single process, that looks pretty confusing.  I think all of those servers have IDs, so if we simply logged the ID in each of those messages that would make things a lot more clear.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10349", "fixedVersions": [], "id": "10349", "issueType": "Improvement", "key": "TK-425", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:55:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improve tk-jetty9's shutdown logging", "timeSpent": "PT0S", "updated": "2022-03-08T09:55:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "This ticket suggests that we have logback configuration reloaded as part of the TK HUP sequence.  We've also recently observed some issues with logback's \"scan\" functionality apparently not reloading configuration changes on the fly as we had expected for Trapperkeeper apps.  I filed a separate ticket, TK-426, to cover investigating the \"scan\" issue.", "created": "2016-12-14T12:45:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Closing since we're not likely to get to this any time soon. Please reopen with your story if this is very important to you.", "created": "2020-03-12T14:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-23T12:15:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@ec0bf22"}, {"fieldName": "CS Business Value", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - $$$"}, {"fieldName": "CS Frequency", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - 5-25% of Customers"}, {"fieldName": "CS Impact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "It's a bit surprising that a reload does not update the logback settings. That said waiting a few minutes for the changes to take effect isn't a big problem for the support team."}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Minor"}, {"fieldName": "CS Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "2 - Annoyance"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyncxb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Dec/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_534696365_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_47193107280_*|*_10005_*:*_2_*:*_56389300615"}], "description": "Reinitialize logback as part of TK's reload sequence.  This allows a way for changes to logback's configuration to be picked up without waiting for its automatic (and sometimes seemingly slow) scan to happen and put logging configuration changes into effect. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10568", "fixedVersions": [], "id": "10568", "issueType": "Improvement", "key": "TK-424", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2020-03-12T14:41:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Reinitialize logback during reload", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Is this actually a problem?  Most non-trivial services are going to end up using the scheduler service anyway, and booting the scheduler service if you aren't using it really isn't a big deal... so what is the downside other than us needing to add one line to the various bootstrap.cfg files?\n\nI think it would be a much worse UX if users go look at our docs and see that they can enable the status logging (which our support team is very interested in and will be encouraging people to do whenever they have a support escalation) and then the service crashes because the scheduler isn't listed in the bootstrap.cfg.\n\nIn other words, do we want people to have to go modify the bootstrap.cfg *and* the config file in order to be able to turn on the status logging?\n\nMy vote is \"Closed - won't fix\" on this.", "created": "2016-11-18T16:12:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:63d4062f69c7ae3958d276ed] Came up with the suggestion originally, so I'll let him have a chance to talk about it. Good point about the UX side of things though...", "created": "2016-11-18T17:00:00.000000"}, {"author": "6361cbfc59c794184bcbd33a", "body": "Nothing seems to use the scheduler-service today except pe-puppetserver. Since this is in clj-parent, there's no way to opt out of having to do this compatibility work besides not upgrading clj-parent, which obviously isn't a great option. So we need to do a PE module update for pe-puppetdb\\*, pe-orchestration-services and pe-console-services, and we need test updates for every service that uses tk-status and does TK integration tests. Which is... most of them.\n\nThat's a pretty big impact for a minor feature that isn't enabled by default.\n\nI'm fine closing this, but we need to be deliberate about this sort of \"small\" backward incompatibility in the future. At the very least, we should try to indicate it via semver with clj-parent (this was included in a .z release).\n\n\\* Technically not for pe-puppetdb, since it isn't using clj-parent yet. But in principle...", "created": "2016-11-18T17:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nNothing seems to use the scheduler-service today except pe-puppetserver.\n{quote}\n\nOK", "created": "2016-11-18T17:47:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "/cc [~accountid:557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8] - this is the ticket I was talking to you about in the hallway this morning.\n\nApologies for not recognizing that the clj-parent change would have some ripple effects.  If it's necessary we could roll back the tk-status version bump, but because I believe that feature is going to be really valuable for the support team, I'd rather avoid that if possible.  Open to the discussion if it's the right thing to do for now, though.\n\nAlternately if anyone needs any extra hands getting stuff upgraded to work with the latest clj-parent, I can probably carve out some time to help with that.", "created": "2016-11-21T10:13:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Strangely enough, file sync is affected by this issue too (presumably because we have tests which only load the storage service, which uses tk-status but not the scheduler)", "created": "2016-11-30T11:56:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm hoping to find some time to get up a PR for TK-414 soon-ish.  That PR will introduce a second and more concrete dependency from tk-status to tk-scheduler.  So I'm still in the camp of \"Closed - won't fix\" on this ticket.", "created": "2016-12-06T10:52:00.000000"}, {"author": "6361cbfc59c794184bcbd33a", "body": "I'm fine with that outcome. At this point, we've made the necessary PE module changes and there's not really anything to be gained by _now_ changing it to be optional.", "created": "2016-12-06T11:10:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:63d4062f69c7ae3958d276ed] thanks - and again, your point about figuring out a better way to version clj-parent and make sure we understand the scope of new changes that land there is totally valid.", "created": "2016-12-06T11:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-18T15:51:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3a3468e9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza82v:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Nov/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1558253562_*|*_6_*:*_1_*:*_0"}], "description": "in TK-400, a dependency on tk-scheduler was introduced into tk-status, which subsequently got picked up in clj-parent. \n\nThis means that any project that uses clj-parent will need to add the scheduler service to their bootstrap, even if they don't use the status logging feature, which is disabled by default.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10295", "fixedVersions": [], "id": "10295", "issueType": "Improvement", "key": "TK-423", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Won't Fix", "resolutionDate": "2016-12-06T16:42:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Make tk-scheduler an optional dependency in tk-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "I think this maybe got tagged SCR rather than Systems Engineering accidentally so just updated the team accordingly.", "created": "2017-04-06T03:54:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] is this still blocked on something?", "created": "2017-04-20T10:53:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:3da95088-202d-4082-a15a-eb2e812f2578], I think this one has been subsumed by other more specific tickets in the \"Drop Java 7\" epic so I'd be fine closing it out as a duplicate at this point.  [~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e], since you submitted this originally, are you good with us closing it?", "created": "2017-04-20T11:18:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-16T12:31:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@32b94628"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza5yv:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Dec/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_533462892_*|*_5_*:*_1_*:*_5538585151_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_13281113701"}], "description": "Java 7 has been EOL since April 2015 (https://java.com/en/download/faq/java_7.xml), so trapperkeeper should plan on ending support for it.\n\nThere are a few platforms that don't have java 8 (looking at you ubuntu trusty), so those should be considered when dropping support.", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10259", "fixedVersions": ["TK Puppet5.0"], "id": "10259", "issueType": "New Feature", "key": "TK-422", "labels": [], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Duplicate", "resolutionDate": "2017-04-25T10:54:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Drop java 7 support in TK", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] I'm assigning this to you for now just so it'll have an owner image visible on the agile board, but we can potentially swap it to me or Jeremy depending on how the sprint goes.", "created": "2016-11-16T13:03:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "!http://i157.photobucket.com/albums/t66/thedudeabides123123/stormtrooperontoiletasdas8lu.jpg!", "created": "2016-11-16T16:58:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "TK-status 0.6.0 was released and added to clj-parent in https://github.com/puppetlabs/clj-parent/pull/16", "created": "2016-11-17T17:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-16T09:58:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@308c6a40"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza5q7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Nov/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_106587079_*|*_3_*:*_1_*:*_8382323_*|*_5_*:*_1_*:*_0"}], "description": "In TK-400 we added the ability to set a config setting that would cause status/metrics/debugging data to be logged as JSON to a new debug log file at a specified interval.\n\nWe continue to experience a stream of support escalations where this feature would be extremely valuable.  However, I don't think we've yet done a tk-status release that incorporates this change.\n\nThis ticket should cover the work of doing that release and then adding the new version to clj-parent so that it will eventually be picked up by all of the projects.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10348", "fixedVersions": [], "id": "10348", "issueType": "Task", "key": "TK-421", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2016-11-17T17:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "do a release of tk-status (to pick up debug logging changes) and integrate into clj-parent", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "I'm going to go ahead and close this. Mixing Servelets and Ring handlers has been a fairly rare occurrence over the years. Mounting the servelet separately is a bit more boilerplate, but not enough that it presents a significant barrier to adding new sub-services.", "created": "2022-03-08T10:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-11-15T09:18:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2dcaf814"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza4mf:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_26738030_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_167508095924"}], "description": "The WebroutingService from trapperkeeper-webserver-jetty9 takes care of automatically mounting services using webserver and routing information specified in configuration files. However, functions such as {{add-servlet-handler}} should be parameterized so that handlers and servlets can be mounted to sub-paths under the configured route.\n\nFor example: TK-404 proposes switching to a Servlet for v2 of the metrics endpoint. The current implementation mounts a comidi routing tree under {{/metrics}} which defines the {{/v1}} endpoints. Since Ring handlers can't wrap servlets, the new endpoint has to be mounted directly as {{/metrics/v2}} as it can't be added to comidi. This sort of mount currently isn't possible with the WebroutingService since there is no way to pass a {{/[v2}} sub-path to {{add-servlet-handler}}. The low-level {{WebserverService}} has to be used instead.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10347", "fixedVersions": [], "id": "10347", "issueType": "Improvement", "key": "TK-420", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:46:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "WebroutingService should allow subpaths to be specified when adding handlers", "timeSpent": "PT0S", "updated": "2022-03-08T10:46:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-11-07T16:38:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1e07a7fd"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza02n:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_86725538_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_168111942671"}], "description": "In PE-18332 we determined that if multiple Jetty servers in the same process attempt to share the same logback-access configuration, and that configuration uses logback's rotation mechanisms to archive and rotate log files, then it appears that as soon as one of the servers notices that the log file has reached capacity, it will rotate it in a way that prevents the second server from noticing that it has changed.  The second server may be continuing to try to log messages to a file handle that is no longer valid, but the practical implication is that the second server's log messages are lost.\n\nWe should come up with a simple reproducer for this, both to make sure that we understand what is going on, and so that we can file a bug with the upstream.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10426", "fixedVersions": [], "id": "10426", "issueType": "Bug", "key": "TK-419", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "File upstream bug with logback about conflict between multiple jetty servers and logback's log file rotation mechanism", "timeSpent": "PT0S", "updated": "2022-03-08T10:29:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Just FYI - wasn't sure that filing in TK was sufficient to make sure y'all would see it.", "created": "2016-10-31T12:45:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] this came up in our maintainer triage meeting yesterday and we weren't quite sure what to do with it.\n\nLooking at your log, we believe that it was just an unlucky coincidence of timing.  Here's a couple things that I believe to be true:\n\n1. The \"Shutting down due to JVM shutdown hook\" message should only be logged if the shutdown was initiated by an external signal - it should not be logged if we are shutting down due to an exception.\n2. There is a different message (don't have an example of it in front of me, can find it if needed) that should *always* be logged that indicates that we're shutting down due to an exception, which should hopefully be sufficient to distinguish from a shutdown due to a signal.\n3. In the case of a shutdown due to a signal, trying to determine where that signal came from seems like a very tricky problem - if it's possible to do something useful there at all, the implementation details are likely to differ between different platforms that we support.  So my inclination is that the ROI on this path would be low.  I'm open to discussing this further if anyone disagrees.\n\nSo, in the short term, I'm not 100% sure if there's anything actionable to do here?  We could most definitely make some tweaks to the text of the log messages for #1 and #2 and I'd be more than happy to do that if you think it would be helpful, so just let us know.  If you have any suggestions I'm interested in hearing them, and/or if you think #3 is worth further conversation.\n\nThanks!", "created": "2016-11-02T11:47:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] Ping.  Any thoughts on [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]'s comments above?", "created": "2016-11-22T16:40:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "Oh whoops sorry, I missed this last time. Yeah looking back at this I think this was a bug that someone else figured out was originating from elsewhere. Chris's comments make sense. If the log message could state explicitly that the trigger for the shutdown is external, that might help in the future.", "created": "2016-11-22T17:26:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:13:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-10-31T12:44:00.000000", "creator": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@62ec1d35"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz9vdb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Nov/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2523522913_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_166296651274"}], "description": "See this log for an example: https://gist.github.com/lindboe/9b0a7f25f5224815bf3b1ac7a398a9ec\n\nWhen trapperkeeper services shut down unexpectedly, it can be a little hard to figure out why. In the above log, it's hard to tell if the file sync error caused a shutdown or if it's unrelated.\n\nNow I don't know a lot about what information we can get about a signal, but from what little I do know I'm pretty sure at least the PID that sent the signal should be available, so we'd be able to differentiate if it was from a puppet run or directly from a user (confirmed? by looking at here http://serverfault.com/questions/94956/how-to-find-out-the-source-of-a-posix-signal). There might be other ways of providing better logging too.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10567", "fixedVersions": [], "id": "10567", "issueType": "Bug", "key": "TK-418", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:13:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Need better logging about what causes a JVM shutdown hook", "timeSpent": "PT0S", "updated": "2022-03-08T10:13:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-10-27T17:04:00.000000", "creator": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4c34f8a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz9tjj:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_432848533_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_168719106597"}], "description": "tk-status has a default timeout for each level but also accepts a timeout param. Since the timeout param is not passed on the services status function that have slow external requests often return and 'unknown' status.\n\ntk-status should allow status functions that handle a timeout to be registered.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10634", "fixedVersions": [], "id": "10634", "issueType": "Improvement", "key": "TK-417", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:43:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-status should pass timeouts to callbacks", "timeSpent": "PT0S", "updated": "2022-03-08T10:43:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-10-27T15:13:00.000000", "creator": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7772a283"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz9tef:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_8056_*|*_10007_*:*_1_*:*_167627623621_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1441656"}], "description": "In various places in PE we need to decide whether services are healthy and available. For consistency any states that are deemed unhealthy should result in an alert in the console and puppet-infra tool. That means we need to implement logic in the service status to generate this alert. For consistency we should then reuse the value from the alert in the consuming service instead of separately computing availability from the raw status info. This is currently very difficult because the alert schema only includes plain text information.\n\nTo remedy this problem we should add a \"type\" and \"details\" key to alerts so they can be consumed programatically.\n\n{noformat}\n{:severity (schema/enum :error :warning :info)\n   :message schema/Str\n  (schema/maybe :type) schema/Keyword\n   (schema/maybe :details) schema/Map}\n{noformat}\n\nWe should also write some opinionated documentation about how alerts should be used.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10437", "fixedVersions": [], "id": "10437", "issueType": "Improvement", "key": "TK-416", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-status alerts should include machine usable information", "timeSpent": "PT0S", "updated": "2022-02-18T17:51:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:ef2e2611-7893-499f-94ad-b7b2245beace", "body": "Ugh, if the description of this ticket is terrible please let me know and I can try to reword it. I tried to explain the problem that I mentioned to you guys this morning but it might still be unclear. [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]", "created": "2016-10-27T10:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-10-27T10:15:00.000000", "creator": "70121:ef2e2611-7893-499f-94ad-b7b2245beace", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@48069e3b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza5z3:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_457108569_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_168718520394"}], "description": "As a trapperkeeper user, when I bring in a library like trapperkeeper-status that uses other trapperkeeper services that my project does not, it would be great if those dependencies could some how be automatically brought in or warn me about what I should add to my bootstrap.cfg instead of just claiming that a service is missing.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10632", "fixedVersions": [], "id": "10632", "issueType": "Task", "key": "TK-415", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:ef2e2611-7893-499f-94ad-b7b2245beace", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Inform users about or resolve other TK dependencies", "timeSpent": "PT0S", "updated": "2022-03-08T10:29:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-10-05T15:02:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5fd8ee5b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyotuv:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1130985638_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_168399469380"}], "description": "[This thread|https://groups.google.com/a/puppet.com/forum/?utm_medium=email&utm_source=footer#!msg/discuss-ci-next/3UZwzHTO-Y4/EIuGDbSkAgAJ] talks about some new functionality that QE is rolling out that will allow us to define jenkins jobs via the Jenkins JobDSL, by adding groovy scripts directly in the repos that the jobs belong to.  Over time this will drastically reduce, if not eliminate, JJB from our job management strategy.\n\nWe should experiment with this on one of the TK repos like kitchensink, and start to get a feel for how it will map to the larger projects.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10346", "fixedVersions": [], "id": "10346", "issueType": "Task", "key": "TK-412", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:49:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "experiment with new JobDSL capabilities from QE, on some TK repo", "timeSpent": "PT0S", "updated": "2022-02-18T17:49:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "created": "2016-10-03T16:37:00.000000", "name": "gcviewer.png", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10052"}], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e754d94742a00683f7cf0] thanks for filing this.  If you had time to look at PE-13346 / https://github.com/cprice404/trapperkeeper-status/tree/feature/master/PE-13346-add-gc-metrics I'd like to hear what you think.  I think the GC CPU percentage metric that I have in that branch might be more intuitive to users, but I could see us adding both that *and* what you have in your PR.  WDYT?", "created": "2016-10-03T12:37:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "The CPU percentage looks like a great idea to me. However, the raw collection count is very simple (doesn't require a sampling thread or averaging) and we can get a lot of milage out of it. For example, one of the current methods that we have for diagnosing GC panic is to enable GC logging and observe how many major collections are occurring over time (example image attached, black verticals are major collections). If we see a dramatic ramp-up in collection times with no drop in heap usage, this is a very reliable sign that there is an issue with memory.\n\nIf folks could easily get the count and graph it over time, any sustained deviation from a linear increase in the number, a \"hockystick\", should give us the same info as observing the GC log.", "created": "2016-10-03T16:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] cool.  Somewhat tangential, but did you see #58 / TK-400?  Just FYI that that landed, should help with some of this stuff going forward.", "created": "2016-10-04T11:39:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "A big +1 to TK-400. That means someday we'll be able to dispense with the ad-hoc \"curl /status from a cron job\" that we've been using to troubleshoot some performance issues.", "created": "2016-10-04T13:11:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-10-01T20:40:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2a70563"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz977r:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Oct/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1456445636_*|*_6_*:*_1_*:*_0"}], "description": "The trapperkeeper-status service includes a selection of JVM metrics that currently includes memory usage and process uptime. Two useful additions to this metrics set would be:\n\n  - File descriptor usage and limit. This could be monitored to determine if the service is leaking unclosed descriptors or needs an increase in the limit.\n\n  - GC counts and total collection times for each collector. A dramatic increase in the count or time is a strong sign that a memory leak is taking place, or memory limits need to be increased.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10436", "fixedVersions": [], "id": "10436", "issueType": "Improvement", "key": "TK-409", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2016-10-18T17:14:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add gc counts and file descriptor usage to trapperkeeper-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-09-29T10:40:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@e37eba5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymttj:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_102617_*|*_10007_*:*_1_*:*_307886878_*|*_3_*:*_1_*:*_74126279_*|*_10009_*:*_1_*:*_79523749_*|*_5_*:*_1_*:*_0"}], "description": "Cursive does some magic hackery to get lein working well with multiple projects.  Those hacks currently break the workflow of lein-parent with lein 2.7.1.  The author is aware of the issue and I think he knows what the fix is, but I have no idea when he'll get around to it.\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] helped me to brainstorm some temporary workarounds that might allow us to move forward with the lein-parent work, and get it working in Cursive, without waiting for the upstream Cursive fix.  This ticket captures the work of investigating and implementing one of those workarounds, with the goal of not having to include any code in the project.clj files that we would need to come back and remove later.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10566", "fixedVersions": [], "id": "10566", "issueType": "Bug", "key": "TK-408", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-10-04T18:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "workaround for lack of lein 2.7.1/lein-parent support in Cursive", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-09-29T10:33:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@fbb58fc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymttb:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_513537_*|*_10007_*:*_1_*:*_380999769_*|*_3_*:*_1_*:*_1007902_*|*_10009_*:*_1_*:*_79526922_*|*_5_*:*_1_*:*_0"}], "description": "The current code for lein parent attempts to resolve the parent artifact without passing any additional repositories to aether, which means that it will only work if you've locally installed the parent artifact via `lein install`, or if the artifact has been pushed to maven central.\n\nIt appears that it should be possible to access the child project's {{repositories}} data when attempting to resolve the artifact, so hopefully it's just a matter of wiring that in to the call to aether.\n\nThe fix should be easy, but then I'll need to get a PR merged and released in the upstream :/", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10435", "fixedVersions": [], "id": "10435", "issueType": "Bug", "key": "TK-407", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-10-04T18:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "lein-parent does not honor project's repositories", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-09-21T17:31:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72f9c420"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz8yz3:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_12178_*|*_10007_*:*_1_*:*_79198774_*|*_3_*:*_1_*:*_349922987_*|*_10009_*:*_1_*:*_244529536_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_67346023"}], "description": "Lein 2.7.1 is out, and contains my fix for TK-403.  Need to roll it out to the Jenkins servers before we switch any projects over.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10425", "fixedVersions": [], "id": "10425", "issueType": "Bug", "key": "TK-406", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-09-30T07:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Roll out lein 2.7.1 to jenkins servers", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [d626551|https://github.com/puppetlabs/trapperkeeper/commit/d626551340528a468ba5d11ce74034b6eaada8e7].", "created": "2016-09-29T18:14:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Passed Jenkins CI for Trapperkeeper at https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper_init-merge_full_master/50/ so resolving.", "created": "2016-09-29T18:15:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-21T13:00:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@46d2e24d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1237"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz8yyf:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_184633243_*|*_1_*:*_1_*:*_13090_*|*_10007_*:*_1_*:*_424662575_*|*_3_*:*_1_*:*_100848498_*|*_5_*:*_1_*:*_0"}], "description": "This ticket is related to the work added to Trapperkeeper in TK-345.  That work involved adding support for a restart-file setting, specified via the global section in a Trapperkeeper configuration, which is used by Trapperkeeper to increment the contents of a file on disk after all services have been started.\n\nThe current work leads to the need to specify the restart-file setting in two places - Trapperkeeper and Ezbake config (at package build time).  If the restart-file flag were possible to specify as a command line argument to Trapperkeeper instead, though, it would be possible to template in the specification of the argument during Ezbake package builds, eliminating the requirement for shadowing the config in two different places and, therefore, making the work to upgrade a project to the newer Ezbake version easier.  Additionally, a new optional CLI arg would help preserve backward compatibility for package upgrades - not requiring users who may have modified the global.conf file after package install to reconcile the presence of the new setting on upgrading to a newer package version.\n\nThis ticket would involve allowing the restart-file setting to be specified on the Trapperkeeper command line.  The new work would preserve the ability to specify the restart-file setting via Trapperkeeper configuration but the value from the command line would override the value from the Trapperkeeper configuration (in the probably very unlikely event) that both were specified.", "epicLinkSummary": "HUP service / ezbake integration", "estimate": "PT0S", "externalId": "10631", "fixedVersions": ["TK 1.5.1"], "id": "10631", "issueType": "Improvement", "key": "TK-405", "labels": [], "originalEstimate": "PT0S", "parent": "16403", "parentSummary": "HUP service / ezbake integration", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-09-29T18:16:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow restart-file setting to be specified via CLI arg", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "As a possible implementation, the ActiveMQ server ships with a library called [Jolokia|https://jolokia.org], which implements a JMX REST API that includes the functionality described above. The PE build of ActiveMQ is missing a couple of bits, to fully enable it:\n\n  - Download and unpack the upstream tarball. The URL will change as new versions are released, but currently: http://www.apache.org/dist/activemq/5.13.4/apache-activemq-5.13.4-bin.tar.gz\n    The bits we're extracting are fairly static configuration files that shouldn't change much as new versions are released.\n\n  - Copy the API webapp into place:\n\n{code:bash}\ncp -r apache-activemq-5.13.4/webapps/api /opt/puppetlabs/server/apps/activemq/webapps\nchown -R pe-activemq:pe-activemq /opt/puppetlabs/server/apps/activemq/webapps/api\n{code}\n\n  - Update the jetty.xml file:\n\n{code:bash}\ncp apache-activemq-5.13.4/conf/jetty.xml /etc/puppetlabs/activemq/\nchown root:pe-activemq /etc/puppetlabs/activemq/jetty-realm.properties\n{code}\n\n  - Enable the ActiveMQ web console:\n\n{code:bash}\nmkdir -p /etc/puppetlabs/code/environments/production/hieradata/\necho 'puppet_enterprise::profile::amq::broker::enable_web_console: true' >> /etc/puppetlabs/code/environments/production/hieradata/common.yaml\npuppet agent -t\n{code}\n\nNow, the Jolokia JMX API should be accessible on port 8161, with username admin and password admin. An example of a search that uses both globbing and attribute extraction to get the collection count and last collection time for each configured Garbage Collector:\n\n{noformat}\n# curl -s -u admin:admin 'http://127.0.0.1:8161/api/jolokia/read/java.lang:name=*,type=GarbageCollector/CollectionCount,CollectionTime'|python -m json.tool\n{\n    \"request\": {\n        \"attribute\": [\n            \"CollectionCount\",\n            \"CollectionTime\"\n        ],\n        \"mbean\": \"java.lang:name=*,type=GarbageCollector\",\n        \"type\": \"read\"\n    },\n    \"status\": 200,\n    \"timestamp\": 1473992161,\n    \"value\": {\n        \"java.lang:name=PS MarkSweep,type=GarbageCollector\": {\n            \"CollectionCount\": 1,\n            \"CollectionTime\": 64\n        },\n        \"java.lang:name=PS Scavenge,type=GarbageCollector\": {\n            \"CollectionCount\": 10,\n            \"CollectionTime\": 114\n        }\n    }\n}\n{noformat}\n\nMore details on the REST methods supported by the API can be found here:\n\nhttps://jolokia.org/reference/html/protocol.html", "created": "2016-09-15T20:16:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Thanks for the research, [~accountid:623e754d94742a00683f7cf0]!\n\nWhen we get a chance to look into this, what I'd like to see if we can do is find a Servlet class inside of jolokia, and just mount that at `/metrics/v2`, which should be able to be done inside the `trapperkeeper-metrics` library.", "created": "2016-09-16T11:10:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "@charlie said he got it working like this:\n\n{code}\nadd the following dep to project.clj: [org.jolokia/jolokia-core \"1.3.4\"]\n\n(ns example.jolokia-web-service\n  (:import [org.jolokia.http AgentServlet])\n  (:require [clojure.tools.logging :as log]\n            [compojure.core :as compojure]\n            [puppetlabs.trapperkeeper.core :as trapperkeeper]\n            [puppetlabs.trapperkeeper.services :as tk-services]))\n\n(trapperkeeper/defservice jolokia-web-service\n   [[:WebserverService add-servlet-handler]]\n  (init [this context]\n    (log/info \"Initializing Jolokia webservice\")\n    (add-servlet-handler (AgentServlet.) \"/jolokia\")\n        context)\n{code}\n\nWe would just need to figure out how to wedge that servlet into a ring handler here:\nhttps://github.com/puppetlabs/trapperkeeper-metrics/blob/fbe7662b06b14ddf06a65d16a31cecdc30ca0a39/src/puppetlabs/trapperkeeper/services/metrics/metrics_core.clj#L89\n", "created": "2016-09-16T11:59:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]: Opened a PR with a quick spike that patches Jolokia into trapperkeeper-metrics. I re-built the pe-puppetserver uberjar to include the spike and things appear to be working as expected.", "created": "2016-09-16T14:56:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-metrics#master at [c5b674|https://github.com/puppetlabs/trapperkeeper-metrics/commit/c5b67405995c3c61fec58dd6a5a562e2b098fa19].  Released in trapperkeeper-metrics version 0.5.0.\n\ntrapperkeeper-metrics 0.5.0 has not yet been rolled up into any consuming projects.  I'm going to close this ticket out, though, with the expectation that the rolling up would happen as part of PE-17314.", "created": "2017-01-09T11:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-15T19:53:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@48863b19"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymtxr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Sep/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2152348741_*|*_1_*:*_2_*:*_2142820369_*|*_10007_*:*_2_*:*_2470600061_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_105025002_*|*_10006_*:*_1_*:*_3126095981"}], "description": "JMX supports retrieving several MBeans at once using globbing:\n\nhttps://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html\n\nThis would be especially useful for Puppet Server, which tracks metrics on a per-node basis:\n\n{code}\nmetrics/v1/mbeans/*.compiler.compile.*.<some slow node>*\n{code}\n\nCurrently, one would have to hit the root {{metrics/v1/mbeans}} endpoint, pipe the results to a script that greps out the relevant mbeans and then pipe *those* results to a script that forms a compound request.\n\nIt would also be nice to return only a specific attribute from a MBean. For example, querying the GarbageCollector MBean returns a lot of data:\n\n{noformat}\n# curl -k 'https://127.0.0.1:8140/metrics/v1/mbeans/java.lang:type=GarbageCollector,name=PS+Scavenge'|python -m json.tool\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n100  1723  100  1723    0     0  19571      0 --:--:-- --:--:-- --:--:-- 19804\n{\n    \"CollectionCount\": 167,\n    \"CollectionTime\": 2053,\n    \"LastGcInfo\": {\n        \"GcThreadCount\": 2,\n        \"duration\": 6,\n        \"endTime\": 2036911,\n        \"id\": 167,\n        \"memoryUsageAfterGc\": {\n            \"Code Cache\": {\n                \"key\": \"Code Cache\",\n                \"value\": {\n                    \"committed\": 41943040,\n                    \"init\": 2555904,\n                    \"max\": 251658240,\n                    \"used\": 41526656\n                }\n            },\n            \"Compressed Class Space\": {\n                \"key\": \"Compressed Class Space\",\n                \"value\": {\n                    \"committed\": 55296000,\n                    \"init\": 0,\n                    \"max\": 1073741824,\n                    \"used\": 26451312\n                }\n            },\n            \"Metaspace\": {\n                \"key\": \"Metaspace\",\n                \"value\": {\n                    \"committed\": 185057280,\n                    \"init\": 0,\n                    \"max\": -1,\n                    \"used\": 111937088\n                }\n            },\n            \"PS Eden Space\": {\n                \"key\": \"PS Eden Space\",\n                \"value\": {\n                    \"committed\": 51380224,\n                    \"init\": 34078720,\n                    \"max\": 55574528,\n                    \"used\": 0\n                }\n            },\n            \"PS Old Gen\": {\n                \"key\": \"PS Old Gen\",\n                \"value\": {\n                    \"committed\": 179306496,\n                    \"init\": 89653248,\n                    \"max\": 179306496,\n                    \"used\": 149947456\n                }\n            },\n            \"PS Survivor Space\": {\n                \"key\": \"PS Survivor Space\",\n                \"value\": {\n                    \"committed\": 17301504,\n                    \"init\": 5242880,\n                    \"max\": 17301504,\n                    \"used\": 1738920\n                }\n            }\n        },\n        \"memoryUsageBeforeGc\": {\n            \"Code Cache\": {\n                \"key\": \"Code Cache\",\n                \"value\": {\n                    \"committed\": 41943040,\n                    \"init\": 2555904,\n                    \"max\": 251658240,\n                    \"used\": 41526656\n                }\n            },\n            \"Compressed Class Space\": {\n                \"key\": \"Compressed Class Space\",\n                \"value\": {\n                    \"committed\": 55296000,\n                    \"init\": 0,\n                    \"max\": 1073741824,\n                    \"used\": 26451312\n                }\n            },\n            \"Metaspace\": {\n                \"key\": \"Metaspace\",\n                \"value\": {\n                    \"committed\": 185057280,\n                    \"init\": 0,\n                    \"max\": -1,\n                    \"used\": 111937088\n                }\n            },\n            \"PS Eden Space\": {\n                \"key\": \"PS Eden Space\",\n                \"value\": {\n                    \"committed\": 51380224,\n                    \"init\": 34078720,\n                    \"max\": 55574528,\n                    \"used\": 51380224\n                }\n            },\n            \"PS Old Gen\": {\n                \"key\": \"PS Old Gen\",\n                \"value\": {\n                    \"committed\": 179306496,\n                    \"init\": 89653248,\n                    \"max\": 179306496,\n                    \"used\": 149947456\n                }\n            },\n            \"PS Survivor Space\": {\n                \"key\": \"PS Survivor Space\",\n                \"value\": {\n                    \"committed\": 16252928,\n                    \"init\": 5242880,\n                    \"max\": 16252928,\n                    \"used\": 1474336\n                }\n            }\n        },\n        \"startTime\": 2036905\n    },\n    \"MemoryPoolNames\": \"[Ljava.lang.String;@29028c4b\",\n    \"Name\": \"PS Scavenge\",\n    \"ObjectName\": \"java.lang:type=GarbageCollector,name=PS Scavenge\",\n    \"Valid\": true\n}\n{noformat}\n\nIt would be great to pull out a single attribute, such as the {{CollectionCount}}.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10629", "fixedVersions": [], "id": "10629", "issueType": "Improvement", "key": "TK-404", "labels": ["maintenance", "metrics"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Done", "resolutionDate": "2017-01-09T11:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add JMX globbing and atribute filtering to metrics endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-09-15T18:36:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5b9e2e27"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymu3z:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_81910343_*|*_10007_*:*_1_*:*_499963596_*|*_10009_*:*_1_*:*_673660069_*|*_5_*:*_1_*:*_0"}], "description": "Apparently in all of my testing on the lein-parent/managed-dependencies stuff, I never tried it with a non-SNAPSHOT version of a project.\n\nWhen you do that, it triggers this line of code:\n\nhttps://github.com/technomancy/leiningen/blob/33eca8dba1bc9f01f94e21f7053702955a73b23a/src/leiningen/pom.clj#L370\n\nThat line throws an NPE on the `(second %)`, because there are dependencies in the dependencies vector that only have a single item in their tuple, since they inherit the version from the `managed-dependencies` section.  Will need to file a patch against lein.\n\nI don't expect the fix to take long at all, but timeliness of review / release of bugfix version will again be out of our control.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10565", "fixedVersions": [], "id": "10565", "issueType": "Bug", "key": "TK-403", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Blocker", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-09-30T07:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bug in lein 2.7.0 when using managed-deps and trying to release a non-SNAPSHOT version of an artifact", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Two options for solving this problem might be to have a {{:metrics-prefix}} client option that could take a prefix to set or a {{:metrics-server-id}} option to just take the server id? And then the metrics would be {{<prefix>.http-client.experimental}} or {{puppetlabs.<server-id>.http-client.experimental}}.", "created": "2016-09-15T16:52:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] for maximum compatibility / consistency with pe-tk-metrics it seems like maybe we'd want to do both of those?\n\nAnd I'm guessing that we can have those args be passed in at the point in time when you are creating the client, so that they don't need to be passed in every http request, right?\n\nHow much work do you think it would be to do both?  And did you already have an inclination towards one or the other, or both?", "created": "2016-09-15T16:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think for looking at puppet server metrics in graphite, having the server-id in these one way or another would be pretty important / useful.", "created": "2016-09-15T16:58:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Agreed that having the server-id in these one way or another would be very useful. I think these can be client options - i.e. we only set them when we create the client.\n\nI think I'm leaning towards just having a server-id option since that matches best with how our other projects create metric names - that would be very easy to add. The only thing that make adding both be a little more work is what do we do if you set both? I guess if you set the prefix option and the server-id option maybe the prefix would just win out? But also not very much work to do. (Just server-id would be like 30 minutes of work, doing both probably an hour?)", "created": "2016-09-15T17:13:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "OK.  I think it'd probably be best to support both if it's that easy, and either error out if both are passed in, or just let prefix win and log a warning message or something.", "created": "2016-09-16T12:21:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-15T16:50:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@677a29b0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz8vdz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Sep/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_66219327_*|*_1_*:*_1_*:*_499516597_*|*_10007_*:*_1_*:*_103143132_*|*_3_*:*_1_*:*_414558891_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_627740822"}], "description": "Currently the metrics created by the http-client if provided a {{MetricRegistry}} are prefixed with {{puppetlabs.http-client.experimental}}. However, for filtering metrics before exporting them to a reporter such as Graphite, pe-trapperkeeper-metrics expects that metrics are prefixed by {{puppetlabs.<server-id>}}.\n\npe-tk-metrics has a {{metrics-prefix}} setting that allows for specifying a different prefix for a registry, but then the http-client metrics would need to be in their own metrics registry since other libraries don't have the same prefix.\n\nThis ticket involves adding two new client options: {{metrics-prefix}} and {{server-id}}. If {{server-id}} is set, then the metrics prefix is {{puppetlabs.<server-id>.http-client.experimental}}. If {{metrics-prefix}} is set, then the full prefix is {{<metrics-prefix>.http-client.experimental}}. If both are set, then {{metrics-prefix}} overrides the {{server-id}}, and a warning message is logged.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10434", "fixedVersions": [], "id": "10434", "issueType": "Bug", "key": "TK-402", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-10-05T12:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client: metrics prefix is not compatible with graphite metrics filtering", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "It would be awesome to get this backported to the LTS. Without a service name, that error message is really bad --- it tells us that some Trapperkeeper service is locked up to the point where status can't even be reported, but absolutely no clues as to which service.", "created": "2017-09-09T20:35:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "So what's the route to requesting a backport [~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b], [~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100]? /cc [~accountid:557058:96a443bf-a3ab-426b-9442-ce50c9977428]", "created": "2017-09-21T16:10:00.000000"}, {"author": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "body": "submitted to the release leads for approval today.", "created": "2017-09-21T16:53:00.000000"}, {"author": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "body": "Approved for backport into the LTS", "created": "2017-09-25T11:03:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-15T05:24:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ac9f44e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Needs Priority"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hza6mn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Oct/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_509158247_*|*_1_*:*_2_*:*_630392167_*|*_10007_*:*_1_*:*_76282508_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_3717226170_*|*_10005_*:*_1_*:*_3473005553"}], "description": "When a status callback times-out, it currently logs \"Status callback timed out, shutting down background task\"; this isn't terribly helpful at the moment because it doesn't indicate *which* callback timed-out (i.e. which TK service).  The service name should be added to that log message ... and perhaps any other information which might help debug this situation.\n\nHere's a real-world example of this:\n\n{code}\n2016-06-20 23:59:22,126 ERROR [clojure-agent-send-off-pool-17636] [p.t.s.s.status-core] Status callback timed out, shutting down background task\n2016-06-20 23:59:22,127 ERROR [clojure-agent-send-off-pool-17636] [p.t.s.s.status-core] #error {\n :cause nil\n :via\n [{:type java.util.concurrent.CancellationException\n   :message nil\n   :at [java.util.concurrent.FutureTask report FutureTask.java 121]}]\n :trace\n [[java.util.concurrent.FutureTask report FutureTask.java 121]\n  [java.util.concurrent.FutureTask get FutureTask.java 192]\n  [clojure.core$deref_future invoke core.clj 2186]\n  [clojure.core$future_call$reify__6736 deref core.clj 6683]\n  [clojure.core$deref invoke core.clj 2206]\n  [puppetlabs.trapperkeeper.services.status.status_core$eval29953$guarded_status_fn_call__29958$fn__29959$fn__29969 invoke status_core.clj 233]\n  [puppetlabs.trapperkeeper.services.status.status_core$eval29953$guarded_status_fn_call__29958$fn__29959 invoke status_core.clj 233]\n  [puppetlabs.trapperkeeper.services.status.status_core$eval29953$guarded_status_fn_call__29958 invoke status_core.clj 216]\n  [puppetlabs.trapperkeeper.services.status.status_service$reify__43521$service_fnk__5254__auto___positional$reify__43528 get_status status_service.clj 43]\n  [puppetlabs.trapperkeeper.services.status.status_service$eval43479$fn__43480$G__43471__43485 invoke status_service.clj 7]\n  [puppetlabs.trapperkeeper.services.status.status_service$eval43479$fn__43480$G__43470__43491 invoke status_service.clj 7]\n  [clojure.core$partial$fn__4527 invoke core.clj 2495]\n  [clojure.core$partial$fn__4531 invoke core.clj 2506]\n  [puppetlabs.code_manager.status$status invoke status.clj 17]\n  [clojure.core$partial$fn__4529 invoke core.clj 2500]\n  [puppetlabs.trapperkeeper.services.status.status_core$eval29953$guarded_status_fn_call__29958$fn__29959$fn__29962 invoke status_core.clj 235]\n  [clojure.core$binding_conveyor_fn$fn__4444 invoke core.clj 1916]\n  [clojure.lang.AFn call AFn.java 18]\n  [java.util.concurrent.FutureTask run FutureTask.java 266]\n  [java.util.concurrent.ThreadPoolExecutor runWorker ThreadPoolExecutor.java 1142]\n  [java.util.concurrent.ThreadPoolExecutor$Worker run ThreadPoolExecutor.java 617]\n  [java.lang.Thread run Thread.java 745]]}\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10424", "fixedVersions": [], "id": "10424", "issueType": "Improvement", "key": "TK-401", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2016-12-21T11:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Status Service: log more information when a callback times-out", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "body": "[~accountid:557058:41dc5120-addb-42c7-aff4-2d00c35c948c] Is this ticket right? Seems like it should be in the trapperkeeper project...", "created": "2016-10-03T10:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-14T16:36:00.000000", "creator": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4d82568"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1550"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz991z:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Oct/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_338827513_*|*_1_*:*_1_*:*_1787394502_*|*_10007_*:*_2_*:*_154413216_*|*_3_*:*_1_*:*_114874564_*|*_5_*:*_2_*:*_665833_*|*_10006_*:*_1_*:*_610423428"}], "epicLinkSummary": "String externalization for Internationalization in SysEng-related repos", "estimate": "PT0S", "externalId": "10433", "fixedVersions": [], "id": "10433", "issueType": "Improvement", "key": "TK-411", "labels": [], "originalEstimate": "PT0S", "parent": "15316", "parentSummary": "String externalization for Internationalization in SysEng-related repos", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "resolution": "Fixed", "resolutionDate": "2016-10-19T11:46:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Externalize user facing strings in the trapperkeeper repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "body": "[~accountid:557058:41dc5120-addb-42c7-aff4-2d00c35c948c] Seems like this should be in the trapperkeeper repo too", "created": "2016-10-03T10:01:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-webserver-jetty9#master at [aa74f59|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/aa74f5983d08b4748b9176db5750f70b6b1d35fb].", "created": "2016-10-20T11:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-14T16:27:00.000000", "creator": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1cf26411"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1550"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymn3b:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Oct/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_428812073_*|*_1_*:*_1_*:*_1787880213_*|*_10007_*:*_1_*:*_239708805_*|*_3_*:*_1_*:*_261207187_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_802933085"}], "epicLinkSummary": "String externalization for Internationalization in SysEng-related repos", "estimate": "PT0S", "externalId": "10229", "fixedVersions": ["TK-JETTY9 1.6.0"], "id": "10229", "issueType": "Improvement", "key": "TK-410", "labels": ["i18n"], "originalEstimate": "PT0S", "parent": "15316", "parentSummary": "String externalization for Internationalization in SysEng-related repos", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "resolution": "Fixed", "resolutionDate": "2016-10-25T10:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Externalize user facing strings in the tk-webserver-jetty9 repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-status#master at [387cf2|https://github.com/puppetlabs/trapperkeeper-status/commit/387cf21c401c9e5839d5a6acc0df443f209d3f6f].", "created": "2016-09-28T16:56:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Unit tests in Jenkins passed after the merge, so marking this resolved.", "created": "2016-09-28T16:57:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-09-07T10:52:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@44de6744"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymu07:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Sep/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_39984_*|*_1_*:*_1_*:*_57985_*|*_10007_*:*_1_*:*_88307781_*|*_3_*:*_1_*:*_1747888683_*|*_5_*:*_1_*:*_0"}], "description": "For testing and debugging purposes, it would be nice to be able to configure the tk-status-service to periodically log status data to a file.\n\nThis might take the form of:\n1. The status service would create a periodic background thread to log status data\n2. Additions to a project's TK config to enable the logging and specify the frequency\n3. Additions to a project's logback.xml to route logging events from only the namespace in tk-status doing the periodic logging, to a file also specified in logback.xml\n\nObviously this should be disabled by default\n\nAdditionally, the logback.xml changes should include a cap on the maximum size. Docs here on how to do that: http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedRollingPolicy", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10423", "fixedVersions": ["TK 1.y"], "id": "10423", "issueType": "Improvement", "key": "TK-400", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Done", "resolutionDate": "2016-09-28T16:57:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Log status data periodically", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to jruby-utils#master at [65059c4|https://github.com/puppetlabs/jruby-utils/commit/65059c48b326925b69d29c41996270ffa1ce2677].", "created": "2016-08-30T17:53:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "This was just a test change and the suite passed through the subsequent run of jruby-utils in Jenkins, so I don't think it warrants any further QA review.  Marking this resolved.  /CC [~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] and [~accountid:557058:5f73e620-a5f5-44a8-a863-f1e0061b987a].", "created": "2016-08-30T17:54:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I concur. Thanks for the ping!", "created": "2016-08-31T11:54:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-08-30T00:10:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5ce7e6f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz8kjj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Aug/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_23745_*|*_10007_*:*_1_*:*_62918813_*|*_3_*:*_1_*:*_947091_*|*_5_*:*_1_*:*_0"}], "description": "On a jruby-utils test suite run, just ahead of the 0.2.1 release, we saw the test job hang during execution of the {{with-jruby-retry-test-via-mock-get-pool}} function in Jenkins CI.  The job was eventually aborted.\n\nThe hang appeared to happen [here|https://github.com/puppetlabs/jruby-utils/blob/0.2.1/test/unit/puppetlabs/services/jruby_pool_manager/jruby_agents_test.clj#L67], while the test was in the middle of trying to borrow a JRuby instance.  A stack trace at the point where the test was hung is below.\n\n{noformat}\n\"main\" prio=10 tid=0x0000000000ad0800 nid=0x7a0a waiting on condition [0x00007fecde770000]\n   java.lang.Thread.State: TIMED_WAITING (parking)\n       \tat sun.misc.Unsafe.park(Native Method)\n       \t- parking to wait for  <0x00000007e1fa9158> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)\n       \tat java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)\n       \tat java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)\n       \tat com.puppetlabs.jruby_utils.pool.JRubyPool.borrowItemWithTimeout(JRubyPool.java:180)\n       \tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n       \tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n       \tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n       \tat java.lang.reflect.Method.invoke(Method.java:606)\n       \tat clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)\n       \tat clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval16845$borrow_with_timeout_fn__16850$fn__16851.invoke(jruby_internal.clj:77)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval16845$borrow_with_timeout_fn__16850.invoke(jruby_internal.clj:74)\n       \tat clojure.core$partial$fn__4527.invoke(core.clj:2493)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval17091$borrow_from_pool_BANG__STAR___17096$fn__17097.invoke(jruby_internal.clj:167)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval17091$borrow_from_pool_BANG__STAR___17096.invoke(jruby_internal.clj:160)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval17138$borrow_from_pool_with_timeout__17143$fn__17144.invoke(jruby_internal.clj:207)\n       \tat puppetlabs.services.jruby_pool_manager.impl.jruby_internal$eval17138$borrow_from_pool_with_timeout__17143.invoke(jruby_internal.clj:196)\n       \tat puppetlabs.services.jruby_pool_manager.jruby_core$eval18292$borrow_from_pool_with_timeout__18297$fn__18298.invoke(jruby_core.clj:179)\n       \tat puppetlabs.services.jruby_pool_manager.jruby_core$eval18292$borrow_from_pool_with_timeout__18297.invoke(jruby_core.clj:166)\n       \tat puppetlabs.services.jruby_pool_manager.jruby_agents_test$fn__18716$fn__18719$fn__18722.invoke(jruby_agents_test.clj:67)\n       \tat clojure.core$with_redefs_fn.invoke(core.clj:7209)\n       \tat puppetlabs.services.jruby_pool_manager.jruby_agents_test$fn__18716$fn__18719.invoke(jruby_agents_test.clj:66)\n       \tat clojure.core$with_redefs_fn.invoke(core.clj:7209)\n       \tat puppetlabs.services.jruby_pool_manager.jruby_agents_test$fn__18716.invoke(jruby_agents_test.clj:49)\n       \tat clojure.test$test_var$fn__7670.invoke(test.clj:704)\n       \tat clojure.test$test_var.invoke(test.clj:704)\n       \tat clojure.test$test_vars$fn__7692$fn__7697.invoke(test.clj:722)\n       \tat clojure.test$default_fixture.invoke(test.clj:674)\n       \tat clojure.test$test_vars$fn__7692.invoke(test.clj:722)\n       \tat schema.test$validate_schemas$fn2510__2519$fn__2520.invoke(test.clj:11)\n       \tat schema.test$validate_schemas$fn2510__2519.invoke(test.clj:11)\n       \tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n       \tat clojure.lang.AFn.applyTo(AFn.java:144)\n       \tat clojure.lang.AFunction$1.doInvoke(AFunction.java:29)\n       \tat clojure.lang.RestFn.invoke(RestFn.java:397)\n       \tat schema.test$validate_schemas.invoke(test.clj:11)\n       \tat clojure.test$compose_fixtures$fn__7664$fn__7665.invoke(test.clj:681)\n       \tat clojure.test$default_fixture.invoke(test.clj:674)\n       \tat clojure.test$compose_fixtures$fn__7664.invoke(test.clj:681)\n       \tat clojure.test$test_vars.invoke(test.clj:718)\n       \tat clojure.test$test_all_vars.invoke(test.clj:728)\n       \tat clojure.test$test_ns.invoke(test.clj:747)\n       \tat clojure.core$map$fn__4553.invoke(core.clj:2624)\n       \tat clojure.lang.LazySeq.sval(LazySeq.java:40)\n       \t- locked <0x00000007dfb98978> (a clojure.lang.LazySeq)\n       \tat clojure.lang.LazySeq.seq(LazySeq.java:49)\n       \t- locked <0x00000007dfb98978> (a clojure.lang.LazySeq)\n       \tat clojure.lang.Cons.next(Cons.java:39)\n       \tat clojure.lang.RT.boundedLength(RT.java:1735)\n       \tat clojure.lang.RestFn.applyTo(RestFn.java:130)\n       \tat clojure.core$apply.invoke(core.clj:632)\n       \tat clojure.test$run_tests.doInvoke(test.clj:762)\n       \tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n       \tat clojure.core$apply.invoke(core.clj:630)\n       \tat user$eval85$fn__144$fn__175.invoke(form-init7452450637412784298.clj:1)\n       \tat user$eval85$fn__144$fn__145.invoke(form-init7452450637412784298.clj:1)\n       \tat user$eval85$fn__144.invoke(form-init7452450637412784298.clj:1)\n       \tat user$eval85.invoke(form-init7452450637412784298.clj:1)\n       \tat clojure.lang.Compiler.eval(Compiler.java:6782)\n       \tat clojure.lang.Compiler.eval(Compiler.java:6772)\n       \tat clojure.lang.Compiler.load(Compiler.java:7227)\n       \tat clojure.lang.Compiler.loadFile(Compiler.java:7165)\n       \tat clojure.main$load_script.invoke(main.clj:275)\n       \tat clojure.main$init_opt.invoke(main.clj:280)\n       \tat clojure.main$initialize.invoke(main.clj:308)\n       \tat clojure.main$null_opt.invoke(main.clj:343)\n       \tat clojure.main$main.doInvoke(main.clj:421)\n       \tat clojure.lang.RestFn.invoke(RestFn.java:421)\n       \tat clojure.lang.Var.invoke(Var.java:383)\n       \tat clojure.lang.AFn.applyToHelper(AFn.java:156)\n       \tat clojure.lang.Var.applyTo(Var.java:700)\n       \tat clojure.main.main(main.java:37)\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10258", "fixedVersions": ["None"], "id": "10258", "issueType": "Bug", "key": "TK-398", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-08-30T17:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils retry test hangs", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [97f16bd|https://github.com/puppetlabs/trapperkeeper/commit/97f16bd01e9437af2c8c70043bb36b4c37378c51].", "created": "2016-08-25T17:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-08-22T12:56:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@54cec218"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymy4n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Aug/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_322171709_*|*_1_*:*_1_*:*_16299_*|*_10007_*:*_1_*:*_275900194_*|*_3_*:*_1_*:*_114314_*|*_5_*:*_1_*:*_0"}], "description": "We recently had a support escalation where it would be really useful to see the thread IDs in the logback-access files.  It appears that this capability was added in logback-access v1.1.6, which we have not yet upgraded to.  We should go ahead and upgrade so that we'll have this option in our toolkit in the future.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10227", "fixedVersions": ["TK 1.y"], "id": "10227", "issueType": "Improvement", "key": "TK-397", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-08-29T11:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update to latest versions of logback components", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "We did a TK 1.5.1 release with the latest reload changes and tested that manually with beaker in EZ-92.  Since the PR for SERVER-1490, which bumps Puppet Server to Ezbake 1.0 and TK 1.5.1 in order to use the reload feature, has now been merged and is running in CI, resolving this ticket.", "created": "2016-09-29T18:11:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-08-19T14:44:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@303cbf03"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1237"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyncvb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Sep/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_416048219_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_3138855271"}], "description": "Once we've done some manual beaker test runs against OSS puppetserver to validate the TK/ezbake patches for HUP support, we need to do a release of TK that includes these changes.", "epicLinkSummary": "HUP service / ezbake integration", "estimate": "PT0S", "externalId": "10257", "fixedVersions": ["TK 1.5.1"], "id": "10257", "issueType": "Task", "key": "TK-396", "labels": [], "originalEstimate": "PT0S", "parent": "16403", "parentSummary": "HUP service / ezbake integration", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2016-09-29T18:12:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "do a release containing latest HUP changes", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-08-12T14:25:00.000000", "creator": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72c190b7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz85vj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_13212402_*|*_10007_*:*_1_*:*_762264621_*|*_3_*:*_1_*:*_253022252_*|*_10009_*:*_1_*:*_6471_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_52520"}], "description": "Do the following for these repos:\n- pe-file-sync\n- tk-auth\n- jvm-ssl-utils\n- ring-middleware\n----------------------------\nEach github repo must contain a clear indication of who is responsible for that piece of code. Preferably, this happens in the README file, in a 'Maintainers' section, but can also be put into a separate MAINTAINERS file. At a minimum, the following information must be provided:\nthe maintainer(s) of the code resp. other contents of that repo.\ninstructions on filing bugs; usually a URL and/or project name in Jira is all that is needed there\nKaren has compiled a list of who the maintainers are for some of the repos here: https://docs.google.com/spreadsheets/d/1Imbh2BYrbjLUPKWLjct1jD12Y9EI9QY1zsmcIeUXgNk/edit#gid=0. All the repos have instructions for filing bugs documented.\nLook in the \"Server team actions column\". For those that are green and say \"Change maintainers file\", follow the example below to update each one with the correct information. Then please mark the spreadsheet with \"Y\" for \"Maintenance Actions Complete\".\nExample\nMaintenance\nMaintainers: Jane Doe <jdoe@puppetlabs.com>\nTickets: https://puppet.atlassian.net/browse/<PROJECT>. Make sure to set component to Foo\nDavid Lutterkort's write up of the whys and specific whats and hows is here https://confluence.puppetlabs.com/display/ENG/Project+ownership+and++maintenance.\nAlso for the ones that are no longer in use, take actions to mark as unmaintained and delete from kerminator.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10422", "fixedVersions": ["None"], "id": "10422", "issueType": "Task", "key": "TK-395", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "resolution": "Fixed", "resolutionDate": "2016-08-24T12:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update maintainers for out of date Server repos", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-08-04T18:02:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2ff6a48f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hym85j:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_443153865_*|*_1_*:*_1_*:*_489953445_*|*_10007_*:*_1_*:*_331371632_*|*_3_*:*_1_*:*_254146023_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2592769547_*|*_10005_*:*_1_*:*_15149623786"}], "description": "Currently ( in 0.3.1, but this behavior is as of 0.2.0), trapperkeeper-metrics accepts a domain as an argument to {{get-metrics-registry}}. It accepts this domain as a string. pe-trapperkeeper-metrics, however, takes in a domain as a keyword - it also reads off a config where the domain is a keyword, and stores the domain in the registries atom as a keyword. In general, it makes more sense for this domain to be a keyword than a string because it is used for lookup in a number of places.\n\nWe should update trapperkeeper-metrics to accept the domain as a keyword, rather than a string. \n\nThis will be a backwards-breaking change, unless we do this in a way that is backwards compatible. However, at least so far we don't have any indication that doing it in a non-backwards compatible way will be too much of a problem.", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10517", "fixedVersions": ["TK Puppet5.0"], "id": "10517", "issueType": "Task", "key": "TK-394", "labels": [], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Done", "resolutionDate": "2017-03-15T16:19:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-metrics: pass in domain as keyword", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "We ended up addressing this as part of the work done in TK-361, which is now resolved.  Marking this ticket resolved as well.", "created": "2017-03-03T09:06:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-08-03T16:11:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45719b7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynis7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Mar/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_582872783_*|*_5_*:*_1_*:*_10120238514_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2559787873_*|*_10005_*:*_1_*:*_15152246557"}], "description": "Currently the tk-metrics config looks like:\n\n{code}\nmetrics: {\n    server-id: localhost\n    reporters: {\n        jmx: {\n            enabled: true\n        }\n    }\n}\n{code}\n\nIn the 0.2.0 release, the ability to have multiple metrics registries was added. pe-trapperkeeper-metrics is taking advantage of this to be able to set per-registry configured lists of metrics to send to Graphite. Doing this means moving enabling/disabling Graphite and JMX from a setting in the {{reporters}} section of the config to a per-registry setting instead. In order to match pe-trapperkeeper-metrics, trapperkeeper-metrics should be updated to have JMX enabled per-registry and to deprecate enabling JMX globally.\n\nThe new config would look like:\n\n{code}\nmetrics: {\n    server-id: localhost\n    registries: {\n        default: {\n            jmx: {\n                enabled: true\n            }\n        puppetserver: {\n            jmx: {\n                enabled: true\n            }\n        }\n    }\n}\n{code}", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10256", "fixedVersions": ["TK Puppet5.0"], "id": "10256", "issueType": "Task", "key": "TK-393", "labels": [], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2017-06-28T13:17:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-metrics: make jmx enabled per-registry; deprecate enabling jmx globally", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "attachments": [], "comments": [{"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "Updating maintainers as team staffing changes.", "created": "2016-08-02T09:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-08-02T09:16:00.000000", "creator": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "N/a"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@b0c1977"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7w27:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1241279_*|*_10007_*:*_1_*:*_520827257_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_2964067"}], "description": "Do the following for these repos:\n- lein-release-4digit-version\n- test-catalogs\n-test-catalogs-large-files\n----------------------------\nEach github repo must contain a clear indication of who is responsible for that piece of code. Preferably, this happens in the README file, in a 'Maintainers' section, but can also be put into a separate MAINTAINERS file. At a minimum, the following information must be provided:\nthe maintainer(s) of the code resp. other contents of that repo.\ninstructions on filing bugs; usually a URL and/or project name in Jira is all that is needed there\nKaren has compiled a list of who the maintainers are for some of the repos here: https://docs.google.com/spreadsheets/d/1Imbh2BYrbjLUPKWLjct1jD12Y9EI9QY1zsmcIeUXgNk/edit#gid=0. All the repos have instructions for filing bugs documented.\nLook in the \"Server team actions column\". For those that are green and say \"Change maintainers file\", follow the example below to update each one with the correct information. Then please mark the spreadsheet with \"Y\" for \"Maintenance Actions Complete\".\nExample\nMaintainenance\nMaintainers: Jane Doe <jdoe@puppetlabs.com>\nTickets: https://puppet.atlassian.net/browse/<PROJECT>. Make sure to set component to Foo\nDavid Lutterkort's write up of the whys and specific whats and hows is here https://confluence.puppetlabs.com/display/ENG/Project+ownership+and++maintenance.\nAlso for the ones that are no longer in use, take actions to mark as unmaintained and delete from kerminator.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10516", "fixedVersions": ["None"], "id": "10516", "issueType": "Task", "key": "TK-392", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "resolution": "Fixed", "resolutionDate": "2016-08-08T11:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update maintainers for lein and test repos", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I'm interested to see if that test case behaves the same on Linux (I've only tried on my laptop (OS X)), but it's behavior seems to be consistent - down to the point of the event always returning exactly {{488}} from {{.count}}.", "created": "2016-07-28T09:19:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "The test case behaves essentially the same on RHEL 7 at least. The biggest difference that I found is linux creates two events for each new file (so creating 257 files will cause an overflow).\n\nPR up here: https://github.com/puppetlabs/trapperkeeper-filesystem-watcher/pull/5", "created": "2016-07-29T00:18:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-28T09:15:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "N/A"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@26abc178"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz6bdj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bug which has to be fixed in this sprint"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_149843135_*|*_1_*:*_1_*:*_10314161_*|*_10007_*:*_1_*:*_316964163_*|*_3_*:*_1_*:*_43572627_*|*_5_*:*_1_*:*_8989202856_*|*_6_*:*_1_*:*_0"}], "description": "I wrote [a new test case in trapperkeeper-filesystem-watcher|https://github.com/KevinCorcoran/trapperkeeper-filesystem-watcher/commit/53f66ce4df19a47c1c51da30d31899cdf4c934e0] which creates 1000 files in a watched directory.\n\nThis triggers an {{OVERFLOW}} event which returns {{nil}} for {{.context}}.  This causes the following error:\n{code}\n2016-07-28 15:21:13,266 ERROR [p.t.s.s.scheduler-core] scheduled job threw error\njava.lang.NullPointerException: null\n\tat sun.nio.fs.UnixPath.toUnixPath(UnixPath.java:198) ~[na:1.8.0_40]\n\tat sun.nio.fs.UnixPath.resolve(UnixPath.java:397) ~[na:1.8.0_40]\n\tat sun.nio.fs.UnixPath.resolve(UnixPath.java:43) ~[na:1.8.0_40]\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_40]\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_40]\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_40]\n\tat java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_40]\n\tat clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93) ~[clojure-1.7.0.jar:na]\n\tat clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28) ~[clojure-1.7.0.jar:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$eval21819$clojurize__21824$fn__21825.invoke(filesystem_watch_core.clj:34) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$eval21819$clojurize__21824.invoke(filesystem_watch_core.clj:29) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$eval21906$handle_watch_events_BANG___21913$fn__21914$fn__21919.invoke(filesystem_watch_core.clj:130) ~[na:na]\n\tat clojure.core$map$fn__4553.invoke(core.clj:2624) ~[clojure-1.7.0.jar:na]\n\tat clojure.lang.LazySeq.sval(LazySeq.java:40) ~[clojure-1.7.0.jar:na]\n\tat clojure.lang.LazySeq.seq(LazySeq.java:49) ~[clojure-1.7.0.jar:na]\n\tat clojure.lang.RT.seq(RT.java:507) ~[clojure-1.7.0.jar:na]\n\tat clojure.core$seq__4128.invoke(core.clj:137) ~[clojure-1.7.0.jar:na]\n\tat clojure.core$empty_QMARK_.invoke(core.clj:5948) ~[clojure-1.7.0.jar:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$eval21906$handle_watch_events_BANG___21913$fn__21914.invoke(filesystem_watch_core.clj:133) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$eval21906$handle_watch_events_BANG___21913.invoke(filesystem_watch_core.clj:97) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$handle_events_and_reschedule_BANG_.invoke(filesystem_watch_core.clj:146) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.watcher.filesystem_watch_core$handle_events_and_reschedule_BANG_$fn__21960.invoke(filesystem_watch_core.clj:148) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.scheduler.scheduler_core$wrap_with_error_logging$fn__7163.invoke(scheduler_core.clj:16) ~[na:na]\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152) [clojure-1.7.0.jar:na]\n\tat clojure.lang.AFn.applyTo(AFn.java:144) [clojure-1.7.0.jar:na]\n\tat clojure.core$apply.invoke(core.clj:630) [clojure-1.7.0.jar:na]\n\tat overtone.at_at$wrap_fun_to_remove_itself$fn__7086.doInvoke(at_at.clj:103) [na:na]\n\tat clojure.lang.RestFn.invoke(RestFn.java:397) [clojure-1.7.0.jar:na]\n\tat clojure.lang.AFn.call(AFn.java:18) [clojure-1.7.0.jar:na]\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_40]\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_40]\n\tat java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_40]\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_40]\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_40]\n\tat java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10528", "fixedVersions": ["PE 2016.4.0"], "id": "10528", "issueType": "Bug", "key": "TK-391", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2016-08-03T09:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Filesystem watcher: overflow events cause NullPointerException", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-07-21T06:44:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@ef38fa0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7nvr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_531135984_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_175595585685"}], "description": "The trapperkeeper-filesystem-watcher unit tests fail intermittently in CI when the {{LinuxWatchService}} throws a {{NoSuchFileException}}.  It's currently unclear why that error is thrown and it only happens intermittently.\n\n[Here's an example from July 21|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-filesystem-watcher_unit-clj_master/5/].\n\nHere's the relevant output from {{lein test}}:\n{code}\nlein test puppetlabs.trapperkeeper.services.watcher.filesystem-watch-service-test\n2016-07-21 02:52:04,720 ERROR [p.t.s.s.scheduler-core] scheduled job threw error\njava.nio.file.NoSuchFileException: /tmp/single-path-test1469094718560-527774547/sub-dir\n\tat sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) ~[na:1.7.0_79]\n\tat sun.nio.fs.UnixException.asIOException(UnixException.java:111) ~[na:1.7.0_79]\n\tat sun.nio.fs.LinuxWatchService$Poller.implRegister(LinuxWatchService.java:243) ~[na:1.7.0_79]\n\tat sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260) ~[na:1.7.0_79]\n\tat sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:326) ~[na:1.7.0_79]\n\tat java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]\ntimed-out waiting for events\n\nlein test :only puppetlabs.trapperkeeper.services.watcher.filesystem-watch-service-test/single-path-test\n\nFAIL in (single-path-test) (filesystem_watch_service_test.clj:121)\nre-creation of a deleted directory Initial directory creation and deletion\nexpected: (= events (wait-for-events results events))\n  actual: (not (= #{{:path #object[java.io.File 0x2a64c0d9 \"/tmp/single-path-test1469094718560-527774547/sub-dir\"], :type :delete}} ({:type :create, :path #object[java.io.File 0x784425c \"/tmp/single-path-test1469094718560-527774547/sub-dir\"]})))\n{code}\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10432", "fixedVersions": [], "id": "10432", "issueType": "Bug", "key": "TK-388", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Cannot Reproduce", "resolutionDate": "2022-02-18T17:49:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Transient CI failure caused by NoSuchFileException from LinuxWatchService", "timeSpent": "PT0S", "updated": "2022-02-18T17:49:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] - any opinions/input on what we should do about this?", "created": "2016-07-21T09:38:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "TBH the first two things I'd probably do would be:\n\n1. Try to figure out the oracle bug tracking maze enough to request a backport of the fix from JDK9 to JDK8.\n2. See if the guy who wrote the blog post describing the issue has any contact info and see if he's willing to share the code that he used to solve it, as per his description in the blog post.\n\nGiven that I don't *think* this should affect us in production based on how we're planning to initially consume this service, and given that there is supposedly a fix in JDK9, I'm inclined to try to avoid putting too much effort into it other than those things.  Obviously my opinion would change if we found that it was actually affecting the production code, or if it was causing too much churn in CI.", "created": "2016-07-21T10:05:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]'s suggestions both sound good to me.  I'm also okay waiting on any rework of the tests to avoid the problem in the interim if it's not causing too many problems.  I suppose if this becomes a bigger / more pressing problem for us to solve and we don't get any traction on a JDK backport of the fix or access to the source code for the blogger's workaround, we could consider exploring our own lower-level solution that's built on JNA's inotify API directly.  That seems like it would be a lot more involved, though, and probably more of a last resort.", "created": "2016-07-21T10:30:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. Try to figure out the oracle bug tracking maze enough to request a backport of the fix from JDK9 to JDK8.\n\nYeah, was already thinking of that, will do.\n\nbq. 2. See if the guy who wrote the blog post describing the issue has any contact info and see if he's willing to share the code that he used to solve it, as per his description in the blog post.\n\nI got the impression that the code he was talking about was a patch to the JDK.  If that's the case, we have a better option, which is the real patch used to fix the bug, attached to https://bugs.openjdk.java.net/browse/JDK-8145981.  [~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] had the interesting idea that we could actually try to apply that patch to pe-java ourselves, if the above approach doesn't pan-out for us.\n\nI'm inclined to agree with the rest of your analysis that well.  I don't think it's going to affect our only current use-case in production, and the CI issues have been minor enough so far that they probably don't warrant more action at the moment.", "created": "2016-07-21T10:31:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}I got the impression that the code he was talking about was a patch to the JDK.{quote}\n\nThat's not the impression I got.  My impression is that he essentially re-implemented the core of the {{WatchService}} functionality using direct calls into {{inotify}} via the {{JNA}}.  But I didn't see any source code snippets of that attached to the blog post or JDK bug.", "created": "2016-07-21T10:43:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. My impression is that he essentially re-implemented the core of the WatchService functionality using direct calls into inotify via the JNA.\n\nAh, yup, after a re-read, that's what it seems like he is saying to me as well.\n\n", "created": "2016-07-22T02:47:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I opened [this JDK bug|https://bugs.openjdk.java.net/browse/JDK-8162377] for them to back-port the fix to Java 8.  That ticket was accepted, and the back-port is now tracked in [this other ticket|https://bugs.openjdk.java.net/browse/JDK-8162378].", "created": "2016-07-22T02:49:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I already had an email written to the author of that blog post, asking him for his JNA implementation of {{WatchService}}, before I heard back from Oracle about my bug report, so I went ahead and sent that email anyway.  Wouldn't hurt to have his implementation of {{WatchService}} if he's willing to share it.", "created": "2016-07-22T02:53:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[The JDK bug I filed, requesting the back-port|https://bugs.openjdk.java.net/browse/JDK-8162378] has already been fixed and is targeted at version 8 update 122.\n\nI heard back from the author the blog post and he [shared his code|https://github.com/batterseapower/jna-watch-service] - it's untested Scala code which doesn't completely implement the {{java.nio.file.WatchService}} interface.", "created": "2016-07-26T03:36:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I've reopened this and set it as blocking TK-385. In that work we are moving from polling to processing events as they occur in background threads. On Linux for every created file there is at least a CREATE and MODIFY event that occurs. When creating a directory and immediately writing a file inside of it we will now often be registering the newly created subdirectory when its child file's events are sent to us, thereby triggering this bug. This can be seen in the fact that majority of test runs now fail with the {{nest-directory-test}}.", "created": "2016-08-01T10:39:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "This is the tracker page for Java 8u122: https://bugs.openjdk.java.net/projects/JDK/versions/18603", "created": "2016-08-01T10:44:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:104b5720-714d-4539-b455-df472251ec89] - Can this ticket be closed given that TK-385 is now resolved?", "created": "2016-08-08T09:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-21T03:53:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3c856982"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7nuf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bug of possibly high severity"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_20743808_*|*_3_*:*_1_*:*_62134953_*|*_4_*:*_1_*:*_605781752_*|*_5_*:*_2_*:*_9445360039_*|*_6_*:*_1_*:*_0"}], "description": "In TK-384 we created trapperkeeper-filesystem-watcher.  The implementation uses JDK's {{WatchService}}, and afterwards we discovered [this bug in the Linux implementation of WatchService|https://bugs.openjdk.java.net/browse/JDK-8145981].    \n\n[This blog post|http://blog.omega-prime.co.uk/?p=161] contains a more detailed description of the bug.\n\nThis bug has caused at least one CI failure (in Travis) and I'm not convinced that it also isn't the cause of TK-388, although TK-388 seems significantly different.\n\nDetermine if any action is needed as a result of this discovery.  In particular, should we do any of the following?\n* attempt to update our test code to workaround it, to prevent intermittent CI failures (ugh)\n* attempt to update our production code to detect the bug and handle it gracefully (how?)\n* document the bug in the project README\n* file a JIRA to track the bug and its effect on tk-fs-watcher\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10564", "fixedVersions": ["PE 2016.4.0"], "id": "10564", "issueType": "Task", "key": "TK-387", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2016-08-08T10:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "What should we do about JDK bug in LinuxWatchService?", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] any interest in taking a peek at this before you leave?", "created": "2016-07-20T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-19T08:15:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4f19a886"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7m7z:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_93790623_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_177729038608"}], "description": "At compile-time, Trapperkeeper does a check to try to enforce that a service implements all of the functions defined in a service protocol.  However, it does not check all of the arities; so this will compile:\n\n{code}\nSo, this compiles:\n\n(defprotocol Foo\n  (bar\n    [this]\n    [this baz]))\n\n(defservice foo-service\n  Foo\n  []\n  (bar [this] (println \"what's baz?\")))\n{code}\n\neven though the two-arg version of the function is not implemented.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10225", "fixedVersions": [], "id": "10225", "issueType": "Bug", "key": "TK-386", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Fix", "resolutionDate": "2022-03-08T10:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "compile-time checking of service protocol function definitions doesn't account for multi-arity", "timeSpent": "PT0S", "updated": "2022-03-08T10:29:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:104b5720-714d-4539-b455-df472251ec89] - One other thing comes to mind, beyond the conversation we just had.   You've probably thought of this already like everything else.  :) \n\nWhat happens if {{.close}} is called on the {{WatchService}} not while it's blocked on {{.take}}, but instead, while our code to handle events / invoke callbacks is running?  We need to make sure that we still shutdown cleanly and clean up everything correctly in that case.  I'm not exactly sure what that entrails.  It's possible that the behavior could be different depending on what point in that code {{.close}} is called - say, if it invalidates WatchKeys, or something like that.", "created": "2016-07-26T10:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-18T08:51:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5d85a04a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn1gv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_152161713_*|*_1_*:*_1_*:*_185243651_*|*_10007_*:*_1_*:*_483803663_*|*_3_*:*_1_*:*_479706699_*|*_5_*:*_1_*:*_8989210274_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_85173806"}], "description": "The initial implementation of the {{FilesystemWatchService}} uses {{.poll}} without a timeout along with the tk-scheduler-service.  [In this discussion|https://github.com/puppetlabs/pe-file-sync/pull/257#discussion_r69230588], [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f], [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] and I agreed that a better approach would be to, instead, call the blocking {{.take}} method on {{WatchService}}, using a separate thread for each {{WatchService}}, likely via {{clojure.core/future}}.\n\nThis change should result in an implementation which scales better and is faster, even in simple use-cases.  Especially, in a steady state (when no files are changing), all of the watcher threads should be blocked on {{.take}} and not incurring any load on the CPU.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10255", "fixedVersions": ["PE 2016.4.0"], "id": "10255", "issueType": "Task", "key": "TK-385", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2016-08-03T09:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-filesystem-watcher should .take instead of .poll'ing", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Repo created at https://github.com/puppetlabs/trapperkeeper-filesystem-watcher. Kerminator is tracking it for the green team via the PRs plugin.", "created": "2016-07-14T14:52:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Hipchat notifications enabled for the repo (to the Puppet Server room).", "created": "2016-07-14T15:22:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Travis has been enabled and a travis config has been added to a PR.", "created": "2016-07-14T15:42:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "ci-job-configs PR open here: https://github.com/puppetlabs/ci-job-configs/pull/1492", "created": "2016-07-14T15:53:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "everything here is set up. i'm going to kick off the jenkins pipeline once it is created, and then close this out.", "created": "2016-07-15T12:06:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Jenkins job is running and notifying correctly.", "created": "2016-07-15T12:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-14T14:32:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "N/a, not code"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2cc201e6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7k9b:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Required to do PE-16088"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_5045_*|*_3_*:*_1_*:*_77622985_*|*_10009_*:*_1_*:*_1196913_*|*_6_*:*_1_*:*_0"}], "description": "To hold the filesystem watcher service, a new repo will be created (following the steps in https://confluence.puppetlabs.com/display/ENG/Setting+up+a+new+repo, https://confluence.puppetlabs.com/display/ENG/Automation+for+Open+Source+Clojure+Projects, and https://confluence.puppetlabs.com/display/RE/Releasing+Libraries.\n\nThis includes at least making the github repo, setting up travis, setting up jenkins, setting up hipchat notifications.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10514", "fixedVersions": ["None"], "id": "10514", "issueType": "Task", "key": "TK-383", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Fixed", "resolutionDate": "2016-07-15T12:26:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create and set up trapperkeeper-filesystem-watcher repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], I wasn't able to reproduce this. In writing tests to cover this case I found that I'd written some shite tests and added new ones", "created": "2016-07-18T15:27:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I don't see a {{defservice}} in those tests", "created": "2016-07-18T16:06:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'll see if I can throw together a quick commit to illustrate.", "created": "2016-07-18T16:06:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "https://github.com/cprice404/trapperkeeper/commit/f6cd31cae03b46189708c691515092c541e3cb2b\n\nThat ^^ shows a compile failure that I think is the same thing I was hitting when I filed this.  It's possible I've just screwed up my syntax, so if that's the case, let me know.", "created": "2016-07-18T16:17:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "ugh, fuck, i read defservice and thought it wouldn't matter. i'll fix defservice, then.\n\nAlso, the destructuring bit is a red herring -- the failure with defservice happens whether or not you're destructuring functions.", "created": "2016-07-18T16:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-07-04T14:05:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@55a4c908"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz7crb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_764297590_*|*_10007_*:*_1_*:*_503080774_*|*_3_*:*_1_*:*_93079898_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_440607350"}], "description": "The nested syntax from prismatic for destructuring services is known not to work with optional dependencies.  However, with required dependencies, it appears to only work if the service specifies a protocol.  e.g.:\n\n{code}\n(defservice foo-web-service\n  FooService\n  {:required [[:WebroutingService add-ring-handler]]\n   :optional []}\n  ...\n  )\n{code}\n\nSeems to work, but the syntax below gives {{Unable to resolve symbol: add-ring-handler}} during compilation:\n\n{code}\n(defservice foo-web-service\n  {:required [[:WebroutingService add-ring-handler]]\n   :optional []}\n  ...\n  )\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10421", "fixedVersions": ["TK 1.4.2"], "id": "10421", "issueType": "Bug", "key": "TK-382", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-07-25T10:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "prismatic destructuring form doesn't work with optional dependency without protocol", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ping [~accountid:557058:104b5720-714d-4539-b455-df472251ec89] - this is the ticket we were talking about in triage.", "created": "2016-06-08T10:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-06-08T10:48:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7f9d5be3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz6vcv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_12989195_*|*_1_*:*_1_*:*_520345_*|*_10007_*:*_1_*:*_55140642_*|*_3_*:*_1_*:*_3174881_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_616202903"}], "description": "This is a spin-off of SERVER-1378.  The origin of this ticket is that the tk-auth library is specifying a dependency on a newer version of clojure.tools.cli than what Puppet Server was inheriting from kitchensink... and it doesn't appear that tk-auth actually *uses* tools.cli directly at all, so it really shouldn't even have a dep.\n\nWhile we're in there we may as well do a few other hygiene-related things:\n\n1. Move the \"conflict resolution\" dependencies up to the top of the list, with only the clojure version dep specified before them, as is our convention in other repos.\n2. Take a pass through and see if there are other dependencies listed in there that are things that aren't actually consumed by tk-auth directly, and if so, remove them.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10223", "fixedVersions": [], "id": "10223", "issueType": "Task", "key": "TK-381", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-06-16T09:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clean up dependencies list in tk-auth", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "created": "2016-06-09T10:59:00.000000", "name": "WatchDir.java", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10082"}], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] you mentioned in an email that if there was a design discussion to be had on this, that you might like to set up a meeting rather than do it over Jira.  I'm good with that but just want to jot down some bullet points that I think are worth discussing:\n\n* A WatchService can watch more than one file/directory at a time.  I played around a long time ago with writing a watcher that would recursively monitor all of the files in a directory.  I attached my hacky POC source code for that as an attachment to this ticket.  I think you will need to consider doing something similar, because if you are *only* watching the parent directory, I don't think that you will get all of the events that you want", "created": "2016-06-09T11:33:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Thank you for the great input.\n\nI think the most important piece of this to sort out at the moment is the concurrency aspect.  I understand your concerns about not wanting to just {{future-cancel}}.  I also don't really like any of the other options you mentioned.  I think I have a couple more options to put on the table:\n\n#1 - Use {{(.cancel my-future false)}}.  Using {{false}} for the {{mayInterruptIfRunning}} parameter in that call is, I think, exactly the behavior we need - it documents that it won't interrupt the thread when running, but it *does* seem to interrupt it when it's blocked on {{take()}}:\n{code}\n(def myfuture\n  (future\n   (.processEvents\n    (WatchDir.\n     (Paths/get (URI. \"file:///tmp/watchtest\"))\n     true))))\n=> #'user/myfuture\nScanning /tmp/watchtest ...\nDone.\ntaking ...\n(.cancel myfuture false)\n=> true\n@myfuture\nCancellationException   java.util.concurrent.FutureTask.report (FutureTask.java:121)\n{code}\n\n#2 - If that doesn't work, I think we could use {{poll()}} instead of {{take()}} - but instead of passing a timeout, do what we've done on the client service - use the TK scheduler service.  In fact, I don't even think we'd need an agent or core.async for that, since I don't think there's anything else that'd be sharing that code path - wouldn't need to ensure it only happens on a single thread, since when we make the call into the existing code to commit, we'll just re-use the agent that's already there.  That would change things a bit in that we'd have a configurable delay - like the existing client-side {{poll-interval}} - but I think something like a 1 or 5 second delay before the auto-commit should be just fine - for the CA data anyway.\n\nWe are failing at having this conversation in person. :)  But I wanted to get some of these thoughts written down before the weekend.  Stupid timezones.", "created": "2016-06-10T09:00:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "If you've tested that {{.cancel}} in the case where the future *is* doing something in the while loop, then maybe that's ok.  The javadocs for that {{mayInterruptIfRunning}} seem pretty squirrelly, though:\n\n{code}\n If the task has already started, then the mayInterruptIfRunning parameter determines whether the thread executing this task should be interrupted in an attempt to stop the task.\n...\nParameters:\n    mayInterruptIfRunning - true if the thread executing this task should be interrupted", "created": "2016-06-10T09:55:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. Those make it sound like if the task has already started, then it won't be allowed to be interrupted, but that doesn't seem to jive with your example snippet above\n\nI think it jives, because I think that the Java's threading framework knows that the thread is blocked on the call to {{take}}, therefore it can be interrupted.\n\nbq. isn't it possible that that thread got parked due to resource contention at some point in time when it's inside the loop?\n\nYes, although I think that \"parking\" would happen at the CPU level and that the JVM would be basically unaware of it, so that the thread would still be in a \"running\" state even when that \"parking\" occurs.\n\nOf course, those two statements are just speculation, although I could probably do some experimentation/research and find out for certain.  On the other hand, I think the alternative approach of using {{poll}} instead of {{take}}, along with the scheduler service, is perhaps a little better understood at this point in time", "created": "2016-06-13T08:08:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "After some more thought, it seems like cancelling a {{future}} in any way seems like a bad idea here.  We can't be sure that thread isn't in a blocked/waiting state for some other reason, and stopping the thread in such a case may not be safe - i.e. if it's in the middle of a commit, waiting on disk I/O or something.  Therefore, I'm thinking that {{poll}} + scheduler service is the way to go.", "created": "2016-06-13T08:38:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Since I think we have agreed on a concurrency/threading, I'll respond to your other comments:\n\nbq. A WatchService can watch more than one file/directory at a time. \n\nDo you know if the files/directories can be totally independent of each other?  If so, that is interesting ... presumably, then, a single one of our calls to {{poll()}} could return events for multiple paths and would need to invoke multiple callbacks (synchronously).  That actually sounds pretty reasonable - I think we'll just need to make sure that we \"chunk-out\" the events by path before passing them along to the callback associated with that back.\n\nbq. I played around a long time ago with writing a watcher that would recursively monitor all of the files in a directory. I attached my hacky POC source code for that as an attachment to this ticket. I think you will need to consider doing something similar, because if you are only watching the parent directory, I don't think that you will get all of the events that you want", "created": "2016-06-13T13:50:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nDo you know if the files/directories can be totally independent of each other? If so, that is interesting ... presumably, then, a single one of our calls to poll() could return events for multiple paths and would need to invoke multiple callbacks (synchronously). That actually sounds pretty reasonable - I think we'll just need to make sure that we \"chunk-out\" the events by path before passing them along to the callback associated with that back.\n{quote}\n\nYes I think they can be independent of one another, but if this FileSystemWatchService is supposed to be generic, then if there are two different, simultaneous, consumers of it, they are not going to be interested in one another's events, so it seems like the API for this service should take that into account and provide a mechanism for ensuring we don't call back a consumer for an event that they never subscribed to.\n\nRe: returning multiple events simultaneously: yes it looks like the {{WatchKey}} API has a {{pollEvents}} method that returns multiple events:\n\nhttps://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchKey.html\n\n{quote}\nHappy to add this if/when we need it. For the initial implementation I don't think we need it so it seems best to honor the First Rule of API Design and leave it out.\n{quote}\n\nBut you will need to make a backward-incompatible change to the API in order to ever be able to handle a second consumer... that seems to me like a pretty reasonable justification for considering this in the first pass...", "created": "2016-06-13T13:59:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. Yes I think they can be independent of one another, but if this FileSystemWatchService is supposed to be generic, then if there are two different, simultaneous, consumers of it, they are not going to be interested in one another's events, so it seems like the API for this service should take that into account and provide a mechanism for ensuring we don't call back a consumer for an event that they never subscribed to.\n\nAh, yeah, you're right.  So we might need to implement it on top of a unique underlying {{WatchService}} per-callback, and the implementation would just need to {{poll()}} each of them separately.\n\nbq. But you will need to make a backward-incompatible change to the API in order to ever be able to handle a second consumer... that seems to me like a pretty reasonable justification for considering this in the first pass...\n\nI think we could implement it in a backwards-compatible way by adding a second arity to the service function which accepted an {{id}} as a parameter.  In this hypothetical future world, the {{id}} would simply be an optional parameter and if not provided we could use {{nil}} or a auto-generated ID.", "created": "2016-06-13T14:10:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nAh, yeah, you're right. So we might need to implement it on top of a unique underlying WatchService per-callback, and the implementation would just need to poll() each of them separately.\n{quote}\n\nIf we are going to manage multiple watch services I don't see why we would hide that from the API.  You might also have cases where a single consumer did legitimately want to register multiple callbacks for the same watcher.  It seems like it would be cleaner to:\n\n* expose a 'create-watcher' fn in the API and then have any registrations (of files to watch, or callbacks to fire) pass that in as an argument, or\n* add a 'watcher-id' into the API so that consumers could indicate which watcher they care about\n\n{quote}\nI think we could implement it in a backwards-compatible way by adding a second arity to the service function which accepted an id as a parameter. In this hypothetical future world, the id would simply be an optional parameter and if not provided we could use nil or a auto-generated ID.\n{quote}\n\nExcept that it would effectively be a bug to use the old arity, because you have no way of knowing whether or not another consumer is going to be stepping on your toes by registering files that you are not interested in.", "created": "2016-06-13T15:46:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I think I see what you are getting at.  It's turning out to be more complex than I was hoping.  I would still like the API to be simpler, as originally suggested, but I understand your point that it might not make sense.  I think I need to put some time into hacking on this and see where it goes.", "created": "2016-06-14T04:32:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-06-07T07:58:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@e15ca86"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn2qv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Jun/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_94131034_*|*_10007_*:*_3_*:*_1597273412_*|*_3_*:*_3_*:*_1342397066_*|*_5_*:*_1_*:*_10134121410_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_752986254"}], "description": "Implement a new {{FilesystemWatchService}} in pe-file-sync.  This service should have one service function, ...\n{code}\n(watch-path! [this path callback])\n{code}\n... which tells the service to start watching a given file path.  \n\nThe implementation should use java's built-in [{{WatchService}}|https://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html].  [Here's an example of how to use it.|https://docs.oracle.com/javase/tutorial/essential/io/notification.html]. \n\nThe callback function should have one parameter, a list of {{WatchEvent}} objects as provided by [{{pollEvents}}|https://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchKey.html#pollEvents()].\n\nDuring {{init}}, this service should establish any state it needs.  {{watch-path!}} must be called after {{init}} but before {{start}}, otherwise an error should be thrown.  During {{start}}, the service should spin-off a {{future}} for each watched path which loops (as in the example linked above) to monitor the specified path for changes and invoke the callback when they occur.  During {{stop}}, {{future-cancel}} should be used to kill any futures started by this service.\n\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10254", "fixedVersions": ["PE 2016.4.0"], "id": "10254", "issueType": "New Feature", "key": "TK-384", "labels": ["ha-dep"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2016-11-15T09:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Implement FilesystemWatchService", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] FYI you might be interested in this ticket. We decided in backlog grooming that it doesn't seem necessary at the moment and so moved it out of the epic and marked it accepted. If you feel otherwise, Chris says \"type your feelings here.\"", "created": "2016-06-08T10:15:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-06-03T11:12:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@435767ca"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz6s33:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_428487349_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_53404316275"}], "description": "From [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], https://github.com/puppetlabs/jruby-utils/pull/10/files#r65642349:\n\n{quote}\n\nWhen the pool falls out of scope without being shut down, and without having all of its instances returned to it, what happens? I feel like we had some tests in the past where not cleaning up the pool properly before letting the test exit meant that there were still threads doing things in the background after the test ran, and that could cause problems with subsequent tests. I don't think that's the case here, but thought it was worth mentioning. I'd probably consider it 'best practice' to do a blocking shutdown of any pool that you create in a test before exiting from the test block, but if there are a ton of tests that would need to be updated for that, I don't know that I'd block the PR on it.\n\nI think we got away with this a little more easily with the old service because it had a stop lifecycle function that would automatically get called by TK when we exited the with-app-with-config block of the test, and that would shut the pool down.\n\nRaises the question of whether or not the new pool manager service should have a stop lifecycle that tries to clean up pools that haven't been cleaned up by the time it runs... but that definitely seems like a separate chunk of work.\n{quote}\n\nThis ticket is to determine whether the pool manager service should a stop lifecycle that cleans up non-cleaned-up pools by the time it runs, and if so, to implement it.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10253", "fixedVersions": [], "id": "10253", "issueType": "Task", "key": "TK-380", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Fix", "resolutionDate": "2018-02-16T11:45:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Add a stop lifecycle function", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Unit tests passed at https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_jruby-utils_unit-clj_master/18/", "created": "2016-06-20T15:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-06-03T11:02:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3b2a3a6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn6cf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_12182351_*|*_1_*:*_1_*:*_428984519_*|*_10007_*:*_1_*:*_496401645_*|*_3_*:*_1_*:*_97445062_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_450491499"}], "description": "jruby-utils no longer has a {{jruby}} service, so it seems weird that all the namespaces are under {{services.jruby}}. We might want to rename it to just {{puppetlabs.jruby-utils}} and add a namespace for the {{pool-manager-service}}, or we might want to have everything under the {{pool-manager-service}} namespace, so that users are calling {{create-pool}} and the core public functions from under the same namespace.\n\nWe also want to make the {{jruby-core}} namespace solely public functions and move all non-public functions out (probably to {{jruby-internal}}?).", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10431", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10431", "issueType": "Task", "key": "TK-379", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-06-20T15:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Reorganize namespaces", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "These same files are also in pe-puppet-server-extensions now, which is more motivation to consolidate them.", "created": "2018-02-16T11:44:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Does orchestrator have any sort of CLI that will need to make use of JRuby things? /cc [~accountid:557058:2d7665f0-9d98-407f-86d7-8c4ec6a18b20]", "created": "2020-03-12T14:48:00.000000"}, {"author": "557058:2d7665f0-9d98-407f-86d7-8c4ec6a18b20", "body": "No, everything we do in jruby happens through the API. I am not aware of anything that runs from the command line on the Orch side.", "created": "2020-03-12T15:58:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Closing ticket due to age/priority\n\nWe can re-consider & re-open if there is enough interest from the community", "created": "2021-12-22T11:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-06-02T12:18:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@48aa84d4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz6rav:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Feb/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_510769063_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_174795446484"}], "description": "The CLI clj files that actually run the gem, irb, and ruby puppetserver subcommands are still located in puppetserver. If other users of jruby-utils want these subcommands, we may want to move these clj files into jruby-utils.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10420", "fixedVersions": [], "id": "10420", "issueType": "Improvement", "key": "TK-378", "labels": ["final_triage", "refactoring"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Fix", "resolutionDate": "2021-12-22T11:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Move CLI clj files into jruby-utils repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Discussed this with [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] and [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]. We concurred that this logic might be useful to other users of this library, and while at some point we might want Puppet Server to have more complicated logic e.g. to weigh catalog requests higher than other requests, this is not something we are going to do right now, and any benefits gained from making a {{return-to-pool}} function that was solely a wrapper around {{.releaseItem}} would be outweighed by the effort needed to change this. We decided instead to keep the logic in {{return-to-pool}} ({{initialize-config}} defaults it to {{0}}, which is off, so it shouldn't be a problem for users who don't want to take advantage of it), but to rename {{max-requests}} to {{max-borrows}} to reflect the fact that a request is not always going to be what triggers a borrow, and that it's really borrows that this is counting.", "created": "2016-06-07T14:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-27T15:57:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@40b94624"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz6rjj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_74384548_*|*_1_*:*_1_*:*_411955309_*|*_10007_*:*_1_*:*_72213673_*|*_3_*:*_1_*:*_659420_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_546499436"}], "description": "After some discussion, we determined that the work this ticket involves is to rename the setting in {{jruby-utils}} from {{max-requests}} to {{max-borrows}} (and to rename the internal references in the code as well. In Puppet Server we will keep the setting name the same, and we will need to have some logic in order to munge the config before it is passed to {{create-pool}}.\n\n---------------------\nORIGINAL DESCRIPTION:\n\nWe want to explore removing the max-requests logic (which flushes a jruby instance after it has been used a certain number of times) from jruby-utils.\n\nOn the one hand, this seems like logic that is specific to puppetserver, especially as we may want to change it for puppetserver to e.g. way catalog requests higher than other types of requests. On the other hand, this seems like a feature that might prove useful to other consumers - we have seen that a lot of ruby code leaks memory, and for that it is helpful to be able to flush instances after they have been used a certain number of times.\n\nIf we do decide to remove the max-requests logic, or to simplify it, then we would be gutting much of the {{return-to-pool}} function. We might also have more reason to add a {{flush-instance!}} function to the core namespace.\n\nThis ticket is to determine what exactly we want to do with max requests, and then proceed down whatever path that leads us - e.g. gutting {{return-to-pool}} and adding a {{flush-instance!}} function, or exposing a way for puppet server to add more complicated logic on top of a vanilla max requests functionality, etc.", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10245", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10245", "issueType": "Task", "key": "TK-377", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-06-09T11:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Potentially remove max-requests logic from jruby-utils", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Tests passed at https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_jruby-utils_unit-clj_master/16/", "created": "2016-06-13T17:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-27T15:16:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3cc82c27"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn8en:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_619119_*|*_1_*:*_1_*:*_414438561_*|*_10007_*:*_1_*:*_360851715_*|*_3_*:*_1_*:*_164697632_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_537320433"}], "description": "Both the instance and the pool context have keys that we don't want users of the jruby-utils library to touch. We should move these keys underneath an :internal key in both the [instance|https://github.com/puppetlabs/jruby-utils/blob/47e065a0735ffedbcaeb42d39c6b52fc819bc2f0/src/clj/puppetlabs/services/jruby/jruby_schemas.clj#L109] and the [pool context|https://github.com/puppetlabs/jruby-utils/blob/47e065a0735ffedbcaeb42d39c6b52fc819bc2f0/src/clj/puppetlabs/services/jruby/jruby_schemas.clj#L92].\n\nWe don't want to do this until after we've done some of the work to integrate jruby-utils into puppetserver, because we want to make sure of what keys puppetserver actually has to interact with.", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10419", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10419", "issueType": "Improvement", "key": "TK-376", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-06-13T17:48:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Add :internal key to instance and pool-context", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c0b72bef8a60068c796ce] in the latest comments on the github issue it sounds like maybe we supported loading a bootstrap.cfg from the root of an uberjar, implicitly, if you didn't specify a `--bootstrap-config` argument.  Can we test that on an old version?", "created": "2016-05-16T18:22:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "That sounds likely. Before I left yesterday I was playing around and added a jar with a bootstrap.cfg inside of it to the classpath, and was able to find it using our {{config-from-classpath}} function. I'll confirm that this can happen in 1.3.x", "created": "2016-05-17T10:23:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Yup, it'll find a bootstrap file inside of a jar file it in 1.3.\n\nSo yeah, looks like what's happening is that {{config-from-classpath}} used to return a URL object. Now this and related functions return strings, so to convert it to a string I called {{.getPath}} on the URL object. That works fine for regular files in the class path, it returns something like {{file:/etc/blah/bootstrap.cfg}}, but for resources in a jar it strips off the {{jar:}} at the beginning. For example:\n\n{code}\n(io/resource \"bootstrap.cfg\")\n> #<URL jar:file:/Users/joepinsonault/puppetlabs/trapperkeeper/dev-resources/this-jar-contains-a-bootstrap-config-file.jar!/bootstrap.cfg>\n\n(.getPath (io/resource \"bootstrap.cfg\"))\n> \"file:/Users/joepinsonault/puppetlabs/trapperkeeper/dev-resources/this-jar-contains-a-bootstrap-config-file.jar!/bootstrap.cfg\"\n{code}\n\nLooks like just passing it through {{str}} gives the desired result\n{code}\n(str (io/resource \"bootstrap.cfg\"))\n> \"jar:file:/Users/joepinsonault/puppetlabs/trapperkeeper/dev-resources/this-jar-contains-a-bootstrap-config-file.jar!/bootstrap.cfg\"\n{code}", "created": "2016-05-17T10:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [/ff039b|https://github.com/puppetlabs/trapperkeeper/commit/ff039b02ec80c911783b8302322224bfe7f457ee].", "created": "2016-05-18T14:09:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "See https://github.com/jpinsonault/trapperkeeper/blob/07e5a483318cbd2b5c3bde6b643a09b575bef685/test/puppetlabs/trapperkeeper/bootstrap_test.clj#L287 for added unit testing.", "created": "2016-05-23T12:31:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-16T14:39:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@209b5d72"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1213"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn9rb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_507377525_*|*_1_*:*_1_*:*_80076423_*|*_10007_*:*_1_*:*_75143436_*|*_3_*:*_1_*:*_15797321_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_72559"}], "description": "User reports that after upgrading to TK 1.4.0, they cannot load the bootstrap.cfg file from inside their projects jar\n\nStack trace:\n{noformat}\n Caused by: java.io.FileNotFoundException: /var/app/current/revcaster-shopper.jar!/bootstrap.cfg (No such file or directory) at\n java.io.FileInputStream.open0(Native Method) at\n java.io.FileInputStream.open(FileInputStream.java:195) at\n java.io.FileInputStream.<init>(FileInputStream.java:138) at\n clojure.java.io$fn__9524.invokeStatic(io.clj:238) at\n clojure.java.io$fn__9524.invoke(io.clj:235) at\n clojure.java.io$fn__9433$G__9426__9440.invoke(io.clj:69) at\n clojure.java.io$fn__9528.invokeStatic(io.clj:248) at\n clojure.java.io$fn__9528.invoke(io.clj:248) at\n clojure.java.io$fn__9433$G__9426__9440.invoke(io.clj:69) at\n clojure.java.io$fn__9494.invokeStatic(io.clj:165) at\n clojure.java.io$fn__9494.invoke(io.clj:165) at\n clojure.java.io$fn__9446$G__9422__9453.invoke(io.clj:69) at\n clojure.java.io$reader.invokeStatic(io.clj:102) at\n clojure.java.io$reader.doInvoke(io.clj:86) at\n clojure.lang.RestFn.invoke(RestFn.java:410) at\n puppetlabs.trapperkeeper.bootstrap$eval14711$read_config__14716$fn__14717.invoke(bootstrap.clj:144) ... 31 more\nException in thread \"main\" java.lang.IllegalArgumentException: Specified bootstrap config file does not exist: 'file:/var/app/current/revcaster-shopper.jar!/bootstrap.cfg' at\npuppetlabs.trapperkeeper.bootstrap$eval14688$wrap_uri_error__14693$fn__14694.invoke(bootstrap.clj:131) at\npuppetlabs.trapperkeeper.bootstrap$eval14688$wrap_uri_error__14693.invoke(bootstrap.clj:127) at\npuppetlabs.trapperkeeper.bootstrap$eval14711$read_config__14716$fn__14717.invoke(bootstrap.clj:153) at\npuppetlabs.trapperkeeper.bootstrap$eval14711$read_config__14716.invoke(bootstrap.clj:134) at\npuppetlabs.trapperkeeper.bootstrap$eval14734$get_annotated_bootstrap_entries__14739$fn__14740$iter__14741__14747$fn__14748.invoke(bootstrap.clj:160) at\nclojure.lang.LazySeq.sval(LazySeq.java:40) at\nclojure.lang.LazySeq.seq(LazySeq.java:49) at\nclojure.lang.RT.seq(RT.java:521) at\nclojure.core$seq__4357.invokeStatic(core.clj:137) at\nclojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:24) at\nclojure.core.protocols$fn__6738.invokeStatic(protocols.clj:75) at\nclojure.core.protocols$fn__6738.invoke(protocols.clj:75) at\nclojure.core.protocols$fn__6684$G__6679__6697.invoke(protocols.clj:13) at\nclojure.core$reduce.invokeStatic(core.clj:6545) at\nclojure.core$reduce.invoke(core.clj:6527) at\npuppetlabs.trapperkeeper.bootstrap$eval14974$remove_duplicate_entries__14979$fn__14980.invoke(bootstrap.clj:284) at\npuppetlabs.trapperkeeper.bootstrap$eval14974$remove_duplicate_entries__14979.invoke(bootstrap.clj:263) at\npuppetlabs.trapperkeeper.bootstrap$eval15000$parse_bootstrap_configs_BANG___15007$fn__15008.invoke(bootstrap.clj:304) at\npuppetlabs.trapperkeeper.bootstrap$eval15000$parse_bootstrap_configs_BANG___15007.invoke(bootstrap.clj:293) at\npuppetlabs.trapperkeeper.core$eval15288$boot_with_cli_data__15295$fn__15296.invoke(core.clj:129) at\npuppetlabs.trapperkeeper.core$eval15288$boot_with_cli_data__15295.invoke(core.clj:95) at\npuppetlabs.trapperkeeper.core$eval15317$run__15322$fn__15323.invoke(core.clj:151) at\npuppetlabs.trapperkeeper.core$eval15317$run__15322.invoke(core.clj:145) at\npuppetlabs.trapperkeeper.core$main.invokeStatic(core.clj:173) at\npuppetlabs.trapperkeeper.core$main.doInvoke(core.clj:159) at\nclojure.lang.RestFn.invoke(RestFn.java:421) at\nclojure.lang.Var.invoke(Var.java:383) at\nclojure.lang.AFn.applyToHelper(AFn.java:156) at\nclojure.lang.Var.applyTo(Var.java:700) at\nclojure.core$apply.invokeStatic(core.clj:646) at\nclojure.core$apply.invoke(core.clj:641) at\npuppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:7) at\nclojure.lang.RestFn.applyTo(RestFn.java:137) at\npuppetlabs.trapperkeeper.main.main(Unknown Source)\n{noformat}\n\nMy hunch is that we're mangling the resource name returned by {{io/resource}} here: https://github.com/puppetlabs/trapperkeeper/blob/master/src/puppetlabs/trapperkeeper/bootstrap.clj#L104\n\nI tested loading a bootstrap from the command like arg using the format shown in the stack trace ({{'file:/var/app/current/revcaster-shopper.jar!/bootstrap.cfg'}} and {{'/var/app/current/revcaster-shopper.jar!/bootstrap.cfg'}}), and confirmed that they didn't work back then either. If it's being specified on the command line, it must be of the form \"jar:file:/blah.jar!/bootstrap.cfg\" in 1.3.x and 1.4.0", "epicLinkSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "estimate": "PT0S", "externalId": "10252", "fixedVersions": ["TK 1.4.1"], "id": "10252", "issueType": "Bug", "key": "TK-375", "labels": [], "originalEstimate": "PT0S", "parent": "15641", "parentSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Fixed", "resolutionDate": "2016-05-24T11:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Regression in 1.4.0 when loading bootstrap.cfg from resources/ classpath", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f], [~accountid:557058:18109e62-1b97-4fa3-8217-9c25de3a4710] - Given the last part of the description, should we wait on implementing this?  It's going to be a non-trivial amount of work so if it is needed I would like to figure out how we're going to implement it ASAP.", "created": "2016-05-19T06:47:00.000000"}, {"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] I'll make a ticket for us to try this out to see whether we'll need it or not. ", "created": "2016-05-19T10:24:00.000000"}, {"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "ok, it's PE-15806. I put it in our next sprint for now, but I'll do my level best to get it done far sooner. (next week, I hope)", "created": "2016-05-19T10:27:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Cool, thanks [~accountid:557058:18109e62-1b97-4fa3-8217-9c25de3a4710].  That timeline sounds good to me.", "created": "2016-05-19T10:34:00.000000"}, {"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] We talked about this a bit and concluded that, even in the very unlikely case that incrond is very friendly with its triggers, we want the deboucing anyway for the times when people provision many nodes at once. So: go for it!", "created": "2016-05-19T13:05:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "alrighty", "created": "2016-05-20T03:18:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] - why do you want this to be configurable?", "created": "2016-05-23T04:24:00.000000"}, {"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "We were assuming that you wouldn't want to debounce everything. If you do, I guess we don't need a way to turn it on. ", "created": "2016-05-23T10:51:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "Hrm, maybe we meant the period to wait should be configurable?", "created": "2016-05-23T11:07:00.000000"}, {"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "Well, in principle, a debounce algorithm can be configured with a quiet period and a maximum wait time (it'll trigger at least this often, so you'll see updates come through in the face of constant events). I could imagine that these could be different depending on the data being synced. ", "created": "2016-05-23T11:13:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "I'm not sure this work is currently required (or it may already be partially implemented by the nature of the filesystem watcher). The poll interval in use in the tk-fs-watcher system is 1 second. The current callback in place in this PR: https://github.com/puppetlabs/pe-file-sync/pull/264 (which will probably change some during review) ignores the events and just makes a single commit. So I think the current work is already debouncing changes to the granularity of the fs-watcher poll interval.\n\nIf we want tighter control over the granularity, I'd suggest pushing that into tk-fs-watcher by making the poll-interval configurable.", "created": "2016-07-20T16:17:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "If we don't think potentially updating every second for a long period of time (an hour maybe? possibly even way more, not sure) is a big deal, then sure, we might not need this. The use case was for syncing CA data that may be frequently be updating in environments that use more disposable nodes, meaning they provision large numbers of nodes very frequently and then get rid of them shortly after.", "created": "2016-07-20T17:09:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] Are there any numbers on the expected node count/provisioning frequency that we're looking to support?", "created": "2016-07-20T17:41:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "No, I wish I had some but I'd just be guessing. I just know from talking to CS that there are customers who will provision a lot of nodes in bursts, and then there are some that are constantly provisioning new nodes throughout the day (specifically, I learned that when talking to Zack Smith about why CA high availability is important - it's important that teams not have downtime in their ability to provision new nodes for their customers, although that's a different use case).", "created": "2016-07-20T17:45:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] - Your assessment of the current situation is spot-on.  However, in TK-385, we're going to remove the {{poll-interval}} from the filesystem watcher, which will re-introduce the need to explicitly implement some debouncing.  I'll update the ticket description to account for that.", "created": "2016-07-21T07:08:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "wrt Implementation Option #1 in the description, the {{SensitivityWatchEventModifier}} is ignored by some implementations, eg the LinuxWatchService in both [jdk7|http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/3d030fe77f74/src/solaris/classes/sun/nio/fs/LinuxWatchService.java#l233] & [jdk8|http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/4eb8e94e6ad4/src/solaris/classes/sun/nio/fs/LinuxWatchService.java#l236]. So while it's an effective option on OSX I don't think it's feasible for production.", "created": "2016-08-03T11:06:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:104b5720-714d-4539-b455-df472251ec89] - Looks like the test you added for this [failed in Jankins:|https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-filesystem-watcher_unit-clj_master/13/JDK=openjdk7,label=unit/console]\n\n{code}\nlein test :only puppetlabs.trapperkeeper.services.watcher.filesystem-watch-service-test/debouncing-test\n\nFAIL in (debouncing-test) (filesystem_watch_service_test.clj:447)\nDefault debouncing behavior multiple callbacks are triggered if polling exceeds `window-max`\nSystem speed is slower than expected to reliably run this test\nexpected: (<= (clojure.core/deref actual-calls) 4)\n  actual: (not (<= 5 4))\n{code}", "created": "2016-08-10T06:31:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-12T13:40:00.000000", "creator": "70121:caffdbd6-f73d-4ae9-9c82-c4badf061584", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "N/A"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@65441a8b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymzvr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_145709387_*|*_1_*:*_1_*:*_507778970_*|*_10007_*:*_2_*:*_415061399_*|*_3_*:*_1_*:*_190542385_*|*_5_*:*_1_*:*_8293249941_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_6594469438"}], "description": "Add event debouncing to trapperkeeper-filesystem-watcher.\n\nh3. Implementation Option #1\n\nUse {{SensitivityWatchEventModifier}}.  Currently, we use {{SensitivityWatchEventModifier.HIGH}} which seems to result in reasonably fast performance.  However, it seems like we could use {{MEDIUM}} or {{LOW}} to, perhaps, achieve the debouncing we need to implement.  The {{SensitivityWatchEventModifier}} seems to control how quickly events actually show up in a call to {{WatchService.poll}} (and presumably also {{.take}}), so it might give us exactly what we're looking for without requiring much implementation on our part.\n\nThe caveat here might be performance.  On my laptop, the test suite takes about 1 minute to run.  If I change {{DirWatchUtils.register}} to use {{MEDIUM}} instead of {{HIGH}}, the test suite takes over 5 minutes (also required bumping {{wait-time}} in the test to 1 minute, or the test would start timing-out/failing).  {{MEDIUM}} seems slow enough that we're not even going to want to mess with {{LOW}} at this point in time.\n\nIf this approach works, we'll need to figure out how to make it configurable.  {{HIGH}} should still be the default, but perhaps {{create-watcher}} could get a {{debounce?}} parameter added to it, which would result in the implementation using {{MEDIUM}}.  Obviously there are other options, like pushing that down into TK config.\n\nh3. Implementation Option #2\n\nWhen {{.take}} returns some events, hold on to those events, but then {{.poll}} the {{WatchService}} again to collect any additional events which have shown up since the call to {{.take}} returned.  Call {{.poll}} in a loop until it returns {{nil}}, and then invoke the callback once with all of the events collected.\n\nPut an upper bound on the number of times {{.poll}} can be called in a single loop, to prevent it from running forever in the case of an endless stream of changes on the filesystem.  It's probably good enough to have this simply be a maximum number of calls to {{.poll}} (say, 1000) but could be a duration (say, 1 second) as well.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10563", "fixedVersions": ["PE 2016.4.0"], "id": "10563", "issueType": "Improvement", "key": "TK-389", "labels": ["ha-dep"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "resolution": "Fixed", "resolutionDate": "2016-11-15T09:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Debounce filesystem events", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "At present, the only part of the TK ecosystem that does anything relating to SSL cipher suites is tk-webserver-jetty9.\n\nI chatted briefly with [~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] about the idea of trying to apply it more broadly.  It could theoretically be done at the JVM level by shipping a custom `java.security` file (e.g. https://github.com/puppetlabs/puppetserver/blob/005c7f62f8d96d417013500ebbd19613539f394d/dev-resources/java.security ), and setting a jvm CLI flag in our service scripts to point to that custom security configuration (e.g. https://github.com/puppetlabs/puppetserver/blob/b96fe0f3ea11ae4c12665b99e599ec18f727831f/project.clj#L113 ).\n\nIf the goal is to have this common / enforced across all TK apps, these changes would probably be targeted at ezbake.", "created": "2016-05-10T15:20:00.000000"}, {"author": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "body": "That sounds reasonable. Any idea who would do that work?", "created": "2016-05-10T15:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think anyone can do it, just whomever has bandwidth first?", "created": "2016-05-10T15:32:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:46:00.000000"}, {"author": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "body": "Release notes added.", "created": "2017-05-23T13:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-10T14:48:00.000000", "creator": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6fabccff"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzcbif:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Known Issue"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "The following ciphers have been removed from the default cipher list:\n\n -   \"SSL_RSA_WITH_RC4_128_SHA\"\t\t\n -   \"SSL_RSA_WITH_3DES_EDE_CBC_SHA\"\t\t\n -   \"SSL_RSA_WITH_RC4_128_MD5\"\n\nThe use of RC4 has been prohibited per RFC 7465 (https://tools.ietf.org/html/rfc7465) due to weaknesses in the cipher.\n\n3DES is not yet prohibited but offers poor performance and limited security, with no benefits over modern ciphers.\n\nAES is ubiquitous and is a safe replacement for RC4 and 3DES."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "10/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_72180613_*|*_5_*:*_1_*:*_5517441368_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_602165829_*|*_10005_*:*_1_*:*_29572372761"}], "description": "Internally we've arrived at a set of accepted ciphers we should enable to provide secure communication. That list is\n\n{code}\nDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:CAMELLIA128-SHA:AES128-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!RC4:!MD5\n{code}\n\nIn practice, this likely means disabling RC4 and 3DES, and enabling DHE, in Trapperkeeper. Ideally the above list would be the default for any projects using Trapperkeeper.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10251", "fixedVersions": ["TK Puppet5.0"], "id": "10251", "issueType": "Bug", "key": "TK-374", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "resolution": "Fixed", "resolutionDate": "2017-04-25T16:40:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Disable less secure ciphers", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] was asking about this the other day, and we had discussed the possibility of him filing a PR with the desired suites when he was ready.", "created": "2016-05-09T12:55:00.000000"}, {"author": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "body": "We should make this the default in Trapperkeeper for JVM 1.8. For 1.7 and earlier we can remove DHE. Our reasoning is that JVM 1.8 is what we ship in PE, and has been out for several years. There are backports to a number of versions of 1.7, but identifying them correctly could take some work.", "created": "2016-06-07T14:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-09T11:33:00.000000", "creator": "6361cbfc59c794184bcbd33a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@11b707f5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz66gn:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Security Fix"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "Consumers of the trapperkeeper-webserver-jetty9 library now use Jetty version 9.4.4, which requires the use of Java 8.  Because of functional issues when running on Java 7, we had previously removed DHE ciphers from the default ciphers that Jetty uses.  For Java 8, however, these issues are believed to have been resolved and so some of the DHE ciphers have been re-added to the default list of ciphers.  The added ciphers are:\n\n- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA256\n- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\n- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\n- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\n- TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\n- TLS_DHE_RSA_WITH_AES_256_CBC_SHA\n- TLS_DHE_RSA_WITH_AES_128_CBC_SHA256\n- TLS_DHE_RSA_WITH_AES_128_CBC_SHA"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_4028733_*|*_1_*:*_1_*:*_169891686_*|*_10007_*:*_1_*:*_494413584_*|*_3_*:*_1_*:*_302016_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_777460134_*|*_10005_*:*_1_*:*_28362322217"}], "description": "DHE has been disabled since [this PuppetDB commit|https://github.com/puppetlabs/puppetdb/commit/03e020dc85b83d6c83c9992ca6bd14f57e8fc91a]. That change was made to avoid [an intermittent issue|https://bugs.openjdk.java.net/browse/JDK-8014618] in Java 1.7u6 and newer. tk-ws-j9 inherited \n\nAt this point, it's ben three years since the bug was resolved, so we may be able to reenable DHE ciphersuites for forward secrecy.\n\nIf there are still broken java versions in the wild, we could at least configure PE services with DHE ciphersuites.", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10430", "fixedVersions": ["TK Puppet5.0"], "id": "10430", "issueType": "Task", "key": "TK-373", "labels": [], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6361cbfc59c794184bcbd33a", "resolution": "Fixed", "resolutionDate": "2017-04-19T11:40:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Reenable DHE ciphersuites in tk-ws-j9", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:1381f112-1c4e-4869-ba34-30602d945124", "created": "2016-05-02T14:43:00.000000", "name": "deps", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10081"}, {"attacher": "557058:1381f112-1c4e-4869-ba34-30602d945124", "created": "2016-05-02T13:58:00.000000", "name": "pe-auth-ui-with-jetty-jmx.snapshot.bz2", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10012"}, {"attacher": "557058:1381f112-1c4e-4869-ba34-30602d945124", "created": "2016-05-02T17:03:00.000000", "name": "pe-auth-ui-with-jetty-with-registration-buffer-warmup.snapshot.bz2", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10068"}, {"attacher": "557058:1381f112-1c4e-4869-ba34-30602d945124", "created": "2016-05-02T13:58:00.000000", "name": "pe-auth-ui-without-jetty-jmx.snapshot.bz2", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10130"}], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:1381f112-1c4e-4869-ba34-30602d945124] I haven't had time to look at these snapshots yet, but is there any chance that this could be related to the `MBeanServerNotification` stuff mentioned in the comment [here|https://puppet.atlassian.net/browse/SERVER-1129]?", "created": "2016-05-02T15:29:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I don't think so. I can't see that class anywhere in the incoming references for the leaking objects. To be sure, I did another run of memory profiling, but this time I TK HUP'd the service 50 times before performing the first round of GCs and taking the initial snapshot. The two servers register 40 MBeans between them, so this should be enough to fill up that notification buffer. After those 50 HUPs, I still observed a leak of around 6.5 KB per server per HUP, along with a gradual increase in the time spent in GCs.\n\nI attached the snapshot for this profiling run as \"pe-auth-ui-with-jetty-with-registration-buffer-warmup.snapshot.bz2\".", "created": "2016-05-02T17:05:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm just going from memory here, but I feel like that buffer had a size of 1000 and that it was only showing like 1 or 2 entries per Jetty restart, but I could be wrong about that.  Will try to find some time to look at the dumps soon if that doesn't match up with what you're seeing.", "created": "2016-05-02T17:16:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "FWIW I had one run that I did where I left Puppet Server running for 2 weeks, with a background script hupping it every 30 seconds, and capturing the used heap metric before every HUP.  I graphed that in a google spreadsheat and there was definitely no obvious trend upward.", "created": "2016-05-02T17:18:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "Oh, it's not a notification for every individual bean that's registered or de-registered? That must be what's happening here, then, since the old generation's size does seem to stabilize eventually.", "created": "2016-05-02T17:32:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "There was indeed a leak here, in a static map maintained by the jetty MBeanContainer class to ensure that the names it generates for beans are unique. I [opened a PR to fix it|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/144].", "created": "2016-05-04T15:38:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "For historical reference, the source code for jetty has this static map at https://github.com/eclipse/jetty.project/blob/13d9263d789e66b12f9014af43d1be5e5dab7605/jetty-jmx/src/main/java/org/eclipse/jetty/jmx/MBeanContainer.java#L45.", "created": "2016-05-05T11:31:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Released in tk-w-j9 1.5.7", "created": "2016-05-16T18:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-05-02T13:58:00.000000", "creator": "557058:1381f112-1c4e-4869-ba34-30602d945124", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7fea3d7d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz61d3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_887084185_*|*_1_*:*_1_*:*_12882928_*|*_4_*:*_1_*:*_161238917_*|*_5_*:*_1_*:*_0_*|*_6_*:*_1_*:*_165186236"}], "description": "There is a (very slow) memory leak related to the Jetty JMX functionality of TK WS J9. I'm not sure exactly how it happens, given that the Jetty MBeanContainer gets destroyed when the server is shut down in the TK stop lifecycle method, but it's clear from memory snapshots that the names of the server threads are retained somehow, and these slowly build up.\n\nThis memory leak is pretty minor. When the JMX metrics are disabled, the TK stack supporting PE Console Auth UI\u2014with two different Jetty servers and two routed handlers\u2014leaks around 4.8 KB per TK HUP restart. When the JMX metrics are enabled, it leaks 17.8 KB per TK HUP, or about 6.5 KB additional memory leaked per server per HUP.\n\nI've attached two memory snapshots -- one with Jetty JMX metrics enabled, the other without. In both snapshots, the last generation should contain only leaking objects allocated during TK HUPs: the procedure was to start the application, perform a few TK HUPs, trigger a few full mark & sweep GCs manually, take a snapshot (which also advances the generation marker), then TK HUP the process every 2 seconds for around 9 minutes, for a total of ~270 HUP restarts, trigger a few more full GCs, and then take these snapshots. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10627", "fixedVersions": [], "id": "10627", "issueType": "Bug", "key": "TK-372", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:1381f112-1c4e-4869-ba34-30602d945124", "resolution": "Fixed", "resolutionDate": "2016-05-16T18:38:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jetty JMX Memory Leak in TK WS J9", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Done as a result of changes made for PE-13552.", "created": "2017-02-22T08:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-29T15:13:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@23d2601c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz60j3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_418124446_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_25395355009"}], "description": "This ticket is for improving the implementation of jruby-utils' {{jruby-pool-manager/create-pool}} function to handle threading to coordinate the creation of JRuby instances, to address the concerns mentioned in TK-370 around instances being created on multiple threads and JRuby's global state.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10562", "fixedVersions": [], "id": "10562", "issueType": "Task", "key": "TK-371", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Done", "resolutionDate": "2017-02-22T08:38:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Implementation of jruby-utils' jruby-pool-manager to handle coordinating creation of instances", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to jruby-utils:master at [e6fe38f|https://github.com/puppetlabs/jruby-utils/commit/e6fe38fa36d62e3f2ff6c1ea9e70b4f6bc3bd395].", "created": "2016-05-31T10:41:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Clojure unit tests passed at https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_jruby-utils_unit-clj_master/12/.", "created": "2016-05-31T11:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-29T15:11:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2d391492"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn9rr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Needed a ticket to work on"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2839484_*|*_1_*:*_1_*:*_418235440_*|*_10007_*:*_1_*:*_580327828_*|*_3_*:*_1_*:*_105210635_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1644837167"}], "description": "We have some concerns that creating JRuby instances on two different threads at once may cause problems due to JRuby's global state. In order to deal with this (in the future), we want to have an API for coordinating the initialization of JRuby instances. Since this API will have to keep track of state (what JRuby instances are there to initialize), it should be a Trapperkeeper service.\n\nThis ticket is for creating a {{juby-pool-manager}} TK service in jruby-utils. This service should have provide a protocol with one function - `create-pool` - that for now would just call into the core jruby-utils `create-pool-context` function. In the future, if we determine that our concerns about thread safety are well founded, we can change the implementation of this API to handle coordinating the creation of instances (TK-371).", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10512", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10512", "issueType": "Task", "key": "TK-370", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-05-31T11:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Create jruby-pool-manager TK service", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "attachments": [], "comments": [{"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "The class that moved was {{org.eclipse.jetty.servlets.gzip GzipHandler}}.", "created": "2016-04-28T15:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ping [~accountid:63d40635a05386069cdb69d6] [~accountid:557058:4b02db91-705f-4691-a56a-9a839ecbce6e] [~accountid:557058:ab1874a9-45ab-4efc-91aa-5200c165b2c4] - we are going to want to upgrade Jetty sometime in the next 6 months or so, probably, and the main issue here is that it will have a minimum JDK requirement of 8, so we have to figure out how that maps to our OSS story for our supported server platforms.  Is there another ticket in RE somewhere about bumping the minimum supported OSS JDK to 8?", "created": "2016-05-04T11:22:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Dropping java 7 support will affect ubuntu and debian mainly. java 8 is available in jessie-backports, stretch, wily, and xenial. It is not available for wheezy, precise or trusty.\n\nThere is a bug opened to backport java8 to trusty (https://bugs.launchpad.net/trusty-backports/+bug/1368094). However, it has been open for over a year, so I'd be surprised if it will ever happen.", "created": "2016-05-04T11:40:00.000000"}, {"author": "63d40635a05386069cdb69d6", "body": ":(  We'd really like to not have to ship a JDK at all and just use an upstream or OS one, but I understand the request reasons here. \n\n[~accountid:557058:ab1874a9-45ab-4efc-91aa-5200c165b2c4] probably should weigh in on what our plans for the JDK updates are for PE. ", "created": "2016-05-04T13:45:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yeah, agreed re: preferring not to ship one for OSS.  But it comes down to whether or not we can hold off on upgrading Jetty until we've dropped support for distros that don't have a java8 package, and I don't really know what the answer to that question is.", "created": "2016-05-04T13:56:00.000000"}, {"author": "557058:ab1874a9-45ab-4efc-91aa-5200c165b2c4", "body": "We're still shipping openjdk 7/IcedTea 2.6 for PE 3.8, until the end of support there, but I assume none of this will ever be backported to the 3.8 series. For PE 2015.x and later we're shipping OpenJDK 8. We don't have plans for 9 yet, looks like it's still about a year out from GA.\n\nSo currently we're only shipping Java 8 for Ubuntu 12.04, 14.04 and about to ship it for 16.04. I'm not sure how easy (or not) it would be to build it for the older debians, I guess we'd have to weight that effort against the cost of dropping those platforms.", "created": "2016-05-04T14:18:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "When puppetdb dropped jdk 6 support, they added optional debian deps for a java 7 package built with https://wiki.debian.org/JavaPackage (which I think has some sort of sane provides built in). We could document that for the platforms that don't have java 8 available, and tweak ezbake to support those packages. It's slightly gross, but it's also seems more reasonable than shipping our own java for OSS.", "created": "2016-05-04T14:25:00.000000"}, {"author": "63d40635a05386069cdb69d6", "body": "We're not going to ship a java for FOSS. I just want to be clear on that one. \n\nI'd rather not ship one in PE if we could help it.\n\nRather than hack a java solution for older platforms, we should look into the dujour stats to see who is running on what platforms these days. We may be able to phase out older platforms, or point to an OpenJDK package that is more modern. ", "created": "2016-05-04T14:28:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Today's update is that ubuntu and debian are still in a sorry state for java 8. Nothing has changed since https://puppet.atlassian.net/browse/TK-369?focusedCommentId=293941&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-293941\n\nhttps://bugs.launchpad.net/trusty-backports/+bug/1368094 has now been open for 2 years. Basically on ubuntu less than xenial I think we would need to recommend users use a PPA.", "created": "2016-10-18T17:29:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "http://www.java9countdown.xyz/ fyi", "created": "2016-11-08T16:53:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "This is done done.", "created": "2017-03-09T11:56:00.000000"}, {"author": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "body": "I'm really curious how the websocket implementation changed. I'll have to test it out later.", "created": "2017-03-09T12:06:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] please provide release notes for this issue, if applicable.", "created": "2017-05-15T11:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-28T14:55:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6044f2b3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1738"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5zc7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "Jetty 9.4 update will be called out in the puppetserver 5 release notes."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_499894098_*|*_1_*:*_2_*:*_1624373132_*|*_10007_*:*_1_*:*_272310153_*|*_3_*:*_1_*:*_76827410_*|*_5_*:*_1_*:*_9591680503_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_13927566116_*|*_10006_*:*_1_*:*_10799230288_*|*_10005_*:*_1_*:*_8671150"}], "description": "The Jetty team is intending to EOL Jetty 9.2 in the May 2016 timeframe.  The latest tk-jetty9, 1.5.6, is still using Jetty 9.2.10.  We should consider upgrading to something in the Jetty 9.3.x series in order to stay on a version that is \"supported\" by the Jetty team.\n\n[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] indicated that he knows of at least one issue that we're likely to face in porting tk-jetty9 to the Jetty 9.3.x series - some change related to moving / removing one of the Gzip-related classes.  We should watch out for that when we do the port.\n\nOne issue which may block us moving to Jetty 9.3.x soon, though, is that it has a minimum requirement of JDK version 8.\n", "epicLinkSummary": "Drop support for running on JDK 7", "estimate": "PT0S", "externalId": "10418", "fixedVersions": ["TK Puppet5.0"], "id": "10418", "issueType": "Task", "key": "TK-369", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": "16508", "parentSummary": "Drop support for running on JDK 7", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-03-09T11:56:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider upgrading tk-jetty9 dependency to Jetty 9.4.x", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "1", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "qm:f7b4bc64-445a-440e-8354-a55854c39cee:e7d30c88-68bc-45e2-82d7-fbe552e9a64f", "body": "+1 on ubuntu server last version as from today", "created": "2016-07-23T05:56:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Resolved in https://github.com/puppetlabs/clj-kitchensink/commit/74641d20423e158bf9433c1ca1052580fc00ef3e by bumping the dynapath version to 0.2.4.", "created": "2016-11-22T13:55:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Er. I guess this still needs a kitchensink release and version bump in the parent project to actually address the issue in TK.", "created": "2016-11-22T13:55:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "I'll leave this open until we've gotten the other pins in a row.", "created": "2016-11-22T13:56:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] assigning this to you since it seems like \"things\" are in process now.  Feel free to dump it back into the queue as appropriate.", "created": "2016-11-22T16:39:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9], did you fix this already in your Java 9 exploration?", "created": "2018-02-16T11:30:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "Yes", "created": "2018-02-16T11:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-21T14:14:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@67c1de07"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5u1b:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_508491554_*|*_4_*:*_1_*:*_1219490246_*|*_5_*:*_2_*:*_50562_*|*_10005_*:*_2_*:*_55808396205"}], "description": "dynapath is pulled into trapperkeeper via kitchensink, for what looks to be augmenting classpaths. In java 9, dynapath errors will stop a tk app from starting. The errors look like the following:\n\n{code}\nException in thread \"main\" java.lang.ClassNotFoundException: sun.misc.Launcher, compiling:(dynapath/defaults.clj:29:3)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6730)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6524)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6485)\n\tat clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)\n\tat clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6179)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6723)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6524)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6485)\n\tat clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5861)\n\tat clojure.lang.Compiler$FnMethod.parse(Compiler.java:5296)\n\tat clojure.lang.Compiler$FnExpr.parse(Compiler.java:3925)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6721)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6524)\n\tat clojure.lang.Compiler.eval(Compiler.java:6779)\n\tat clojure.lang.Compiler.load(Compiler.java:7227)\n\tat clojure.lang.RT.loadResourceScript(RT.java:371)\n\tat clojure.lang.RT.loadResourceScript(RT.java:362)\n\tat clojure.lang.RT.load(RT.java:446)\n\tat clojure.lang.RT.load(RT.java:412)\n\tat clojure.core$load$fn__5448.invoke(core.clj:5866)\n\tat clojure.core$load.doInvoke(core.clj:5865)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5671)\n\tat clojure.core$load_lib$fn__5397.invoke(core.clj:5711)\n\tat clojure.core$load_lib.doInvoke(core.clj:5710)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$load_libs.doInvoke(core.clj:5749)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$require.doInvoke(core.clj:5832)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat dynapath.util$eval14455$loading__5340__auto____14456.invoke(util.clj:1)\n\tat dynapath.util$eval14455.invoke(util.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6782)\n\tat clojure.lang.Compiler.eval(Compiler.java:6771)\n\tat clojure.lang.Compiler.load(Compiler.java:7227)\n\tat clojure.lang.RT.loadResourceScript(RT.java:371)\n\tat clojure.lang.RT.loadResourceScript(RT.java:362)\n\tat clojure.lang.RT.load(RT.java:446)\n\tat clojure.lang.RT.load(RT.java:412)\n\tat clojure.core$load$fn__5448.invoke(core.clj:5866)\n\tat clojure.core$load.doInvoke(core.clj:5865)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5671)\n\tat clojure.core$load_lib$fn__5397.invoke(core.clj:5711)\n\tat clojure.core$load_lib.doInvoke(core.clj:5710)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$load_libs.doInvoke(core.clj:5749)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$require.doInvoke(core.clj:5832)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat puppetlabs.kitchensink.classpath$eval14449$loading__5340__auto____14450.invoke(classpath.clj:1)\n\tat puppetlabs.kitchensink.classpath$eval14449.invoke(classpath.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6782)\n\tat clojure.lang.Compiler.eval(Compiler.java:6771)\n\tat clojure.lang.Compiler.load(Compiler.java:7227)\n\tat clojure.lang.RT.loadResourceScript(RT.java:371)\n\tat clojure.lang.RT.loadResourceScript(RT.java:362)\n\tat clojure.lang.RT.load(RT.java:446)\n\tat clojure.lang.RT.load(RT.java:412)\n\tat clojure.core$load$fn__5448.invoke(core.clj:5866)\n\tat clojure.core$load.doInvoke(core.clj:5865)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5671)\n\tat clojure.core$load_lib$fn__5397.invoke(core.clj:5711)\n\tat clojure.core$load_lib.doInvoke(core.clj:5710)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$load_libs.doInvoke(core.clj:5749)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$require.doInvoke(core.clj:5832)\n\tat clojure.lang.RestFn.invoke(RestFn.java:436)\n\tat puppetlabs.trapperkeeper.plugins$eval14443$loading__5340__auto____14444.invoke(plugins.clj:1)\n\tat puppetlabs.trapperkeeper.plugins$eval14443.invoke(plugins.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6782)\n\tat clojure.lang.Compiler.eval(Compiler.java:6771)\n\tat clojure.lang.Compiler.load(Compiler.java:7227)\n\tat clojure.lang.RT.loadResourceScript(RT.java:371)\n\tat clojure.lang.RT.loadResourceScript(RT.java:362)\n\tat clojure.lang.RT.load(RT.java:446)\n\tat clojure.lang.RT.load(RT.java:412)\n\tat clojure.core$load$fn__5448.invoke(core.clj:5866)\n\tat clojure.core$load.doInvoke(core.clj:5865)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5671)\n\tat clojure.core$load_lib$fn__5397.invoke(core.clj:5711)\n\tat clojure.core$load_lib.doInvoke(core.clj:5710)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$load_libs.doInvoke(core.clj:5749)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$require.doInvoke(core.clj:5832)\n\tat clojure.lang.RestFn.invoke(RestFn.java:703)\n\tat puppetlabs.trapperkeeper.core$eval3$loading__5340__auto____4.invoke(core.clj:1)\n\tat puppetlabs.trapperkeeper.core$eval3.invoke(core.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6782)\n\tat clojure.lang.Compiler.eval(Compiler.java:6771)\n\tat clojure.lang.Compiler.load(Compiler.java:7227)\n\tat clojure.lang.RT.loadResourceScript(RT.java:371)\n\tat clojure.lang.RT.loadResourceScript(RT.java:362)\n\tat clojure.lang.RT.load(RT.java:446)\n\tat clojure.lang.RT.load(RT.java:412)\n\tat clojure.core$load$fn__5448.invoke(core.clj:5866)\n\tat clojure.core$load.doInvoke(core.clj:5865)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5671)\n\tat clojure.core$load_lib$fn__5397.invoke(core.clj:5711)\n\tat clojure.core$load_lib.doInvoke(core.clj:5710)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$load_libs.doInvoke(core.clj:5749)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:632)\n\tat clojure.core$require.doInvoke(core.clj:5832)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:6)\n\tat clojure.lang.RestFn.invoke(RestFn.java:457)\n\tat clojure.lang.Var.invoke(Var.java:394)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:165)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.core$apply.invoke(core.clj:630)\n\tat clojure.main$main_opt.invoke(main.clj:316)\n\tat clojure.main$main.doInvoke(main.clj:421)\n\tat clojure.lang.RestFn.invoke(RestFn.java:512)\n\tat clojure.lang.Var.invoke(Var.java:409)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:178)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.main.main(main.java:37)\nCaused by: java.lang.ClassNotFoundException: sun.misc.Launcher\n\tat java.net.URLClassLoader.findClass(java.base@9-internal/URLClassLoader.java:384)\n\tat clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:69)\n\tat java.lang.ClassLoader.loadClass(java.base@9-internal/ClassLoader.java:486)\n\tat clojure.lang.DynamicClassLoader.loadClass(DynamicClassLoader.java:77)\n\tat java.lang.ClassLoader.loadClass(java.base@9-internal/ClassLoader.java:419)\n\tat java.lang.Class.forName0(java.base@9-internal/Native Method)\n\tat java.lang.Class.forName(java.base@9-internal/Class.java:378)\n\tat clojure.lang.RT.classForName(RT.java:2154)\n\tat clojure.lang.RT.classForName(RT.java:2163)\n\tat clojure.lang.Compiler.maybeResolveIn(Compiler.java:7042)\n\tat clojure.core$ns_resolve.invoke(core.clj:4216)\n\tat clojure.core$ns_resolve.invoke(core.clj:4213)\n\tat clojure.core$resolve.invoke(core.clj:4222)\n\tat dynapath.defaults$when_resolves.doInvoke(defaults.clj:9)\n\tat clojure.lang.RestFn.invoke(RestFn.java:467)\n\tat clojure.lang.Var.invoke(Var.java:394)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:165)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.lang.Compiler.macroexpand1(Compiler.java:6631)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6709)\n\t... 132 more\n{code}\n\nThis code path seems to live here: https://github.com/tobias/dynapath/blob/master/src/dynapath/defaults.clj#L29-L33. We'll need to either submit a patch or find an alternative to using the dynapath library whenever we want to support java 9 in TK.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10293", "fixedVersions": ["TK 1.5.4"], "id": "10293", "issueType": "Bug", "key": "TK-368", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Fixed", "resolutionDate": "2018-02-16T11:35:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dynapath fails on java 9", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to jruby-utils#master at [47e065|https://github.com/puppetlabs/jruby-utils/commit/47e065a0735ffedbcaeb42d39c6b52fc819bc2f0].", "created": "2016-05-17T18:28:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Passed jruby-utils Jenkins pipeline here - https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_jruby-utils_unit-clj_master/11/.  Not in a state where it can be integrated with Puppet Server yet, so pulling through to done.", "created": "2016-05-18T12:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-20T12:03:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6a5c1c60"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndwf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_63466036_*|*_1_*:*_1_*:*_431941082_*|*_10007_*:*_1_*:*_599003257_*|*_3_*:*_1_*:*_1324390199_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_578225"}], "description": "Add callback hooks for cleanup and initialization to jruby-utils so that downstream projects like puppetserver can add custom logic.", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10250", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10250", "issueType": "Task", "key": "TK-367", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-05-18T12:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Add callback hooks for initialization and cleanup", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Tests passed in https://jenkins-enterprise.delivery.puppetlabs.net/view/clojure-libraries/view/all/job/enterprise_jruby-utils_unit-clj_master/13/", "created": "2016-06-07T11:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-20T12:02:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@75167fda"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn8ef:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_78469612_*|*_1_*:*_1_*:*_601399752_*|*_10007_*:*_1_*:*_332205614_*|*_3_*:*_1_*:*_710314766_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2422898939"}], "description": "Currently (in its mostly-just-copied-out-of-puppetserver state) jruby-utils is a trapperkeeper service. We are thinking that it does not need to provide the {{puppetlabs.services.jruby.jruby-service}} that it currently provides. jruby-utils will not be a \"pure\" library - it will still have a TK {{jruby-pool-manager}} service to handle coordination of creation of JRuby instances (see TK-370) - but it will not have this main service that it provides.\n\nWe might still keep the protocol around, but rather than having a TK service we might just have a {{create-jruby-pool}} function that would return an object that satisfied the protocol. Need to poke at this a bit and validate that this strategy is feasible and that we're not losing anything very useful if we get rid of the TK service.", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10291", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10291", "issueType": "Task", "key": "TK-366", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-06-07T11:31:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Get rid of references to TK jruby-service", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to jruby-utils#master at [4facd91|https://github.com/puppetlabs/jruby-utils/commit/4facd916e7929d0259d118eb0e4ab4e74fe73eb9].", "created": "2016-04-25T16:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-20T12:01:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2e82778"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1121"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5sk7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_52372_*|*_1_*:*_1_*:*_1751219_*|*_10007_*:*_1_*:*_256405343_*|*_3_*:*_1_*:*_93044313_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_566838_*|*_10006_*:*_1_*:*_97530025"}], "description": "The jruby-utils code was all copied out o Puppet Server, where it was used for interacting with Puppet's ruby code. Thus, there are many references to \"Puppet\" in the names of things etc. We want this to be a non-puppet specific library, so this ticket is for removing all references to Puppet.", "epicLinkSummary": "Extract JRuby library", "estimate": "PT0S", "externalId": "10243", "fixedVersions": ["JRUBY-UTILS 0.1.0"], "id": "10243", "issueType": "Task", "key": "TK-365", "labels": [], "originalEstimate": "PT0S", "parent": "15636", "parentSummary": "Extract JRuby library", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-04-25T16:50:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-utils: Change names of things to no longer reference \"Puppet\"", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-04-19T11:57:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f162f3a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5rlj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Found during work done for SERVER-1162, causing frequent CI test failures"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_7051636_*|*_1_*:*_1_*:*_18499_*|*_10007_*:*_1_*:*_76233661_*|*_3_*:*_1_*:*_3580628_*|*_5_*:*_1_*:*_0"}], "description": "The jruby_pool_int_tests have a couple of race conditions which lead to sporadic failures like these when run in Travis CI.  Failures were seen during the integration of a PR, https://github.com/puppetlabs/jruby-utils/pull/2, for SERVER-1162.  For example:\n\n{noformat}\nFAIL in (flush-jruby-pool-test) (jruby_pool_int_test.clj:165)\nFlushing the pool results in all new JRuby instances\nexpected: (true? (verify-no-constants pool-context 4))\n  actual: (not (true? false))\n{noformat}\n\nThe race conditions appear to be:\n\n1) A few of the tests, like {{flush-jruby-pool-test}}, register a watch with the pool agent and interpret the receipt of a callback for that watch as an indication that a pool flush has completed.  If the watch is registered before the pool is first initialized, however, the tests misinterpret the receipt of a callback for the pool initialization for that of a flush completion, leading the tests to make premature assertions about the outcome of a pool flush.\n\n2) Some tests use a helper method called {{wait-for-new-pool}} to wait for a new pool to be initialized after a flush has occurred.  {{wait-for-new-pool}} implicitly borrows pool instances, looking for a change in state, to gauge when the new pool is ready.  The borrowing of pool instances can trigger a max-requests-per-instance being hit on the instance, leading the function to misinterpret the new pool as being ready when a single instance from the current pool has just been flushed / replaced.  This also can lead tests to make premature assertions about the outcome of a 'full' pool flush that has not actually been completed.\n\n3) Some tests allow a max-requests-per-instance flush to be triggered just before shutdown, which can lead to a spurious \"Attempting to flush a pool that does not appear to have successfully initialized\" error being written to log.  This doesn't cause a test to fail but the presence of the message in the log is annoying.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10279", "fixedVersions": [], "id": "10279", "issueType": "Bug", "key": "TK-364", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-04-20T12:05:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jruby-pool-int test race conditions", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. Currently TK can take in any URI and tries to read it, which means that a user can give TK a URL and it will go and make a network request and try to load that URL.\n\nIs this really true?  Could you provide an example of a URI (I'm assuming you're thinking about an {{http:}} URI) and the behavior that happens?  I am having a hard to believing that there is code in TK that makes an HTTP request ... please ... no.  :)  If it just bombs-out with an error, that seems good enough.\n\n[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] - I am interested in the results of the test you were running, if you happen to learn anything interesting.", "created": "2016-04-20T11:32:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "I did this and it definitely worked.\n\n\nIn puppet-server, I ran {{lein run -c ~/.puppet-server/puppet-server.conf -b https://gist.githubusercontent.com/rlinehan/ceabc507af099160a54fab139cba7521/raw/2458840c7e838d8d3ddad86f49f5e82cd044805d/bootstrap.cfg}} (with dev/puppet-server.conf.sample copied to ~/.puppet-server/puppet-server.conf). Note that that gist has a line for a non-existent service {{foo/foo-service}}.\n\nThis produced the following output:\n\n{code}\n2016-04-20 10:33:08,227 DEBUG [main] [p.t.bootstrap] Loading bootstrap config from specified path: 'https://gist.githubusercontent.com/rlinehan/ceabc507af099160a54fab139cba7521/raw/2458840c7e838d8d3ddad86f49f5e82cd044805d/bootstrap.cfg'\n2016-04-20 10:33:09,277 INFO  [main] [o.e.j.u.log] Logging initialized @8319ms\n2016-04-20 10:33:12,541 DEBUG [main] [p.t.core] Finished TK main lifecycle, shutting down Clojure agent threads.\nException in thread \"main\" java.lang.IllegalArgumentException: Unable to load service: foo/foo-service, compiling:(/private/var/folders/9k/n0tqy1x515792y_xs5_h1wwr0000gq/T/form-init4032618173447046993.clj:1:125)\n        at clojure.lang.Compiler.load(Compiler.java:7239)\n        at clojure.lang.Compiler.loadFile(Compiler.java:7165)\n        at clojure.main$load_script.invoke(main.clj:275)\n        at clojure.main$init_opt.invoke(main.clj:280)\n        at clojure.main$initialize.invoke(main.clj:308)\n        at clojure.main$null_opt.invoke(main.clj:343)\n        at clojure.main$main.doInvoke(main.clj:421)\n        at clojure.lang.RestFn.invoke(RestFn.java:421)\n        at clojure.lang.Var.invoke(Var.java:383)\n        at clojure.lang.AFn.applyToHelper(AFn.java:156)\n        at clojure.lang.Var.applyTo(Var.java:700)\n        at clojure.main.main(main.java:37)\nCaused by: java.lang.IllegalArgumentException: Unable to load service: foo/foo-service\n        at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_$fn__14461.invoke(bootstrap.clj:43)\n        at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_.invoke(bootstrap.clj:40)\n        at puppetlabs.trapperkeeper.bootstrap$parse_bootstrap_config_BANG_$iter__14484__14488$fn__14489.invoke(bootstrap.clj:153)\n {code}\n\nSo yep, looks like it totally did just fetch this over the wire.", "created": "2016-04-20T11:41:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "L I L B", "created": "2016-04-20T11:55:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Yuuup", "created": "2016-04-21T10:21:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Since it is very unlikely that anyone will ever be able to maliciously change the URLs, closing this for now.", "created": "2018-02-16T11:25:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-13T12:38:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@38de1c23"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5o7j:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_600674797_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_57632101819"}], "description": "*tl;dr* You can give TK a URL and it will try to load it and read it as a bootstrap file.\n\nTK supports specifying a bootstrap from the command line, and this file can be inside a jar file. To accomplish this, a user can specify a URI of the form of {{jar:file///path/to/jar.jar!bootstrap.cfg}}. \n\nCurrently TK can take in any URI and tries to read it, which means that a user can give TK a URL and it will go and make a network request and try to load that URL. This is bad, and not a feature we intended to have. \n\nThe solution might involve constructing the URI object and verifying that its protocol is {{jar}}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10241", "fixedVersions": [], "id": "10241", "issueType": "Bug", "key": "TK-363", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Won't Fix", "resolutionDate": "2018-02-16T11:25:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Restrict bootstrap URI to jar protocol", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "Should just require updating the [{{logged?}} fn|https://github.com/puppetlabs/trapperkeeper/blob/master/test/puppetlabs/trapperkeeper/testutils/logging.clj#L321-L331] to use the {{maybe-level}} variable to filter messages similar to how it was done [previously|https://github.com/puppetlabs/trapperkeeper/blob/master/test/puppetlabs/trapperkeeper/testutils/logging.clj#L402-L405].\n\nShould be like a two line change. Hope to have a PR up this afternoon for it, just looking into the testing for it now.", "created": "2016-04-12T15:11:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "It should be noted that refactor in f9a385a adds support for strings and functions in addition to regex patterns to the matcher supplied to {{logged?}}. eg from the test suite:\n{code}\n(deftest with-test-logging                                                                                                                                                             \n  (testing \"basic matching\"                                                                                                                                                            \n    (doseq [[item test] [[\"foo\" \"foo\"                                                                                                                                                  \n                          \"barbar\" #\"rb\"                                                                                                                                               \n                          \"baz\" (fn [e]                                                                                                                                                \n                                  (and (= :trace (:level e))                                                                                                                           \n                                       (= \"baz\" (:message e))))]]]                                                                                                                     \n      (tgt/with-test-logging                                                                                                                                                           \n        (log/trace item)                                                                                                                                                               \n        (is (logged? test)))                                                                                                                                                           \n{code}", "created": "2016-04-12T15:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-12T15:07:00.000000", "creator": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4014f76c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5ndr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Small bug found while working other other code. Should be a half day to clean it up while thinking about it."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2917213_*|*_1_*:*_1_*:*_346484_*|*_10007_*:*_1_*:*_1534142_*|*_3_*:*_1_*:*_4334862_*|*_5_*:*_2_*:*_170770512_*|*_10011_*:*_1_*:*_851864"}], "description": "The ability of the {{logged?}} test macro to take a log level parameter was added in [17af9f9|https://github.com/puppetlabs/trapperkeeper/commit/17af9f936c6a12f5b0a128b03bb03c20c2ca772a]. During a heavy refactoring of the logging code we began to ignore the log level paramter (see [f9a385a|https://github.com/puppetlabs/trapperkeeper/commit/f9a385a395d96a0ca09bcf6556839f423bb708ad#diff-49564da9fd94b727bff7c9c84d3b8292R300])\n\nIronically, both of those changes landed between the release of 1.1.1 on April 15th, 2015 and 1.1.2 on January 4th, 2016 so we've never actually released a version of trapperkeeper where the documented log level matcher was honored.\n\nDespite having never worked in a release we still use the broken form in many projects including classifier, tk-auth, tk-status, code-manager, and puppet-server.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10561", "fixedVersions": [], "id": "10561", "issueType": "Bug", "key": "TK-362", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "resolution": "Fixed", "resolutionDate": "2016-04-14T17:19:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "logging testutils logged? ignores log-level parameter", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-metrics#master branch at [ef92c7|https://github.com/puppetlabs/trapperkeeper-metrics/commit/ef92c7d47be2eba2c3d5f28370ac77407777866c].  Marking this resolved.", "created": "2017-03-03T09:05:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-11T16:57:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@17bf49fc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1259"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hym97r:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Mar/17"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_619524724_*|*_1_*:*_1_*:*_151597349_*|*_10007_*:*_1_*:*_934505989_*|*_3_*:*_1_*:*_598917138_*|*_5_*:*_1_*:*_10120342889_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_25837124561"}], "description": "Add all of the code from pe-trapperkeeper-metrics to the OSS trapperkeeper-metrics, and mark the pe-trapperkeeper-metrics repo as unmaintained (or delete it).\n\nSet up an 0.x branch with CI for tk-metrics and make changes for new tk-metrics off master.", "epicLinkSummary": "Add Server metrics to OSS", "estimate": "PT0S", "externalId": "10239", "fixedVersions": ["TK Puppet5.0"], "id": "10239", "issueType": "Task", "key": "TK-361", "labels": [], "originalEstimate": "PT0S", "parent": "15592", "parentSummary": "Add Server metrics to OSS", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2017-06-28T13:17:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Collapse pe-trapperkeeper-metrics into trapperkeeper-metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "+1 I was wrong about the utility vs information disclosure continuum on this one.", "created": "2016-04-13T11:31:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "https://github.com/puppetlabs/ci-job-configs/pull/1279 is the ci-job-configs PR for getting jenkins jobs for the new 0.5.x branch of tk-auth.", "created": "2016-05-05T11:57:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] fyi, the proposed PR for this at https://github.com/puppetlabs/trapperkeeper-authorization/pull/39 would not only remove the rule name and the ip address of the requestor from the error message in the HTTP response but would also remove the requestor \"name\" - usually the Common Name pulled from the SSL certificate's subject - and whether or not the server considers the client to have been \"authenticated\" - usually set to 'true' when the client provided an SSL certificate for the request or 'false' if not.\n\nSo, for example, where a failure might have looked like the following in the HTTP response before...\n\n{noformat}\nForbidden request: myusername(192.168.1.1) access to /puppet/v3/catalog/notmyusername (method :get) (authenticated: true) denied by rule 'puppetlabs catalog'\n{noformat}\n\n... it would now just look like:\n\n{noformat}\nForbidden request: /puppet/v3/catalog/notmyusername (method :get).  Please see the server logs for details.\n{noformat}\n\nThe more detailed error message which would include the ip address, requestor name, authenticated true/false, and rule name would all still appear in the server log.\n\nThe description in this JIRA ticket doesn't explicitly call for purging the requestor name from the HTTP response, but I think I agree with [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091]'s implementation here.  For example, it seems possible that the connection might be SSL terminated between the client and the Puppet Server with the intermediate server using a different client cert name in the actual request forwarded on to the Puppet Server.  Returning that intermediate requestor name back to the client in the event of an authentication failure might still be inappropriate information disclosure.  This may be more farfetched and make it a little harder to debug auth failures but it seems reasonable to me.\n\n[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - does this sound okay to you?\n", "created": "2016-05-09T14:44:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Yep, seems fine. The *original* thing seemed farfetched to me, but as long as we're stripping info from the client's visibility we might as well get rid of it all.", "created": "2016-05-09T14:46:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Sounds good.  Thanks, [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0].", "created": "2016-05-09T14:52:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization#master at [93d61cf|https://github.com/puppetlabs/trapperkeeper-authorization/commit/93d61cfa6a296587548b0a23bdd3fbad1523f9fc].", "created": "2016-05-09T14:53:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Released in trapperkeeper-authorization 0.5.1 and 0.6.1. 0.6.1 will be in Puppet Server 2.4.0.", "created": "2016-05-19T10:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-11T12:52:00.000000", "creator": "557058:31c596d1-7e27-4c91-bc18-1254edb3caab", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1091c8b2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndxb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_609805151_*|*_1_*:*_2_*:*_241845070_*|*_10007_*:*_1_*:*_356253793_*|*_3_*:*_2_*:*_3424404_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1824971030"}], "description": "Right now if you try to access the /puppet endpoint via http request from an unauthenticated client you get an error message back:\n{noformat}\nForbidden request: <requester internal ip> access to /puppet (method :get) (authenticated: false) denied by rule '<tk-auth rule>'.\n{noformat}\n\nThe response to the client should remove the IP address and the tk-auth rule so as not to potentially include internal IPs of proxy servers or information about the tk-auth rule setup.\n\nThe IP and rule should be logged server-side but the client response should include minimal information.\n\nThis message seems to be set here: https://github.com/puppetlabs/trapperkeeper-authorization/blob/master/src/puppetlabs/trapperkeeper/authorization/rules.clj#L153-L156\n\n\n\n------------\n\nThis ticket probably involves:\n\n- making a branch for trapperkeeper-authorization 0.5.x\n- making a PR on ci-job-configs to add jenkins jobs for this branch\n- make a PR on tk-auth against 0.5.x for code for TK-360 \n- release a new 0.5.1 version of tk-auth\n- update Puppet Server 2.3.x to have 0.5.1 of tk-auth\n\n- merge up 0.5.x to master\n- release a new 0.6.1 (or something like that) version of tk-auth\n- update Puppet Server master to have this new version\n(these last two things might just be part of the rest of what we do for our next Server release)\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10237", "fixedVersions": [], "id": "10237", "issueType": "Bug", "key": "TK-360", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:31c596d1-7e27-4c91-bc18-1254edb3caab", "resolution": "Fixed", "resolutionDate": "2016-05-16T16:17:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Error messages returned to client should not include IP or rule blocking the request", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] hmmm", "created": "2016-04-07T22:05:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] hmmm", "created": "2016-04-07T22:06:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] don't our legacy puppet agent routes rely on the fallthrough behavior?", "created": "2016-04-07T22:07:00.000000"}, {"author": "557058:ff711d52-fce8-465e-b4dc-53bffb173693", "body": "Apologies - My keyboard spazzed out and assigned this to me.  I unassigned it from myself, and apologize for the confusion.", "created": "2016-04-08T08:44:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}I could have sworn that there are places in Puppet Server where we rely on that fall-through behavior and it works with comidi. Jeremy Barlow am I remembering incorrectly?{quote}\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I don't think there are any places in current Puppet Server code that apply to this scenario.  We have some cases in Puppet Server - the legacy puppet agent routes ones in particular - where we rely upon the ability to register multiple route handlers and have matching fall through to a second route handler even when the request is matched by the first-level handler but is not matched by a leaf-level sub-route within that first-level handler.\n\nSo, for example, if you had two separate contexts registered like:\n\n{code:clojure}\n(routes\n  ([\"/:environment\"]\n    (routes\n        (GET [\"/catalog\"] ...))))\n{code}\n\n{code:clojure}\n(routes\n   ([\"/puppet/\"\n      (routes\n          (\"/v3\"\n             (routes\n               (GET [\"/catalog\"] ...)))))\n{code}\n\n... if you had a request path of \"/puppet/v3/catalog\", it could be matched at the first level, \"/puppet\", by the first handler.  Because \"/v3/\" doesn't match one of the leaf routes, the request can fall through to the second handler, where the leaf node body for \"/catalog\" would be evaluated.\n\nI don't, however, think we have a case in Puppet Server where the body of a leaf route is evaluated and returns nil with the expectation that the request could subsequently be matched against another registered handler.\n", "created": "2016-04-13T13:55:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I think the behavior [~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] is describing for having a nil return from a leaf-route body leading to other routes being evaluated for a possible match seems like a reasonable thing to have happen - even if it doesn't today.  That said, I have no idea at this point how feasible it would be to change comidi (and the underlying bidi) implementations to implement this behavior.\n\n[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720], do you have a sense for how critical this is for PuppetDB?  Is this something that could be easily worked around or do you think we'll need to come up with a comidi/bidi fix in order to make it possible for PuppetDB to use comidi?  Trying to get a sense of how urgent this is from your perspective.", "created": "2016-04-13T14:01:00.000000"}, {"author": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] We've put the remaining bits of the migration from compojure to comidi on hold in lieu of a fix for this. I'm sure there are workarounds, but matching compojure's functionality here basically allows our maint mode handling to fit in the same routes as the rest of our API handlers, which is a really convenient way of avoiding the race conditions that come with sticking it in a separate tk service or something. Sticking the route tree in an atom is probably the next place I'd be looking as a workaround, but I think I like our current implementation (even given the tech debt of two routing libs) better than that.\n\nNone of this is urgent/critical -- nothing I know of depends on switching our stuff to comidi, it was more just that we thought we had an easy way to eliminate some light debt and it turned out not to be so easy.", "created": "2016-04-13T14:12:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] if anyone on your end were to end up with bandwidth to investigate whether this is a bidi issue or comidi issue, that'd be fantastic.\n\nI agree in spirit with the suggestion but not sure when we might end up with time to poke at it.", "created": "2016-04-13T14:16:00.000000"}, {"author": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I'm planning to pick up the comidi migration again in the next couple days -- will let you know what I find.", "created": "2016-04-20T12:20:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] awesome, thanks.  I'm interested to hear what you find.", "created": "2016-04-25T18:12:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-07T19:59:00.000000", "creator": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4fb53dd5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5kfb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1092171205_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_185588177180"}], "description": "Comidi and compojure differ in the behavior of the following two code snippets:\n\n{code}\n;; compojure\n(def app\n  (routes\n    (GET \"/\" [] nil)\n    (GET \"/\" [] \"Hello World\")))\n\n;; comidi\n(def app\n  (routes->handler\n    (routes\n      (GET \"/\" [] nil)\n      (GET \"/\" [] \"Hello World\"))))\n{code}\n\nIn compojure, if the handler returns nil, the request falls through to the remaining handlers. In comidi/bidi, a nil-valued handler response produces a 404. PDB currently relies on this fallthrough behavior to return a maintenance mode response while starting up. I think it's arguable whether what we're doing is a good idea, but I wonder if it would be beneficial to change this behavior to match that of compojure.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10235", "fixedVersions": [], "id": "10235", "issueType": "New Feature", "key": "TK-359", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:38:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "comidi: route fallthrough behavior on nil", "timeSpent": "PT0S", "updated": "2022-03-08T10:38:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-04-06T11:28:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@41a48d17"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5hvj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_603845277_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_58237855844"}], "description": "The lein TK template keeps not getting updated and no one notices. We should talk about how to automate smoke testing the template and combining that smoke test with the TK release stuff.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10344", "fixedVersions": [], "id": "10344", "issueType": "Task", "key": "TK-358", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Won't Do", "resolutionDate": "2018-02-16T11:23:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jenkins automation for lein TK template", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-04-05T14:58:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2d0aa595"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5hcf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_74627452_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_58840791734"}], "description": "Add something to the clj-http-client metric filtering that would allow you to flag whether you wanted only the exact match or everything underneath that in the tree when filtering metrics. E.g. if you had requests with metric ids {{[:foo :bar]}} and {{[:foo :baz]}} you might want to be able to ask for {{[:foo :*]}} and get both back.\n\nCurrently, you can only specify an exact match - e.g. {{(get-client-metrics-by-metric-id) [:foo])}} will just return the metric for {{foo}}, not for {{foo.bar}}.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10527", "fixedVersions": [], "id": "10527", "issueType": "Task", "key": "TK-357", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Do", "resolutionDate": "2018-02-16T11:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client metrics: Add ability to get child metric-id metrics", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] how useful does this seem to you?", "created": "2018-02-16T11:21:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Some variant of this might exist already with the globbing support that Jolokia provides to the {{metrics/v2}} API:\n\nhttps://jolokia.org/reference/html/protocol.html#paths\n\nHowever, to use globs effectively we need well-structured JMX names. Which... we don't have. Dropwizard metrics are a bit of a mess in that regard. The OpenJDK docs on ObjectName have more info on what things should look like:\n\nhttp://devdocs.io/openjdk~8/javax/management/objectname", "created": "2018-02-20T09:54:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Seems like this isn't super important, so I'm going to close this out. [~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] if you think we got this wrong feel free to reopen.", "created": "2018-02-20T16:52:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-05T14:54:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ce2ba0b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5hc7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Feb/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_74841053_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_59206222388"}], "description": "Currently (as of TK-316), clj-http-client has `get-client-metrics` and `get-client-metrics-data` functions that return all the metrics information filtered by a specific url (e.g. {{(get-client-metrics-by-url \"http://test.foo/bar\")}} will return metrics for requests to the url {{http://test.foo/bar}}). It might be useful to add the ability to filter the url metrics by a regex, rather than just having exact match.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10343", "fixedVersions": [], "id": "10343", "issueType": "Task", "key": "TK-356", "labels": ["metrics"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Do", "resolutionDate": "2018-02-20T16:52:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client metrics: Add ability to filter URL metrics via regex", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Docs were added at some point - closing.", "created": "2017-03-07T08:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-05T14:52:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@48ad9636"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5hbz:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_75004434_*|*_5_*:*_1_*:*_9777064896_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_28935818669"}], "description": "Currently clj-http-client has absolutely no docs. We should fix this.", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10278", "fixedVersions": ["TK Puppet5.0"], "id": "10278", "issueType": "Task", "key": "TK-355", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2017-03-07T08:26:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add docs to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-04-05T14:50:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@768b2d10"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymwef:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_75040769_*|*_10007_*:*_1_*:*_150018236_*|*_3_*:*_1_*:*_1013244885_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_12920262117"}], "description": "Add docs about the metrics in clj-http-client.", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10289", "fixedVersions": ["None"], "id": "10289", "issueType": "Task", "key": "TK-354", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-09-16T11:46:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Write docs on metrics for clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "I tested out the following characters:\n\n`~!@#$%^&*()_-+=[{]}\\|", "created": "2016-09-14T18:10:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Does this seem sufficient to you as far as testing this, or do you think there are other characters I should test?", "created": "2016-09-14T18:10:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm good", "created": "2016-09-15T16:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-05T14:48:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@34a14942"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymwe7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Sep/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_75221047_*|*_3_*:*_1_*:*_1013419681_*|*_10009_*:*_1_*:*_80978767_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_12920277432_*|*_10005_*:*_1_*:*_3210"}], "description": "Before we release clj-http-client with the changes made for TK-316, we should play with graphite and validate that it's possible to access metrics that have funky characters in them, e.g. from a URL being embedded in a metric name. If there are issues, create additional tickets to handle them/add \"known issues\" to http client docs/changelog.", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10624", "fixedVersions": ["None"], "id": "10624", "issueType": "Task", "key": "TK-353", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-09-15T16:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Play with clj-http-client metrics in graphite", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "attachments": [], "comments": [{"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:623c08e1562ab90069f8aed4] [~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] I'd *really* like to make sure that we're all on the same page before I start on this ticket. \n\nCurrently, this ticket covers the ability to specify the following in a tk-auth file:\n\n\n{noformat}\nallow: {extensions: {pp_role: \"compile master\",\n                               subjectAltName: \"something set by a signer\"}}\n\n{noformat}\n\nWhich means a request will be allowed if and only if:\n\n 1. the pp_role extension equals the string \"compile master\"\n 2. somewhere in the subjectAltName, the string \"something set by a signer\" is found set as one of the possible values in the subjectAltName data structure.\n\nIs this sufficient to satisfy our initial security needs *and* cut down on the amount of manual tk-auth intervention required by users in a meaningful way?", "created": "2016-04-08T15:51:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "It solves my security fear, which was certificates that silently got an extension they weren't supposed to have. You've only ever been able to get alt names noisily, so \ud83d\udc4d\ud83c\udffc\n\nI don't know enough about avoiding manual intervention at the moment. Were we testing for specific alt names, or just testing whether the set of alt names is non-empty? ", "created": "2016-04-08T16:07:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:62438584f813eb006928dc81] [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] It sounds like this ticket should be rephrased. Instead of supporting a subjectAltName key that matches on a value in the subjetAltName data structure in someway, this ticket should be about matching the certname of an allow/deny with something in subjectAltName (ie in the same way that SSL does).\n\nDoes that sound right? If we want both behaviors we can implement both under the auspices of this ticket since the meat of that is parsing subjectAltName either way (exposing that through certname matching, extension matching, or both is not hard).", "created": "2016-04-20T13:27:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Yes, IMO rules which employ name matches on the certificate subject should also match any entry in subjectAltNames.", "created": "2016-04-25T13:20:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "This has passed CI.", "created": "2016-05-18T02:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-04-04T18:23:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@721ede0c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1305"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndr3:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_30545286_*|*_1_*:*_1_*:*_148456799_*|*_10007_*:*_1_*:*_1813804612_*|*_3_*:*_2_*:*_174982702_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_1120278601_*|*_10006_*:*_1_*:*_456227869"}], "description": "*In Scope*\n\n* Writing clojure code to parse subjectAltName so we can match on it\n* Supporting subjectAltName as an extension available for matching (ie, matching if one of the names in the subjectAltName data structure matches a configured value)\n* Consider subjectAltNames when doing a certname match (mimicking SSL's host matching behavior).\n* Documenting this behavior\n\n*Out of Scope*\n\n* Changes to how we match extensions\n\n*Open Questions*\n\n* Should the certname changes be toggle-able? and on/off by default?", "epicLinkSummary": "Securing SSL Extensions", "estimate": "PT0S", "externalId": "10417", "fixedVersions": [], "id": "10417", "issueType": "Improvement", "key": "TK-352", "labels": [], "originalEstimate": "PT0S", "parent": "16417", "parentSummary": "Securing SSL Extensions", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Done", "resolutionDate": "2016-05-18T02:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support subjectAltName in tk-auth", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Audited the bootstrap namespace. Found one error that needed to be improved: https://github.com/puppetlabs/trapperkeeper/pull/237", "created": "2016-05-02T16:03:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-31T15:08:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@138e822"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1213"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xnj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_10145395_*|*_1_*:*_1_*:*_99599_*|*_10007_*:*_1_*:*_67689458_*|*_3_*:*_1_*:*_6036951_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_908186_*|*_10006_*:*_1_*:*_2761933362"}], "description": "To make debugging easier, anytime a bootstrap related error is logged, it should mention which file(s) it came from. \n\nCompleting this ticket will involve auditing all the bootstrap error handling in TK and updating any logging if necessary ", "epicLinkSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "estimate": "PT0S", "externalId": "10489", "fixedVersions": ["TK 1.4.1"], "id": "10489", "issueType": "Task", "key": "TK-351", "labels": [], "originalEstimate": "PT0S", "parent": "15641", "parentSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Fixed", "resolutionDate": "2016-05-03T13:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ensure all bootstrap related errors log what file they come from", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Released 1.3.0 to clojars.", "created": "2016-04-13T18:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-31T08:49:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@79e6c39d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5ecv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_91333311_*|*_1_*:*_1_*:*_527600176_*|*_10007_*:*_1_*:*_106596783_*|*_3_*:*_1_*:*_1385600_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_431112371"}], "description": "The TK lein template is several TK releases out of date, and a handful of people ([~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] , [~accountid:557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e], IIRC) have mentioned that that caused issues / confusion for them.  We should update it to the latest TK and fix any issues.\n\n[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] also suggested that we add the {{:pedantic}} flag to the {{project.clj}} because it wasn't obvious to him that there were dependency conflicts when he was trying to use that as a starting point for a project.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10510", "fixedVersions": [], "id": "10510", "issueType": "Task", "key": "TK-350", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-04-13T18:30:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update TK lein template", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:41dc5120-addb-42c7-aff4-2d00c35c948c] I think the fix version of this should actually be TK 1.4.0 (based on the changelog at https://github.com/puppetlabs/trapperkeeper/blob/master/CHANGELOG.md#140).", "created": "2016-07-25T11:53:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-30T10:31:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@583a5c5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1213"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynf67:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_594955021_*|*_1_*:*_1_*:*_2350663_*|*_10007_*:*_1_*:*_272632287_*|*_3_*:*_1_*:*_352700206_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_437966761_*|*_10006_*:*_1_*:*_1289183451"}], "description": "As part of the discussion in SERVER-1213, it seems like there are some desirable user workflows that would warrant tolerating the existence of a line in the bootstrap configuration that doesn't map to an actual clojure service var.\n\nThe basic idea is that, for forward compatibility, users should be able to modify their config to specify new services that they know will be available in an upcoming release, prior to actually upgrading to that new release.  The desired behavior is that the app would not fail to start in such a case, and then they could have their systems pre-configured for how they want things to work when they do roll out the package upgrades.\n\nFrom a technical perspective, I think this would just be a matter of changing the behavior so that when we try to reference the var that we found in the config, if the var doesn't exist, we simply log a warning rather than throwing an exception.", "epicLinkSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "estimate": "PT0S", "externalId": "10234", "fixedVersions": ["TK 1.4.0"], "id": "10234", "issueType": "Task", "key": "TK-349", "labels": [], "originalEstimate": "PT0S", "parent": "15641", "parentSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-05-03T13:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK should not fail during startup if an unrecognized service is found in bootstrap config", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "should it split on commas to be consistent with the {{--config}} argument?", "created": "2016-03-29T14:44:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c0b72bef8a60068c796ce] ah, yeah, whatever {{--config}} does, definitely.", "created": "2016-03-29T14:58:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [2158095|https://github.com/puppetlabs/trapperkeeper/commit/21580952ea945adae55b6e6bdf36f0c88ecdd7ae].", "created": "2016-04-01T14:45:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Resolved per QA risk assessment.", "created": "2016-04-05T12:13:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-22T17:12:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2c645b86"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1213"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z2n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_254604592_*|*_1_*:*_1_*:*_65348507_*|*_10007_*:*_1_*:*_192176951_*|*_3_*:*_1_*:*_578446389_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_81856220_*|*_10006_*:*_1_*:*_19237921"}], "description": "Currently, the bootstrap-config CLI argument in TK only accepts a single file path as its value.  It parses that file and interprets it as the list of services to boot the app with.\n\nThis ticket would cover some extensions to that logic:\n\n1. The argument should also tolerate a directory being passed in.  If the value passed in is a directory, then TK should slurp in all of the \".cfg\" files in that directory to come up with the list of TK services var names, and then pass that list off to the existing code that validates and boots them.\n2. The argument should tolerate a colon-delimited path being passed in.  In this case, it should split the value on \":\" characters, and for each entry in the path, perform the same logic of slurping in service varnames from the files/directories, and then pass that list off to the existing code that validates and boots them.  (The current code for dealing with the \"--config\" argument should hopefully be able to be re-used for this part, because it already has support for splitting paths on \":\" chars, checking to see if the path entries are files or dirs, etc.)\n\nThese changes should be backward compatible, so that any consumer that wishes to continue passing in a simple path to a single file should be able to keep working as before.", "epicLinkSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "estimate": "PT0S", "externalId": "10488", "fixedVersions": ["TK 1.4.1"], "id": "10488", "issueType": "Task", "key": "TK-347", "labels": [], "originalEstimate": "PT0S", "parent": "15641", "parentSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-04-05T12:13:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support directories and paths in TK's \"bootstrap-config\" CLI argument", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-03-21T17:27:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4b31ac98"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1235"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynjzj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_754769091_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_91343659281"}], "description": "This is related to TK-345.  In the mailing list discussion, [~accountid:70121:4c2994e4-73a9-4e99-971a-6d93d39be223] brought up some good points about edge cases that could occur when we are writing the 'restart id file' to indicate that the TK app has successfully restarted.  He suggested using ATOMIC_MOVE via Java NIO, and taking a few other precautions, to ensure that the file write appears atomic to consumers.\n\nFor the initial pass, just to get something up and running, we'll probably forego this, but it'd be good to follow up and make it more robust once it's operational.", "epicLinkSummary": "Puppet Server HUP Loose Ends", "estimate": "PT0S", "externalId": "10232", "fixedVersions": [], "id": "10232", "issueType": "Task", "key": "TK-346", "labels": [], "originalEstimate": "PT0S", "parent": "16983", "parentSummary": "Puppet Server HUP Loose Ends", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Fix", "resolutionDate": "2019-02-20T15:21:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improve resiliency of write operations for 'restart id file'", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think that [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] suggested that it might be better to have this setting go into the 'global' section of the config, like the location of the logback config file does.  That does sound better to me", "created": "2016-07-19T11:42:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "It appears that we just hard-code the path for the logging config destination into the packaging for OSS Puppet Server:\n\nhttps://github.com/puppetlabs/puppetserver/blob/203d9767582d9e3194f4a6abca598d6289162655/ezbake/config/conf.d/global.conf#L4\n\nand pe-puppetserver:\n\nhttps://github.com/puppetlabs/pe-puppetserver/blob/44988b90df586be6262b7a1615203c7de5cf4c64/config/conf.d/global.conf#L4\n\nIt seems like the same approach would be suitable for the new \"restart-file\" path, since we should know ahead of time what the file path should be.\n\n[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] does that sound OK?", "created": "2016-07-19T11:46:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "I have no objections ", "created": "2016-07-19T11:54:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4] this is probably a good namespace to look into adding a test to:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/b2659b1d2f1b7c0dc190ea57271f9d0e143cf63e/test/puppetlabs/trapperkeeper/services_test.clj\n\nHere is where the app calls the start lifecycle functions:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/b2659b1d2f1b7c0dc190ea57271f9d0e143cf63e/src/puppetlabs/trapperkeeper/internal.clj#L564", "created": "2016-07-19T12:57:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Here is where the `build-app*` gets called, so you can see what the config fn that is getting passed in will look like:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/b2659b1d2f1b7c0dc190ea57271f9d0e143cf63e/src/puppetlabs/trapperkeeper/core.clj#L44\n\nHere's the place where the config service reads the global config for the log config file path:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/b2659b1d2f1b7c0dc190ea57271f9d0e143cf63e/src/puppetlabs/trapperkeeper/config.clj#L131\n\nThat's going to be a tad different from how you'll want to access the config, since they just have a map there, and you will have a function that *returns* a map, but it'll be similar.", "created": "2016-07-19T13:00:00.000000"}, {"author": "557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I have a few questions. What are your thoughts on resetting the counter file? It needs to be reset somehow, and if people write scripts to simply check for an increment from the original value then a file that has been reset to \"0\" will throw things off. Also what should the behavior be if a file exists but we do not have permission to read/write that file?", "created": "2016-07-21T16:33:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Under what circumstances are you thinking that it would need to be reset?\n\nAs for people writing scripts - we're not going to support that since we'll have our own CLI tools that will abstract that implementation detail away from the user.\n\nIf we don't have file perms we should just let the resulting FilePerm exception bubble up as a fatal error.", "created": "2016-07-21T17:02:00.000000"}, {"author": "557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Well if it eventually hit a really big number it might not be able to be parsed as `Int` anymore I believe", "created": "2016-07-21T17:10:00.000000"}, {"author": "557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4", "body": "Unless that's really not likely", "created": "2016-07-21T17:11:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{code}\n(+ 1 Long/MAX_VALUE)\njava.lang.ArithmeticException: integer overflow\n{code}\n\nWhen you do the increment you could catch that exception and reset to zero.  Or, you could choose a lower number like, I dunno, 1 million, and say that if the increment takes us over that threshold then we'll restart at zero.", "created": "2016-07-21T17:14:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-21T17:07:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@da7e6f8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1237"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynjzb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_755943742_*|*_10007_*:*_1_*:*_173588383_*|*_3_*:*_1_*:*_514988811_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_9596507735"}], "description": "In EZ-67 we describe some work to make EZBake pass in another CLI argument to TK; this argument might be called something like \"--restart-id-file\", and would specify a file path that should be used to read/write when a restart occurs.\n\nOn the TK side, this argument should be optional, so, for backward compat, if it's not passed then we won't change the behavior of TK at all.  If the argument *is* passed, then TK should do the following:\n\n1. Prior to startup, if the file exists, read an integer from it.  If the file doesn't exist (or if we can't read an integer from it), then we'll just use 0 or 1 as a starting point.\n2. As soon as we successfully complete the {{start}} phase of all services, we should increment this integer and write the new value back to the file.\n\nTest coverage should ensure that the integer is updated on every HUP restart as well as on the initial startup.", "epicLinkSummary": "HUP service / ezbake integration", "estimate": "PT0S", "externalId": "10277", "fixedVersions": ["TK 1.5.1"], "id": "10277", "issueType": "Task", "key": "TK-345", "labels": [], "originalEstimate": "PT0S", "parent": "16403", "parentSummary": "HUP service / ezbake integration", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-07-27T12:04:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for optional 'restart file' CLI arg", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [278eda5|https://github.com/puppetlabs/trapperkeeper/commit/278eda5a34228807617308f6d3171f2a6b16b61d].", "created": "2016-03-21T14:58:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This is a better, long term fix for SERVER-1215.  It has been adequately tested by [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] (see comments in PR.  Setting low risk and resolving.", "created": "2016-03-29T13:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-18T15:45:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6ef5e907"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z27:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bug discovered by OSS user"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_678014957_*|*_1_*:*_1_*:*_172895_*|*_10007_*:*_1_*:*_256173716_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_8906826"}], "description": "In SERVER-1215, we discovered that we were bringing in different (conflicting) versions of various logback artifacts because the logback dependencies are scattered over multiple projects.  This ticket covers adding all of the dependencies to TK explicitly, so that any downstream conflicts will be discovered at build time.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10487", "fixedVersions": [], "id": "10487", "issueType": "Bug", "key": "TK-344", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-29T13:46:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "specify all logback artifact versions in tk dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Resolved per risk assessment.", "created": "2016-04-19T14:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-18T14:32:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2487b913"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CVE-ID", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "CVE-2016-2785"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyngi7:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Related to other work in the sprint"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1220106795_*|*_1_*:*_1_*:*_83665_*|*_10007_*:*_1_*:*_1210995161_*|*_3_*:*_1_*:*_330403674_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_3276481"}], "description": "This ticket would cover some work to be done in trapperkeeper-webserver-jetty9 to allow for registered handlers - servlets, ring-handlers, etc. - to have a layer of middleware optionally turned on that would \"normalize\" the URI path which is returned when a handler calls {{.getRequestURI}} on an {{HttpServletRequest}}.\n\nA handler would opt into the application of this middleware by providing the following key/value pair during an {{add-*-handler}} registration:\n\n{noformat}\n:normalize-request-uri: true\n{noformat}\n\nHandler registrations that do not provide this option would not have the middleware applied, resulting in the original raw URI value being returned for an {{HttpServletRequest.getRequestURI}} call.\n\nURI normalization will consist of the following:\n\n1) Decode any percent-encoded characters:\n\n  /foo//bar/%2E%2E/ba%7A => /foo//bar/../baz\n\nFor this, we\u2019ll be using Jetty's URIUtil.decodePath() method ...\n\nhttps://github.com/eclipse/jetty.project/blob/jetty-9.2.10.v20150310/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java#L260-L329\n\n... where the path from the URI would be the argument to \u201cpath\u201d.  This method uses the value for the 'org.eclipse.jetty.util.URI.charset' system property to determine the character encoding considered when decoding any percent-encoded characters.  When this property is not defined, it defaults to UTF-8.  Where there isn\u2019t an intrinsic expression of the character set in the HTTP URI as provided on the wire and the W3C recommends \u201cUTF-8\u201d - https://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars - it seems most sane to just assume that the URI was encoded in \u201cUTF-8\u201d by default.\n\nWe also considered the possibility of using either the java.net.URLDecoder() from the JDK or java.org.apache.commons.code.net.URLCodec.decode() from Apache Commons for this step.  We ultimately chose not to go with either of these because they appear to have been written to percent-decode characters without specific context for character decoding within the path component of a URI.  For example, it is legal for a '+' character to be represented literally - not encoded as %2B so as to avoid confusion with the percent-encoding of a space character - in the path component of a URI.  Both URLDecoder() and URLCode.decode(), however, will percent-decode a '+' character back to a space, which would be inappropriate when decoding a URI path.  The URIUtil.decodePath() method, however, will preserve a '+' character when decoding.\n\nIn addition to percent-decoding, however, the URIUtil.decodePath() method also strips everything that might appear including and after the first non-percent encoded semicolon in a URI path.\n\nThe URL RFC - RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt) - seems a bit ambiguous about whether a semicolon is required to be percent-encoded while in transit. The schema from section 5, BNF for specific URL schemes, seems to indicate that it might not need to be encoded:\n\n{quote}\n; HTTP\n\nhttpurl = \"http://\" hostport [ \"/\" hpath [ \"?\" search ]]\nhpath = hsegment *[ \"/\" hsegment ]\nhsegment = *[ uchar | \";\" | \":\" | \"@\" | \"&\" | \"=\" ]\n{quote}\n\nHowever, section 3.3, HTTP, has:\n\n{quote}\nWithin the <path> and <searchpart> components, \"/\", \";\", \"?\" are reserved.\n{quote}\n\nUltimately, by choosing URIUtil.decodePath() method as part of the implementation, any clients will need to percent-encode a semicolon character to avoid having the semicolon and any subsequent characters be chopped off of the URI path passed down to any consumers.\n\nIf an error is encountered in the process of percent decoding, e.g., the original URI is missing the second alphanumeric character in a percent sequence (/foo/%2%E/), an HTTP 400 Bad Request will be returned.\n\n2) \u201cCanonicalize\u201d - check for relative path sequences in the original uri.  For example:\n\n  .\n  ..\n  blah/../\n  blah/./blah/../blah\n\nWe would use Jetty\u2019s URIUtil.canonicalPath() method to determine when such sequences exist in a URI:\n\nhttps://github.com/eclipse/jetty.project/blob/jetty-9.2.10.v20150310/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java#L452-L578\n\nThe logic would involve just passing in the original URI and comparing the result returned from the method.  If the result were <null> (which would happen in the case of a reference made to a location above the root path) or had different content than the value passed in (meaning that one or more sequences would have been removed), an HTTP 400 Bad Request error would be thrown.\n\n3) Compact out any redundant forward-slash characters:\n\n  /foo//baz => /foo/baz\n\nFor this part, we would use Jetty\u2019s URIUtil.compactPath() method:\n\nhttps://github.com/eclipse/jetty.project/blob/jetty-9.2.10.v20150310/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java#L586-L641", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10342", "fixedVersions": [], "id": "10342", "issueType": "New Feature", "key": "TK-343", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-04-19T14:34:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "URL normalization middleware for handlers in tk-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "body": "I've almost finished a PR for this, but I'd like to run it by the PDB team first.", "created": "2016-03-16T08:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-16T08:26:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1cc3e36d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5307:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Realized fix was trivial after discussion with Chris"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "PuppetDB"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_13233509_*|*_10007_*:*_1_*:*_596629194_*|*_5_*:*_1_*:*_0"}], "description": "After some discussion with Chris, it seemed like we might want some higher level convenience wrappers in testutils.logging.  In particular, wrappers that would present the log as event->map maps, rather than raw log events, and that would handle setting up the destination atom themselves.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10560", "fixedVersions": [], "id": "10560", "issueType": "Improvement", "key": "TK-342", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Fixed", "resolutionDate": "2016-03-23T09:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add event-map oriented logging test wrappers", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "[~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100] [~accountid:623e754d94742a00683f7cf0]\u00a0added some GC stats to our general metrics for clojure projects: [https://github.com/puppetlabs/trapperkeeper-status/pull/62]\u00a0does this give you the info you need or do you need more?", "created": "2018-02-07T16:54:00.000000"}, {"author": "557058:6fc1f430-f771-4686-a97e-21c5e35f9100", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] The JVM information we currently get is \n\n{code}\n\"experimental\": {\n              \"jvm-metrics\": {\n                \"cpu-usage\": 26.025,\n                \"up-time-ms\": 450480801,\n                \"gc-cpu-usage\": 0.3275,\n                \"threading\": {\n                  \"thread-count\": 166,\n                  \"peak-thread-count\": 186\n                },\n                \"heap-memory\": {\n                  \"committed\": 2114977792,\n                  \"init\": 2147483648,\n                  \"max\": 2114977792,\n                  \"used\": 1491460544\n                },\n                \"gc-stats\": {\n                  \"PS Scavenge\": {\n                    \"count\": 335875,\n                    \"total-time-ms\": 11138992,\n                    \"last-gc-info\": {\n                      \"duration-ms\": 49\n                    }\n                  },\n                  \"PS MarkSweep\": {\n                    \"count\": 7244,\n                    \"total-time-ms\": 3886754,\n                    \"last-gc-info\": {\n                      \"duration-ms\": 560\n                    }\n                  }\n                },\n                \"start-time-ms\": 1517597580627,\n                \"file-descriptors\": {\n                  \"used\": 173,\n                  \"max\": 12000\n                },\n                \"non-heap-memory\": {\n                  \"committed\": 393420800,\n                  \"init\": 2555904,\n                  \"max\": -1,\n                  \"used\": 254875824\n                }\n              }\n{code}\n\nI think that the gc stats section might allow us to deduce which GC algorithm is being used.  So it might resolve this issue.  I'll see what Charlie thinks.  ", "created": "2018-02-07T17:07:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Going to close this out as duplicated by TK-409 which added the {{gc-stats}} section that has the name of each garbage collection algorithm in use.", "created": "2020-08-27T16:53:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-15T16:39:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@433096f7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz52sf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Feb/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_67446581_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_70782492506_*|*_10005_*:*_1_*:*_69637322474"}], "description": "In a recent conversation with [~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100] he mentioned that he had done some experiments where he had several puppet server instances using the default GC and several other ones using GC1.  It would be useful to be able to distinguish between these cases by just looking at the status output, and it seems like adding some basic info about GC settings to the tk-status status info would be fairly straightforward.", "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10230", "fixedVersions": [], "id": "10230", "issueType": "Improvement", "key": "TK-341", "labels": [], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Duplicate", "resolutionDate": "2020-08-27T16:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add info about GC type to status endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-03-10T16:09:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@36c390e0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4zrj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_497202728_*|*_5_*:*_1_*:*_29731_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1816136843_*|*_10005_*:*_1_*:*_58686722040"}], "description": "For the first pass at metrics for clj-http-client, we have one type of timer per-request, which is stopped when the bytes for the response have all been read. We would also like to add a timer that gets stopped when the response has been initialized/the first byte of data has been received.\n\nThus, for this ticket, a GET request to {{http://localhost/foo}} would have a timer now have a timers\n\n{code}\npuppetlabs.http-client.experimental.with-url.http://localhost/foo.initial-response\npuppetlabs.http-client.experimental.with-url.http://localhost/foo.GET.initial-response\n{code}\n\nin addition to timers\n\n{code}\npuppetlabs.http-client.experimental.with-url.http://localhost/foo.full-response\npuppetlabs.http-client.experimental.with-url.http://localhost/foo.GET.full-response\n{code}\n\nadded in TK-316.\n\nIf this example request also had a {:metrics-id [:foo :bar]} request option, it would also have timers\n\n{code}\npuppetlabs.http-client.experimental.with-metrics-id.foo.initial-response\npuppetlabs.http-client.experimental.with-metrics-id.foo.bar.initial-response\npuppetlabs.http-client.experimental.with-metrics-id.foo.baz.initial-response\n{code}\n\nin addition to the timers\n\n{code}\npuppetlabs.http-client.experimental.with-metrics-id.foo.full-response\npuppetlabs.http-client.experimental.with-metrics-id.foo.bar.full-response\npuppetlabs.http-client.experimental.with-metrics-id.foo.baz.full-response\n{code}\n\nadded as part of TK-317.\n\nThis ticket should also update the {{getClientMetrics}} and {{getClientMetricsData}} methods (and their clojure variants) to return only the {{response-init}} metrics or only the {{bytes-read}} metrics.", "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10526", "fixedVersions": [], "id": "10526", "issueType": "New Feature", "key": "TK-340", "labels": ["metrics"], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Fix", "resolutionDate": "2018-02-14T16:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client metrics: Add timer for response received/initialized", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-webserver-jetty9#master at [e27bbb|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/e27bbb950beb070ebc548b845d2a8fe544a1b199].", "created": "2016-03-12T00:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-08T11:19:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@75ba524d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4ynb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_206730057_*|*_1_*:*_1_*:*_82910103_*|*_10007_*:*_1_*:*_113711631_*|*_3_*:*_1_*:*_3797216_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_104440279"}], "description": "In TK-338 I put together a patch to handle the TimeoutException during tk-j9's 'stop' phase.  It needs a test or two, but I didn't put those in the initial PR because I've done a lot of manual testing and we need to get things promoted in order to hit our ship dates.\n\nThis ticket is to capture the follow-up work around adding a test for that functionality.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10416", "fixedVersions": [], "id": "10416", "issueType": "Task", "key": "TK-339", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-14T10:26:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-j9: add tests around handling timeoutexception during stop", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-03-07T16:02:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d24781c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynkkv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "discovered bug during HUP stress testing"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_172830877_*|*_1_*:*_1_*:*_72428_*|*_10007_*:*_1_*:*_20965709_*|*_3_*:*_1_*:*_69264340_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_427575722"}], "description": "Update:\n\nAfter some discussion with [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f], [~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49], and [~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100], we decided that the default timeout was reasonable.  Therefore the scope of this ticket now is just to make sure that we handled the TimeoutError and successfully restart Jetty during a HUP.  Have done a decent amount of manual testing around this and examined heap dumps to make sure that the system is behaving as expected.  Filed TK-339 to add clojure unit tests ASAP.\n\nOriginal:\n\nThis is an exploratory ticket related to TK-336.  I need to get a build of tk-j9 that does not treat a `stopTimeout` as a fatal exception, and probably increases the default value for `stopTimeout`.  Then we need to get those changes into a build of pe-puppetserver for manual gatling stress testing and start to decide whether that is a workable short-to-medium-term solution for the HUP issues described in TK-336.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10486", "fixedVersions": [], "id": "10486", "issueType": "Improvement", "key": "TK-338", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-15T16:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK-J9 handle timeoutexception during stop, log error", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "This was merged days ago, so I'm closing it out", "created": "2016-03-21T14:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-07T11:52:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@55e6ca9d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4ilz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_171822231_*|*_10007_*:*_1_*:*_611972824_*|*_3_*:*_1_*:*_248794235_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_182808157"}], "description": "This happens on most of the tk-status test runs. It's a timing issue and fiddling with the timeout can increase/decrease its likelihood. the test should be made more robust.\n\n10:29:00 FAIL in (error-handling-test) (status_core_test.clj:82)\n10:29:00 when there is an error checking status and it is from a timeout\n10:29:00 expected: (logged? #\"Status callback interrupted\" :error)\n10:29:00   actual: (logged [#object[ch.qos.logback.classic.spi.LoggingEvent 0x6a373351 \"[ERROR] Status callback timed out, shutting down background task\"] #object[ch.qos.logback.classic.spi.LoggingEvent 0x4e0a4151 \"[ERROR] #error {\\n :cause nil\\n :via\\n [{:type java.util.concurrent.CancellationException\\n   :message nil\\n   :at [java.util.concurrent.FutureTask report FutureTask.java 121]}]\\n :trace\\n [[java.util.concurrent.FutureTask report FutureTask.java 121]\\n  [java.util.concurrent.FutureTask get FutureTask.java 188]\\n  [clojure.core$deref_future invoke core.clj 2186]\\n  [clojure.core$future_call$reify__6736 deref core.clj 6683]\\n  [clojure.core$deref invoke core.clj 2206]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9230$guarded_status_fn_call__9235$fn__9236$fn__9246 invoke status_core.clj 233]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9230$guarded_status_fn_call__9235$fn__9236 invoke status_core.clj 233]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9230$guarded_status_fn_call__9235 invoke status_core.clj 216]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9330$call_status_fn_for_service__9339$fn__9342 invoke status_core.clj 297]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9330$call_status_fn_for_service__9339 invoke status_core.clj 280]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9330$call_status_fn_for_service__9339$fn__9340 invoke status_core.clj 290]\\n  [puppetlabs.trapperkeeper.services.status.status_core$eval9330$call_status_fn_for_service__9339 invoke status_core.clj 280]\\n  [puppetlabs.trapperkeeper.services.status.status_core_test$fn__9635$fn__9646$fn__9649$fn__9652$fn__9653$fn__9656 invoke status_core_test.clj 80]\\n  ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10341", "fixedVersions": [], "id": "10341", "issueType": "Bug", "key": "TK-337", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Fixed", "resolutionDate": "2016-03-21T14:29:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "intermittent failure in tk-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "created": "2016-03-08T13:38:00.000000", "name": "puppetserver.log", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10067"}], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:836ef76e-8051-48a3-8dc7-005f79695b0e] when you get to the HUP docs we should probably chat about this.  The more I think about it, the more I think that we will need to document this as a known issue if we don't come up with a fix for it prior to ship.  And if we do that then we should probably flag the whole feature as a 'tech preview' or something and indicate that it is more suitable for use in development workflows for now, and needs hardening before being used in production workflows?\n\nping [~accountid:70121:690f8c77-a5af-4d4c-96f0-c3c253283fd2] because I included the phrase \"UX\" in the description on this ticket :)", "created": "2016-03-07T12:49:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "After talking through some ideas with [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f], I think the first thing to try is a combination of increasing the stopTimeout and swallowing the exception.  I'm going to create a different ticket to use to estimate and track that chunk of work, and come back and see what the results mean in terms of the bigger for this ticket afteward.", "created": "2016-03-07T15:57:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Attached a full log file containing the error to the ticket.", "created": "2016-03-08T13:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] this is the original ticket I'd created to capture the issues I'd run into.  I created some smaller tickets to cover the initial phases of the exploratory work (e.g. TK-338).  Now that it seems that those will probably be sufficient, I think that this one can just be closed out.  Any concerns with that?", "created": "2016-03-09T09:38:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This work ended up being covered by TK-338", "created": "2016-03-09T11:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-07T11:29:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2b28d703"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4x9j:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_173028664_*|*_6_*:*_1_*:*_0"}], "description": "Jetty has a methodology that it uses to attempt to perform a 'graceful' shutdown when you call its `stop` method.  We use this when we stop Jetty, either via a normal TK shutdown, or via the HUP signal when we are attempting a restart.\n\nThis methodology involves using a timeout (`stopTimeout`) to try to give the threads enough time to finish their work, and then, if they don't finish within the timeout window, attempting a more drastic termination of these threads and then throwing a `TimeoutException`.  The default value for this timeout is 30 seconds.\n\nDuring manual scale testing, I determined that if there is sufficient load on a server (in this case, Puppet Server), and then a HUP is received but Jetty can't cleanly finish handling all of the current requests before the timeout expires, the `TimeoutException` will cause the entire application to shut down.\n\nIn my gatling testing with a heavily loaded server, this happened in the very first HUP.\n\nIMO this isn't necessarily a blocker for our initial ship of HUP support, for a couple of reasons:\n\n1. The behavior is effectively the same as what users get with a HUP today, though we would probably need to document this as a known issue\n2. It seems like the initial use cases around HUP support are for development purposes where a server would not be under heavy enough load for this to occur.\n\nHowever, it does seem like something that needs to be solved in the long run, because eventually users will want to be able to rely on HUP as a mechanism for restarting a production server, with no concerns about whether or not it will actually succeed.  If it fails when it's being used in a context like that it would be bad.\n\nPossible steps to improve / remediate, in increasing order of complexity:\n1. Lengthen the timeout from 30 seconds to some much higher value, e.g. 10 minutes?  20 minutes?  This would increase the likelihood that any requests in progress could be handled successfully before the timeout fires, and thus that the restart would work as expected.  This would be very easy to do.\n2. Catch the `TimeoutException` and swallow it.  This would also allow the restart to work as expected, but [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] pointed out that it might leave some threads behind in an indeterminate state, so it seems like we'd need to do some further testing to observe the behavior if the exception is swallowed and convince ourselves as to whether or not it was doing anything untoward.  Making the code change to swallow the exception would be easy, the follow-up testing less so.  If we thought this was low enough risk we could make this change and ship it, and do the testing and any follow-up improvements that were necessary a little later.  Even if it does leave some state behind I am starting to think that this would be a better UX than the current behavior.  It feels like we need to be able to make a UX guarantee that HUP won't bring the server down in its entirety in order for people to be able to trust it.\n3. Add some kind of more advanced error-handling/callback mechanism to TK-jetty9; if there is a timeout during a stop, it could call back any registered callbacks, which would allow other services to respond to the event.  This would be a significantly larger undertaking.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10508", "fixedVersions": [], "id": "10508", "issueType": "Improvement", "key": "TK-336", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-09T11:33:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "during HUP, tk-jetty9 will cause the app to exit if graceful shutdown doesn't occur within timeout", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm a little confused by this", "created": "2016-03-03T09:51:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] HUP works because the context map is re-created for all services. I should be more clear that I'm referring to a stop and a start -- which to my knowledge only the file sync tests are doing -- which preserves context state and triggers the bug.", "created": "2016-03-03T12:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-02T17:27:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@29a200a6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4v47:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bug in existing scope, HUP related"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_28135_*|*_10007_*:*_1_*:*_424461500_*|*_5_*:*_1_*:*_0"}], "description": "The status service cannot be stopped and started because it adds a status function to the context map in its start lifecycle function. If stopped and then started, it attempts to add again, and an exception is thrown.\n\nNote that HUP does not trigger this as during that restart the context map is reset.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10622", "fixedVersions": [], "id": "10622", "issueType": "Bug", "key": "TK-335", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Fixed", "resolutionDate": "2016-03-07T15:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-status is not idempotent", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-03-02T16:15:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6544df76"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z1b:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1011523936_*|*_1_*:*_1_*:*_583486106_*|*_10007_*:*_1_*:*_263366030_*|*_3_*:*_1_*:*_2682_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_8406827_*|*_10006_*:*_1_*:*_452754729"}], "description": "It would be helpful to add some debug logging in a few places in TK.\n\nOne is when the call to {{shutdown-agents}} is being made.  This action shuts down a thread pool that can affect other actions, so having it logged at debug would be helpful.\n\nAnother one is when the core.async worker loop pops a work item off of the queue, it'd be nice to have some indicator of what type of work it was.  This is not possible with the current implementation because we are just passing it functions to execute; perhaps we should pass maps instead, and schematize the maps so that they contain some type of description / identifier key, as well as the function.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10525", "fixedVersions": [], "id": "10525", "issueType": "Improvement", "key": "TK-334", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-29T13:34:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "improve debug logging around agent shutdown, core.async work queue", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-webserver-jetty9#master at [5502fdf|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/5502fdf754aafc580b07014353f93c444947b764].", "created": "2016-03-22T15:01:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Discussed with [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]", "created": "2016-03-29T13:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-02T16:11:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6fd571a3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z0v:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_590956120_*|*_1_*:*_1_*:*_583733221_*|*_10007_*:*_1_*:*_698424360_*|*_3_*:*_1_*:*_2471_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_9932053_*|*_10006_*:*_1_*:*_438054484"}], "description": "The current implementation of tk-jetty9 will throw an exception if 'stop' is called more than once; this is because of the logic that shuts down / cleans up the mbeans.  That cleanup call is not idempotent so it will throw an exception if we call it more than once.  We should see if there's a way to guard that with a condition that would prevent us from calling it multiple times.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10286", "fixedVersions": [], "id": "10286", "issueType": "Bug", "key": "TK-333", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-29T13:56:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-j9 should tolerate multiple 'stop' calls", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-03-02T16:07:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3bd40e20"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1235"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4uzz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_583927344_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_71387504138_*|*_10005_*:*_1_*:*_21769808389"}], "description": "It seems like if we replaced the logic that happens on the main thread, after the shutdown promise has been delivered, with the core.async logic that we have today (sans the 'go' block), that we could potentially achieve the same behavior w/o having to worry about different threads being involved.  This may not be strictly necessary after TK-330, but could still be a nice simplification that makes it harder to make mistakes in the future.", "epicLinkSummary": "Puppet Server HUP Loose Ends", "estimate": "PT0S", "externalId": "10228", "fixedVersions": [], "id": "10228", "issueType": "Improvement", "key": "TK-332", "labels": [], "originalEstimate": "PT0S", "parent": "16983", "parentSummary": "Puppet Server HUP Loose Ends", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2019-02-20T15:21:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Remove 'go' block and more core.async lifecycle logic to main thread", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [4fe8ae|https://github.com/puppetlabs/trapperkeeper/commit/4fe8ae5fe69c537796c7bf6abb0194f9ff2ba0c8].", "created": "2016-03-22T12:33:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Discussed with [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]", "created": "2016-03-29T13:53:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-02T15:52:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@21d8e214"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z2f:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_600104225_*|*_1_*:*_1_*:*_584846768_*|*_10007_*:*_1_*:*_160269537_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_9509223_*|*_10006_*:*_1_*:*_967402930"}], "description": "With our current core.async implementation for managing service lifecycles, if several 'restart' commands are queued up and then a 'shutdown' is issued, the shutdown will end up in the queue behind all of the previous items, and the worker loop will process them in order.\n\nWe need to give prioritization to the 'shutdown' message so that it supercedes any other queued work.\n\nThe two options I can imagine for implementing this are:\n* a prioritized channel, if core.async supports such a thing, or\n* two channels, one for shutdown requests and one for normal work requests, and the loop would always check the shutdown channel first.  We could potentially use some core.async {{alt}} variant to abstract over the multiple channels to make the loop logic simpler.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10226", "fixedVersions": [], "id": "10226", "issueType": "Improvement", "key": "TK-331", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-29T13:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Prioritize 'shutdown' message over any other work in core.async work queue", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper#master at [4dde9c|https://github.com/puppetlabs/trapperkeeper/commit/4dde9c5993e94601b50213c6600ec97d278d43ac].", "created": "2016-03-21T14:55:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Discussed with [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]", "created": "2016-03-29T13:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-02T15:46:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3ae65d01"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z1j:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_677979831_*|*_1_*:*_1_*:*_585130908_*|*_10007_*:*_1_*:*_520632236_*|*_3_*:*_1_*:*_73390897_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_9611955_*|*_10006_*:*_1_*:*_455759969"}], "description": "It is currently possible, in pathological situations, to trigger a situation where HUP restarts are queued up and an error occurs, causing the 'stop'/'shutdown' logic to be executed on the main thread at the same time that some init/start/stop actions may be in progress on the core.async worker.\n\nThe main shutdown logic should be changed to schedule its work through the core.async queue so that it won't be possible for the lifecycle functions to be running on multiple threads simultaneously.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10485", "fixedVersions": [], "id": "10485", "issueType": "Improvement", "key": "TK-330", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-29T13:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Move main 'shutdown'/'stop' logic to core.async worker", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "The more I think about this, the more that I think that the combination of TK-330 and TK-331 make this ticket a no-op.  [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] any opinions?\n\nIf the main shutdown logic is happening on the core.async loop thread, and if we have successfully prioritized the shutdown work over any other tasks put on the core.async work queue, then I don't need to do anything to check whether a shutdown is in progress before I begin a new restart task?", "created": "2016-03-14T17:57:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Yeah, I think that makes sense.  If after the work for TK-330 and TK-331 are done it will only be possible for the shutdown logic to execute from the core.async thread - and not the main thread - and the completion of the shutdown logic will involve also having the core.async channel be shut down so that no new tasks can be processed from the queue after the current shutdown one finishes then, yeah, it wouldn't seem like the work for this ticket would be necessary.  Very possible I'm misunderstanding where we expect to be after the work for TK-330 and TK-331 are finished, though.", "created": "2016-03-14T18:18:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I am still thinking is a no-op based on the previous changes, so, closing.  If you feel like it still needs to be open for some reason just let me know.", "created": "2016-03-21T15:48:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Sounds right to me to close this one.", "created": "2016-03-21T15:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-03-02T15:44:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4bde61a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4uy7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_585300532_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1052995050"}], "description": "In the event that a shutdown is in progress, if a HUP is triggered (or if HUP restarts are already queued up), they should not continue to try to perform their work.  Hopefully this is as simple as checking to see if the shutdown promise is realized before we take any work off of the queue.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10524", "fixedVersions": [], "id": "10524", "issueType": "Improvement", "key": "TK-329", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Fix", "resolutionDate": "2016-03-21T15:48:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "refactor restart logic to honor shutdown-in-progress", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-02-22T18:14:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1a2ac004"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4v27:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_148538332_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_62832354813"}], "description": "During my exploration into HUP memory usage in PE Puppet Server (PE-13994), I ran into an issue where, in a pathological use case, it was possible to get several HTTP client requests \"stuck\" waiting for a response forever, and their threads would deadlock.\n\nThis almost certainly indicates some bigger issue w/rt the services that were using the HTTP client in my testing setup, but we should probably validate that there is *some* default timeout for the HTTP requests when going through the {{sync}} API so that there is some hope of the threads freeing up even if the consuming code did something wrong.\n\nI need to attach a thread dump that illustrates the issue, and probably do some additional work to diagnose exactly what was going on, but wanted to go ahead and get this captured in a ticket.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10276", "fixedVersions": [], "id": "10276", "issueType": "Improvement", "key": "TK-327", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Cannot Reproduce", "resolutionDate": "2018-02-20T16:56:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ensure that the clj-http-client sync API uses a timeout when waiting for async responses", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Is this a change that can be tested from the end user's perspective by attempting to execute 5 HUPs in quick succession?  ", "created": "2016-03-29T13:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "You'll need more than 5", "created": "2016-03-29T13:46:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "QA will perform some manual testing against this PR.", "created": "2016-03-29T13:56:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Tested in puppetserver version: 2016.2.2.0.SNAPSHOT.2016.03.28T1211 like this:\n{noformat}\nfor d in {1..6}", "created": "2016-03-30T14:38:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Validated on 2016.2.2.0.SNAPSHOT.2016.03.28T1211 without file-sync.", "created": "2016-03-30T16:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-02-22T18:10:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@32c8f84a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z13:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1022271192_*|*_1_*:*_1_*:*_148753038_*|*_10007_*:*_1_*:*_256421076_*|*_3_*:*_1_*:*_10009164_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_105313412_*|*_10006_*:*_1_*:*_1644349489"}], "description": "In Trapperkeeper, we currently use a core.async channel with a maximum size of 5 to handle HUP requests that come in from signal handler threads.\n\nIf something happens to go awry in the TK service restart logic, and the core.async thread gets blocked, then subsequent HUP requests will fill up the queue to its maximum size of 5, and after that, any additional HUP requests will result in the JVM spinning up a new signal handler thread per HUP request, and all of these new threads will be blocked trying to put their request into the core.async channel.\n\nThere is obviously some other underlying problem in the individual services if they are blocking during restart, but TK should have better behavior regardless.\n\nMy current thinking is that we should use a non-blocking {{put}} operation when attempting to put the requests into the core.async channel, and if the put fails, we should just log an error message saying that the HUP request can't be handled because the system is backed up.  This will allow the signal handler threads to exit and be garbage collected, rather than piling up indefinitely.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10284", "fixedVersions": [], "id": "10284", "issueType": "Improvement", "key": "TK-326", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-03-30T16:29:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Prevent signal handler threads from backing up if the core.async queue fills up", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "PR is up here: https://github.com/puppetlabs/trapperkeeper/pull/219", "created": "2016-02-29T17:54:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I merged [~accountid:557058:104b5720-714d-4539-b455-df472251ec89]'s PR and disabled the wiki.  However, that does not actually erase the contents of the wiki, so if we need to resurrect anything, it should be as simple as re-enabling the wiki in the repo's settings.", "created": "2016-03-14T11:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-02-18T14:20:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@71cc6511"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynkef:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Had time for additional low hanging fruit while on-boarding"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "01/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_507203241_*|*_10007_*:*_1_*:*_1183928560_*|*_3_*:*_1_*:*_6559157_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_449465645"}], "description": "specifically for https://github.com/puppetlabs/trapperkeeper", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10484", "fixedVersions": [], "id": "10484", "issueType": "Task", "key": "TK-325", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2016-03-14T11:46:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Convert wiki to markdown files inside repository", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] can you elaborate on what library or what version validation is causing the issue for you?", "created": "2016-02-24T11:11:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "This came up during the course of PE-14296.", "created": "2016-03-01T13:12:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] did you actually confirm with [~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] or the PDB team that the original intent of this ticket was related to tk-status?  it doesn't actually say that anywhere in the ticket, I was just speculating...", "created": "2016-03-01T15:49:00.000000"}, {"author": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] sorry for missing the mentions. The issue was with the SemVer schema that was used in get-artifact-version before Nathaniel removed it with the last commit. With that change PDB should be good to switch back to the tk-status version once the fix is released, so this ticket is done. Thanks!", "created": "2016-03-01T16:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-02-17T11:53:00.000000", "creator": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@79c69ae7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4lbz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bug in existing functionality"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "24/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_89098645_*|*_1_*:*_1_*:*_1128007566_*|*_10007_*:*_1_*:*_12333198_*|*_3_*:*_1_*:*_75344_*|*_10009_*:*_1_*:*_6128_*|*_5_*:*_1_*:*_0"}], "description": "When testing PDB PE extensions against a snapshot build of PuppetDB, our versions look like this:\n{code}\n4.0.0-20160217_153449-g73aa72f\n{code}\n\nit would be nice if the version validation could accommodate this without throwing an error. For now we've vendored the relevant code for now and removed the semver validation.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10282", "fixedVersions": [], "id": "10282", "issueType": "Bug", "key": "TK-324", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "resolution": "Fixed", "resolutionDate": "2016-03-02T17:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "semver validation fails on PDB snapshot versions", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Another possible motivation for this would be that, for TK apps that don't use core.async, there is no reason why this thread pool ever needs more than a single thread.  We could change it to use a custom pool with just one or two threads, and that would result in a slight reduction of memory usage.  However, for any apps that are using core.async with the default thread pool, this benefit would be eliminated.", "created": "2016-02-17T17:21:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-02-17T11:04:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2a81fa1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4l3r:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1674527_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_62904187054"}], "description": "Core.async creates a thread in its thread pool every HUP, up to 2 x cores + 42. This can add a whole bunch of cruft to wade through when looking at memory analysis. We should consider using our own thread pool that would be under our control and that we could clean up on each HUP, thereby eliminating this stuff.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10523", "fixedVersions": [], "id": "10523", "issueType": "Task", "key": "TK-323", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:55:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Use our own thread pool for TK core.async", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-29T17:07:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1d5bc6f4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyo2rj:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_174009_*|*_10007_*:*_1_*:*_150920029065_*|*_5_*:*_1_*:*_0"}], "description": "{code}\nlog4j:WARN No appenders could be found for logger (org.apache.http.impl.nio.client.MainClientExec).\nlog4j:WARN Please initialize the log4j system properly.\nlog4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10483", "fixedVersions": ["TK 1.3.0"], "id": "10483", "issueType": "Bug", "key": "TK-320", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Fixed", "resolutionDate": "2020-11-10T11:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "libraries using log4j complain about logging not configured", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-27T18:33:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4088546d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3dz3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_578778499_*|*_10007_*:*_1_*:*_81205448_*|*_3_*:*_1_*:*_1641880_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_622369254"}], "description": "macro validation needs to take optional deps dep binding form without a protocol present.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10224", "fixedVersions": [], "id": "10224", "issueType": "Bug", "key": "TK-319", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Fixed", "resolutionDate": "2016-02-11T15:13:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "defservice doesn't understand new deps binding form without a protocol present", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:18109e62-1b97-4fa3-8217-9c25de3a4710] agree, I've been adding some status stuff to the status service itself lately, and this seems like it might fit well there.  Thanks for filing.", "created": "2016-01-27T17:36:00.000000"}, {"author": "6361cbfc59c794184bcbd33a", "body": "This seems really useful. But don't we expose the status service over plaintext HTTP with no auth required? We probably wouldn't want to let people just ask for, say, the db password and get it back. Maybe this should be an opt-in feature for any given service, with the ability to filter the content (may also be useful if the config has derived values)? Or maybe we can get rid of all the secrets (db passwords => certs at least, probably more?).", "created": "2016-02-01T15:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:63d4062f69c7ae3958d276ed] good call.  I think different apps may be exposing the status endpoint at different levels (e.g. maybe some do require HTTPS and/or auth), but your general point seems very important and valid.", "created": "2016-02-01T16:25:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "If it's opt-in, though, and if each service needs to implement their own callback for it or whatever, then at that point would it just make more sense to have them put the data in their own service's status callback?", "created": "2016-02-01T16:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-27T17:04:00.000000", "creator": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4d6bcabc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz45yn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Jan/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_583901842_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_64114699096"}], "description": "This is a feature request via [~accountid:557058:8527c9e8-8e3f-451c-b529-f6fe014233ed]: when trying to diagnose configuration issues, you sometimes aren't sure if your configuration changes took or not. You might have an issue in your puppet code (or someone else's) that's preventing the services from restarting (or HUPing). It would be very useful to be able to query a running service for its current config. \n\nWe could do this just for PuppetDB of course, but it seems like a pretty useful thing for an tk application. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10340", "fixedVersions": [], "id": "10340", "issueType": "New Feature", "key": "TK-318", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:54:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Expose current config in tk-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to clj-http-client#master at [70b5d6|https://github.com/puppetlabs/clj-http-client/commit/70b5d6d6ae852b2de9d35cec850cf2f11af4dbfb].", "created": "2016-05-06T12:09:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-27T11:24:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@359b2ea0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndw7:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Done with TK-316"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_268181116_*|*_1_*:*_1_*:*_567457_*|*_10007_*:*_1_*:*_3891496927_*|*_5_*:*_1_*:*_35851102006_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_4747045835"}], "description": "Add ability to pass an optional metrics-id to a clj-http-client request to be used when timing the request.\n\nThis will be an array, and each element in the array will get a timer, concatenated onto the previous timers. So for example \n\n{code}\n{:metrics-id [\"foo\" \"bar\" \"baz\"]}\n{code}\n\nwould result in a {{foo}} timer, a {{foo.bar}} timer, and a {{foo.bar.baz}} timer.\n\n\n", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10275", "fixedVersions": ["TK Puppet5.0"], "id": "10275", "issueType": "Task", "key": "TK-317", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-05-09T14:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add ability to pass a metrics-id to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to clj-http-client#master at [70b5d6|https://github.com/puppetlabs/clj-http-client/commit/70b5d6d6ae852b2de9d35cec850cf2f11af4dbfb].", "created": "2016-05-06T12:09:00.000000"}, {"author": "557058:3da95088-202d-4082-a15a-eb2e812f2578", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] please provide release notes for this issue, if applicable.", "created": "2017-05-15T12:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-27T11:15:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7f73155a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1739"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndvz:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Not Needed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/May/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_268179093_*|*_1_*:*_1_*:*_1092325_*|*_10007_*:*_2_*:*_5358652924_*|*_3_*:*_2_*:*_2234686035_*|*_5_*:*_1_*:*_35851108504_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_1045206613"}], "description": "Add support for metrics in clj-http-client that time requests.\n\nAdd a function to get http client timers out of a client instance, and a function to get a map of metrics information that can be added to a status endpoint.\n\nTK-317 will add the ability to pass in a {{metrics-id}} request option. However, if this is not passed as a request option but the client was created with a metric registry, then by default the request will still be timed, with a {{<url>}} timer and a {{<url>.<http verb>}} timer.\n\nTo start, we will have one type of timer per-request, that is stopped when the bytes for the response have all been read. In the future, we will add a timer that is stopped when the response has been initialized/the first byte of data has been received.\n\nThus, a GET request to http://localhost/foo would have a timer that looked something like {{puppetlabs.http-client.experimental.with-url.http://localhost/foo.bytes-read}} and {{puppetlabs.http-client.experimental.with-url.http://localhost/foo.GET.bytes-read}}.\n\nThe functions that return the timers and the metrics information should be able to optionally take a URL or a URL+verb.", "epicLinkSummary": "Http Client Metrics in Puppet Server", "estimate": "PT0S", "externalId": "10222", "fixedVersions": ["TK Puppet5.0"], "id": "10222", "issueType": "New Feature", "key": "TK-316", "labels": [], "originalEstimate": "PT0S", "parent": "17005", "parentSummary": "Http Client Metrics in Puppet Server", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-05-09T14:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for metrics to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Former user thanks for the heads up, we'll look into getting this fixed ASAP.", "created": "2016-01-26T10:56:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-25T15:13:00.000000", "creator": "qm:f7b4bc64-445a-440e-8354-a55854c39cee:5a8bdc81-30a7-4fca-b54d-953b41ab2d9d", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@78bda737"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz43of:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Community discovery of TK bug"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jan/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_75740848_*|*_1_*:*_1_*:*_159058464_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1135088231"}], "description": "The dependency is out of date in both TrapperKeeper and the kitchensink project and since there was a rather breaking API change between 1.4.5 and 1.4.6 this makes both puppetlabs projects pretty incompatible with projects/dependencies using 1.4.6 (of which most are that I've found in the wild).\n\nI'm currently maintaining a [fork|https://clojars.org/org.clojars.tdavis/kitchensink] but there's not much to it: bump to 1.4.6 and change instances of {{absolute-path}} to {{absolute}}.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10620", "fixedVersions": ["TK 1.3.0"], "id": "10620", "issueType": "Improvement", "key": "TK-315", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "qm:f7b4bc64-445a-440e-8354-a55854c39cee:5a8bdc81-30a7-4fca-b54d-953b41ab2d9d", "resolution": "Fixed", "resolutionDate": "2016-02-10T11:45:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update me.raynes/fs dependency", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Moved this ticket over to TK because that's where we ended up implementing it.", "created": "2016-02-03T17:18:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "linked in a PR that brings this change into pe-puppetserver.", "created": "2016-02-03T17:59:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This should be available in 2016.1.0-rc2-246-g67876da", "created": "2016-02-05T09:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-20T07:30:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6602240a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynpnj:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "New Feature"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "There are new metrics in the /status endpoint, at debug level, under the service called \"status-service\".  These include some new data about heap and non-heap memory usage."}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Small improvement brought in to help CS, Server team"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_837296094_*|*_1_*:*_1_*:*_13338665_*|*_10007_*:*_1_*:*_158436224_*|*_3_*:*_1_*:*_11372_*|*_5_*:*_2_*:*_16528_*|*_10011_*:*_2_*:*_12034_*|*_10006_*:*_1_*:*_380464063"}], "description": "It would be extremely useful to add Heap usage metrics to Puppet Server (used / max / perhaps others?)\n\nPoking around in the JMX MBeans via JVisualVM, I found {{java.lang.Memory.HeapMemoryUsage.used}}, etc., which seem like they would do the trick.", "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10280", "fixedVersions": [], "id": "10280", "issueType": "Improvement", "key": "TK-321", "labels": [], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-02-05T09:30:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add heap usage metrics to tk-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "If we ever decide to do anything about this, we should probably also consider the case where a failure occurs during the {{init}} or {{start}} phases of a service.  In those cases, {{stop}} will be called on every service, even services who were downstream of the service that failed, meaning that their {{init}} and {{start}} were never called.\n\nThat behavior means that {{stop}} functions already need to be implemented such that they are tolerant to being called when the service is not in a fully operational state... which probably overlaps with the vast majority of cases where a double-stop might be problematic.  So I'm not sure that there's a ton of value in solving one of those problems without solving both.", "created": "2016-01-07T13:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-07T13:16:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@200aa189"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3z4f:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Jan/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_512849956_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_65927185441"}], "description": "In TK-202, a restart function was added to support HUP signals. This restart stops all services in reverse order before reinitializing them. If any of the stop calls raises an exception, it will deliver the shutdown promise, which will then call stop again on all services in reverse order.\nThe double stop means that services need to write stop functions that are tolerant of stopping more than once or stopping from non initialized state. The restart lifecycle should probably be refactored to avoid double stopping if at all possible.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10617", "fixedVersions": [], "id": "10617", "issueType": "Improvement", "key": "TK-314", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:50:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Avoid double stops during restart lifecycle", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think the TK optional deps feature is a big enough deal that we should send an announcement to the Clojure list as well  as the internal dev list.\n\nI think we have to update the docs before we can send out that announcement.\n\nFor that reason, assuming this isn't more than an hour or two of work, I'd be in favor of [~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] just pulling this into the sprint and knocking it out as soon as we actually merge the PR.\n\n[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] does that sound like a reasonable time estimate?\n\n[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] if so, any objections to sneaking this into the sprint?", "created": "2016-01-07T11:13:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": ":)  No objections, in fact I just wrote https://github.com/puppetlabs/trapperkeeper/pull/199#issuecomment-169771023 before seeing this.", "created": "2016-01-07T11:55:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "a few minor suggestions for copy edits:\n\n1. {{When defining a service, you have the ability to mark certain other services your service depends on as being optional.}}\n->\ns/you have the ability to/it is possible to/\n\n2. {{Warning Because of a bug in prismatic schema, you can't use the special [:SonnetService get-sonnet] syntax when declaring optional dependencies.}}\n->\nIf this is actually a bug in prismatic schema, can we link to the github issue?\n\n3. {{The Service protocol now has two helpers to make it easier to work with optional dependencies:}}\n->\ns/now //\n\n(I don't think the temporal reference is necessary since in future releases this new stuff will be old :)  We can put something more temporal like this in the changelog.)\n\n4. Maybe add something just underneath the {{Optional Services}} header that says \"Introduced in Trapperkeeper 1.2.0\"?\n\nLooks great other than those suggestions, though.  Thanks!", "created": "2016-01-07T18:29:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Updated with all of these", "created": "2016-01-08T16:11:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-07T11:09:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6ed1432a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3szr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Minor docs work identified after start of sprint to support TK release"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Jan/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_25818997_*|*_10007_*:*_1_*:*_428097255_*|*_3_*:*_1_*:*_78740137_*|*_5_*:*_1_*:*_0"}], "description": "As discussed yesterday, this is just a matter of updating the github wiki.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10369", "fixedVersions": [], "id": "10369", "issueType": "Task", "key": "TK-313", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-01-13T15:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "docs for new TK optional dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-07T08:21:00.000000", "creator": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@dade251"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3swn:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2537901897_*|*_1_*:*_1_*:*_19779_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_1103559242"}], "description": "Support for :as :unbuffered-stream was introduced into the Clojure API of clj-http-client. The equivalent Java implementation doesn't exist but should.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10559", "fixedVersions": [], "id": "10559", "issueType": "Improvement", "key": "TK-312", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "resolution": "Fixed", "resolutionDate": "2016-02-18T11:53:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support the clj-http-client \"unbuffered stream\" option in Java", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-05T12:08:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ba5465d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3rb3:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Proximity - quick fix for bug I just introduced into TK with the logging work"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "PuppetDB"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_7807_*|*_10007_*:*_1_*:*_113158752_*|*_3_*:*_1_*:*_76799906_*|*_5_*:*_1_*:*_0"}], "description": "The Appender reify was missing the isStarted LifeCycle method - add it.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10368", "fixedVersions": [], "id": "10368", "issueType": "Bug", "key": "TK-311", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Fixed", "resolutionDate": "2016-01-07T16:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add missing isStarted method to log-event-listener", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-04T18:25:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@52fa90f1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3r3j:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_752399845_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_65925783878"}], "description": "A function should be added to the service protocol that gives a reified TK service access to the TK App atom. This gives it access to the service graph, which opens up new TK feature opportunities.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10522", "fixedVersions": [], "id": "10522", "issueType": "Improvement", "key": "TK-310", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:08:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Give access to app reference to reified services", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2016-01-04T18:23:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d32999a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyn4fj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_245938153_*|*_1_*:*_1_*:*_752468745_*|*_10007_*:*_1_*:*_527691499_*|*_3_*:*_1_*:*_596890046_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_13913598071"}], "description": "Currently, TK has a series of functions with heavy pre and post conditions that validate the input to defservice. It'd be better to collapse them into a single function that uses input and output schemas.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10415", "fixedVersions": ["TK 1.4.2"], "id": "10415", "issueType": "Improvement", "key": "TK-309", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Fixed", "resolutionDate": "2016-07-08T10:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Schemafy TK service macro validation", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Update: Looks like the Apache team has found the root cause for this and has identified a fix that could be applied to the Apache HttpCore library.  See the linked JIRA ticket, [HTTPCORE-416|https://issues.apache.org/jira/browse/HTTPCORE-416] for more details.\n\nWe would probably need to have an Apache HttpCore release done and then an Apache AsyncHttpClient release updated to depend upon the new HttpCore.  Based on past experiences, could be a bit of work to update our various service stack dependencies to these new releases, whenever they may land.", "created": "2016-01-08T11:10:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], the fix for this has been shipped in HTTPCore 4.4.5 and HTTPAsyncClient 4.1.2 has been updated to the new HTTPCore dependency.  Ok with you if we bump the HTTPAsyncClient dependency in clj-http-client sometime soon to pick this up?", "created": "2016-07-30T09:29:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yessir, if you want to put this as 'open' so it'll come up in triage i'd be good with that.", "created": "2016-08-01T11:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to clj-http-client#master at [fd2886b|https://github.com/puppetlabs/clj-http-client/commit/fd2886b5f794d48b4f55be9afd9f7dd24411200c].", "created": "2016-09-27T09:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2016-01-04T09:53:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@283772b1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hymvgf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "01/Aug/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_5944662_*|*_1_*:*_2_*:*_842062292_*|*_10007_*:*_1_*:*_54321062_*|*_3_*:*_1_*:*_3230331_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_17183226546_*|*_10006_*:*_2_*:*_4980316482"}], "description": "If a request is made on a clj-http-client instance while the process has exhausted the number of open file descriptors that it is allowed to allocate, that request will hang indefinitely - even after the number of open file descriptors drops back below the maximum allowed.  I observed this problem when doing Puppet Server heavy load testing.  In that case, the problem resulted in Puppet Server being unable to make any future HTTP requests to Puppet DB, even after the number of open descriptors had dropped.  The only known way to recover to the state where HTTP requests can be made again is to restart the Java process.\n\nI believe the root of this issue lies in how the Apache HttpAsyncClient library handles the inability to make a request when file descriptors are exhausted.  It would be reasonable for an individual HTTP client request to fail in this case but it should be possible for subsequent requests to be made and succeed, if file descriptors become available, even without having to restart the process.\n\nI submitted a JIRA ticket to the Apache project about this problem - https://issues.apache.org/jira/browse/HTTPASYNC-99.  I'll follow-up on that and comment further on this ticket as the conversation on that ticket progresses.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10506", "fixedVersions": [], "id": "10506", "issueType": "Bug", "key": "TK-308", "labels": ["maintenance"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-09-27T10:58:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client requests hang after too many open files condition occurs", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "The implementation for this is here:\n\nhttps://github.com/puppetlabs/lein-release-4digit-version\n\nWaiting for RE approval here:\n\nhttps://puppet.atlassian.net/browse/RE-6199\n\nThen need to do a clojars release, then close this ticket out.", "created": "2015-12-24T16:43:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Should also update this lein github issue:\n\nhttps://github.com/technomancy/leiningen/issues/2049\n\nand add the plugin to the lein plugins wiki page, after it's published to clojars.\n\nAnd add the clojars badge to the readme.", "created": "2015-12-24T16:46:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This has been released to clojars", "created": "2016-01-09T17:33:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "also need to ping wayne about getting this added to the 'clojure-libraries' view on jenkins", "created": "2016-01-09T17:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-24T16:40:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@be0e118"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvlr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1384961527_*|*_1_*:*_1_*:*_77657_*|*_10009_*:*_2_*:*_247542234_*|*_5_*:*_1_*:*_0"}], "description": "Our current CI jobs that use `lein release` are not able to support build numbers that have 4 digits, e.g. 2016.1.0.50.\n\nIt might be really useful to be able to version some artifacts this way, so we should write a lein plugin that extends those tasks to support 4-digit versions.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10408", "fixedVersions": [], "id": "10408", "issueType": "New Feature", "key": "TK-307", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-01-12T14:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Lein plugin to support 4-digit versions in release/change tasks", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-12-22T13:48:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@14e3758e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3o4v:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1288742285_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_162174366632"}], "description": "This is related to TK-305; in comidi we have a way to auto-generate metrics for HTTP routes based on a comidi/bidi route tree.  However, if the route definition has any pattern matching or regular expressions in it, the auto-generated ID for the route (which shows up prominently in any view of the metrics) may not be very human-readable.\n\nIt would be nice to support an optional {{route-id}} field in the route metadata and, if present, prefer that in the places where we surface the metrics data to the user.", "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10204", "fixedVersions": [], "id": "10204", "issueType": "Improvement", "key": "TK-306", "labels": [], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2021-02-25T12:13:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add support for optional metadata  'route-id' in comidi route definitions", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This would be nice, but not a priority right now.", "created": "2018-02-13T17:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-22T13:45:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d84d0c1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynisv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1288827207_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_66461650325"}], "description": "We should support optional metadata in the comidi route definitions; something akin to what is done in {{compojure-api}}.  We should be able to use this to integrate with swagger and auto-generate HTTP API docs.  Presumably there should even be a way to integrate with prismatic schema definitions to document wire formats.\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10221", "fixedVersions": [], "id": "10221", "issueType": "Improvement", "key": "TK-305", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2018-02-13T17:20:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add optional swagger integration in comidi route definitions", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I'm intending to manually look at this once when this ticket reaches \"testing.\"  Please comment if you think that isn't an appropriate approach.", "created": "2016-02-03T11:34:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] that sounds good to me.", "created": "2016-02-03T13:12:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Moved this ticket over to TK because that's where it ended up getting implemented.", "created": "2016-02-03T17:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Linked in a PR that will leverage this in pe-puppetserver.", "created": "2016-02-03T17:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This should be available in 2016.1.0-rc2-246-g67876da", "created": "2016-02-05T09:29:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "I don't think I have the right bits. I don't see anything that speaks to uptime.\n{code}\n# puppetserver --version\npuppetserver version: 2016.1.1011.SNAPSHOT.2016.02.18T1315\n# curl -k -s -S --cert $cert --key $key https://$(hostname -f):8140/status/v1/services/pe-jruby-metrics?level=debug | json_pp\n{\n   \"status\" : {\n      \"experimental\" : {\n         \"jruby-pool-lock-status\" : {\n            \"current-state\" : \":not-in-use\",\n            \"last-change-time\" : \"2016-02-19T20:56:29.655Z\"\n         },\n         \"metrics\" : {\n            \"requested-instances\" : [],\n            \"average-wait-time\" : 0,\n            \"average-lock-wait-time\" : 0,\n            \"requested-count\" : 23,\n            \"borrow-count\" : 23,\n            \"borrow-retry-count\" : 0,\n            \"average-borrow-time\" : 1392,\n            \"borrowed-instances\" : [],\n            \"return-count\" : 23,\n            \"borrow-timeout-count\" : 0,\n            \"average-free-jrubies\" : 0.999999989559076,\n            \"average-requested-jrubies\" : 1.47525179909564e-16,\n            \"num-pool-locks\" : 4,\n            \"num-jrubies\" : 1,\n            \"average-lock-held-time\" : 1548,\n            \"num-free-jrubies\" : 1\n         }\n      }\n   },\n   \"service_status_version\" : 1,\n   \"state\" : \"running\",\n   \"detail_level\" : \"debug\",\n   \"service_version\" : \"2016.1.1007\",\n   \"service_name\" : \"pe-jruby-metrics\"\n}\n{code}", "created": "2016-02-19T14:38:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Yes, I was doing it wrong:\n{code}\n# curl -k -s -S --cert $cert --key $key https://$(hostname -f):8140/status/v1/services?level=debug | json_pp  | less\n...\n   \"status-service\" : {\n      \"status\" : {\n         \"experimental\" : {\n            \"jvm-metrics\" : {\n               \"up-time-ms\" : 3064154,\n               \"heap-memory\" : {\n                  \"committed\" : 2066743296,\n                  \"init\" : 2147483648,\n                  \"used\" : 384177480,\n                  \"max\" : 2066743296\n               },\n               \"start-time-ms\" : 1455915064158,\n               \"non-heap-memory\" : {\n                  \"committed\" : 309706752,\n                  \"used\" : 214481904,\n                  \"init\" : 2555904,\n                  \"max\" : -1\n               }\n            }\n         }\n      },\n      \"service_version\" : \"0.3.1\",\n      \"service_status_version\" : 1,\n      \"state\" : \"running\",\n      \"detail_level\" : \"debug\"\n   },\n...\n{code}", "created": "2016-02-19T14:44:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Resolved per last comment.", "created": "2016-02-19T14:44:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-22T11:39:00.000000", "creator": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@a80f5d4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4bgv:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "New Feature"}, {"fieldName": "Release Notes Summary", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "There are new metrics available in the status endpoint, at debug level, under the service named \"status-service\".  These metrics include the process uptime."}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Small improvement brought in to benefit CS"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_837264303_*|*_1_*:*_1_*:*_1899620622_*|*_10007_*:*_1_*:*_158435411_*|*_3_*:*_1_*:*_348366_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_1228538000_*|*_10006_*:*_1_*:*_984530765"}], "description": "As of PE 2015.3.0, all TrapperKeeper servers expose a {{/metrics}} endpoint that provides useful information about the server process. We should add process uptime to the set of basic metrics shared by all services.\n\nA scenario where this is useful is comparing {{/metrics}} output from a pool of load-balanced compile masters. There may be significant differences in the output reported by each master that could be explained by some masters having an uptime of weeks while others were just restarted. Currently, the only way to determine differences in uptime is to pull the logs for each master in addition to the metrics and scan for startup messages and then correlate these timestamps with the metrics output.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10503", "fixedVersions": [], "id": "10503", "issueType": "Improvement", "key": "TK-322", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "resolution": "Fixed", "resolutionDate": "2016-02-19T14:44:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Metrics endpoints for TrapperKeeper services should include process uptime", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-12-22T08:25:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@b36f69a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvmn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1217991295_*|*_1_*:*_1_*:*_20184411_*|*_5_*:*_1_*:*_0"}], "description": "In order to be compatible with [pe-aio|https://github.com/puppetlabs/pe-aio], comidi needs to be updated to depend on more recent versions of clojure, bidi, and compojure.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10482", "fixedVersions": [], "id": "10482", "issueType": "Task", "key": "TK-304", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-01-05T16:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update comidi to latest versions of clojure, compojure, and bidi", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to clj-http-client master branch at [069104|https://github.com/puppetlabs/clj-http-client/commit/06910455a51e1ff40af08b7a230a92ef4fc77186].", "created": "2016-01-07T11:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "released 0.4.6", "created": "2016-01-09T18:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-22T08:19:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1807afb7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvmf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Jan/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_196665873_*|*_1_*:*_1_*:*_20493064_*|*_10007_*:*_1_*:*_1373316704_*|*_10009_*:*_1_*:*_245076874_*|*_5_*:*_1_*:*_0"}], "description": "In order to be compatible with pe-aio, the clj-http-client needs to be updated to use a newer version of the upstream Apache library.  This is because PuppetDB has a different dependency on some of the upstream Apache libraries, and the current clj-http-client code is not compatible with the latest Apache version.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10405", "fixedVersions": [], "id": "10405", "issueType": "Task", "key": "TK-303", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-01-12T14:12:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update clj-http-client to use latest version of upstream Apache library", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "What existing services have you seen this pattern in?", "created": "2015-12-15T20:14:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "An idea that [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] had the other day, which is kind of related and I think I like better than this, would be to add the ability to register callback notifications for lifecycle events.  So maybe there's some new built-in service that you can add a dependency on, and it provides a `register-lifecycle-callback` function, and if you register a callback fn then it will get called whenever any lifecycle event happens.", "created": "2015-12-16T14:26:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "FileSyncWebService and FileSyncClientService both use this pattern, and I've seen it elsewhere in the past, although I do not remember in which service(s) at this point in time.\n\nre: [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]'s idea - what does that add over the existing lifecycle functions?", "created": "2015-12-30T16:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-15T19:43:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@730c005b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xpr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Dec/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1871283349_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_66531911241"}], "description": "It's become common to write code like this:\n{code}\n(defservice my-service\n  ...\n  (start [this context]\n    ...\n    (assoc context :started? true)))\n\n  (my-service-function [this]\n    (let [context (service-context this)]\n      (when (:started? context)\n        ...\n{code}\n\nTrapperkeeper should provide an API to make this easier so individual services can stop reinventing this pattern.  At the least, it should provide a way to ask if a given service has completed one of the lifecycle functions (init, start, stop).\n\nImplementation ideas:\n\nIdea #1:  Add a function to Trapperkeeper which takes a service reference and a keyword representing the lifecycle function, e.g. {{tk/completed-lifecycle-phase? my-service :start}}.\n\nIdea #2:  Make Trapperkeeper stick some data into the service context which represents this - i.e. the service context would now include something like\n{code}\n{:lifecycle {:init? true \n             :started? false}}\n{code}\n... alongside whatever other data the service puts there.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10402", "fixedVersions": [], "id": "10402", "issueType": "New Feature", "key": "TK-302", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:36:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add API to query service lifecycle state", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-webserver-jetty9#master at [890b91|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/890b91da5ece6436273e51701fd05c08d7eb9043].", "created": "2016-02-19T10:54:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-15T18:17:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@735ce572"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyotj3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_436431142_*|*_1_*:*_2_*:*_486284694_*|*_10007_*:*_1_*:*_257250367_*|*_3_*:*_2_*:*_440417147_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_98649_*|*_10006_*:*_2_*:*_4491897710"}], "description": "During work on TK-202, we saw some things that made it look like it is possible that tk-j9 is not properly cleaning up things like JMX/MBean containers during the {{stop}}/{{start}} cycle.  We need to profile it a bit and fix any leaks we find.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10367", "fixedVersions": ["TK 1.3.0"], "id": "10367", "issueType": "Bug", "key": "TK-301", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-02-24T12:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "validate that tk-j9 cleans up properly in `stop`", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Note: I had an initial implementation of this that was using clojure agents, and the TK tests passed fine, but it didn't work properly with Puppet Server.  The reason is that clojure agents have a limitation that if you have called {{send}}, and are in the process of executing a function on an agent, and then the function that you are executing calls another {{send}}, the second {{send}} will not actually be scheduled until the first {{send}}'s function has completed.  This is true even if the two sends are using different agents.\n\nThis caused a problem because Puppet Server uses agents to initialize the JRuby pool.  These agent fns were never being called because the TK agent wasn't finished, and the TK agent was blocked and couldn't finish until the JRuby pool came online... so there was a deadlock.\n\nI ended up switching the implementation over to use core.async in the end.  This is probably cleaner anyway", "created": "2016-02-06T09:55:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to master at [66fde0|https://github.com/puppetlabs/trapperkeeper/commit/66fde08218f1eda9b3852f5a42758fc75980a877].", "created": "2016-02-08T18:04:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "available in 2016.1.0-rc2-280-g068fcc3 ", "created": "2016-02-10T16:08:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-15T18:15:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@41226483"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz4bgf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "HUP work moved into current sprint"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_142738287_*|*_1_*:*_1_*:*_61132991_*|*_10007_*:*_2_*:*_214742306_*|*_3_*:*_2_*:*_155049858_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_18536151_*|*_10006_*:*_1_*:*_4320466966"}], "description": "As a result of TK-202, we noticed some weirdness with the way that threads are being managed in TK.\n\nIn particular, the HUP signal triggers some code on what appears to be a special signal handling thread, which does not seem to be a good place to perform expensive, long-running operations.  [~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] ran into a weird issue where if he ran a certain `jmap` command while that thread was doing TK things, the process would exit.\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] also pointed out that with the current implementation, if we get a HUP while the original app startup is still in progress, we will probably have two threads trying to start and stop things at the same time.\n\nIt seems like it would be better to move all of the lifecycle stuff to an agent, and then share that agent between the HUP and main startup code paths.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10274", "fixedVersions": ["TK 1.3.0"], "id": "10274", "issueType": "Improvement", "key": "TK-300", "labels": [], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-02-10T14:53:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "ensure service lifecycle functions are not called from multiple threads simultaneously", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-12-15T13:01:00.000000", "creator": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@169319fa"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvkv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Hack Week!"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_4532462_*|*_1_*:*_1_*:*_79337991_*|*_10007_*:*_1_*:*_2074239879_*|*_3_*:*_1_*:*_169363898_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_14578215"}], "description": "Update TK to allow for the optional inclusion of certain dependencies.\n\nDesign:\n\nhttps://gist.github.com/nathanielksmith/1257e9e762a257020b48", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10220", "fixedVersions": [], "id": "10220", "issueType": "New Feature", "key": "TK-299", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "resolution": "Done", "resolutionDate": "2016-01-11T15:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HACK: Support optional dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "There also aren't any docs anywhere on how this endpoint and the other endpoints and the proxy endpoint/service work, and it would be nice to really helpful to have those.", "created": "2016-04-18T12:51:00.000000"}, {"author": "557058:836ef76e-8051-48a3-8dc7-005f79695b0e", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] What docs on docs.puppet.com are you referring to? The PE docs at https://docs.puppet.com/pe/latest/status_api.html#get-statusv1simple ?", "created": "2016-04-20T15:40:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:836ef76e-8051-48a3-8dc7-005f79695b0e] Yep, although I think when I wrote this comment I was looking at https://docs.puppet.com/pe/2015.3/status_api.html#plaintext-endpoints which is slightly different than https://docs.puppet.com/pe/2016.1/status_api.html#plaintext-endpoints (or at least the organization of the page is).", "created": "2016-04-20T15:45:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] In adding docs to query-api.md, do you think it needs much rewording from what is already on the public docs site? I find myself mostly just copying that stuff over and I'm not sure if there's additional developer context I should add...", "created": "2016-04-22T12:21:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] I would like to know when it is actually active - is it a separate service that needs to be activated, or does it just get turned on automagically in some situations (I don't know that we have an docs on this for the normal query endpoints or the proxy service either...).\n\nThe other thing I think is not mentioned is that I think that the simple endpoint now can also return whether a service is stopping or starting? https://github.com/puppetlabs/trapperkeeper-status/commit/b1fe43be63ccdfb95ecd341e901c4b5ea45f5f7c#diff-9e72625b30a4923be22435975f19dca0R297", "created": "2016-04-22T12:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-11T02:54:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3fd22fde"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz5otz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Apr/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_2446222156_*|*_10007_*:*_1_*:*_352605623_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_438263409_*|*_10005_*:*_1_*:*_8898934881"}], "description": "Currently, documentation for the /simple endpoint for Puppet users exists on docs.puppetlabs.com. However, there is no developer-focused documentation for this endpoint. It would be good to add some developer docs to the github repo (https://github.com/puppetlabs/trapperkeeper-status/blob/master/documentation/query-api.md probably), where all the other dev docs already are.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10628", "fixedVersions": [], "id": "10628", "issueType": "Task", "key": "TK-298", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-04-29T15:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add docs for tk-status /simple endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-12-10T13:47:00.000000", "creator": "557058:093475a3-6bc8-4a70-8034-ae5a2ea66512", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@49dff0f2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3ilb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_402641329_*|*_5_*:*_1_*:*_0"}], "description": "The {{puppetlabs.comidi/wrap-routes}} corrupts some legal bidi route trees, an example follows.\n\nA bidi route tree defined like this:\n{code}\n[\"/api\"\n [[(bidi.bidi/alts \"/foo\" \"/bar\")\n   identity]]]\n{code}\nwhich expands to this:\n{code}\n[\"/api\"\n [[#bidi.bidi.Alternates{:alts (\"/foo\" \"/bar\")}\n   #<core$identity clojure.core$identity@70267802>]]]\n{code}\n(Note the {{bidi.bidi.Alternates}} object used as the pattern of the lone leaf route in the tree.)\nwhen passed to {{puppetlabs.comidi/wrap-routes}} like this:\n{code}\n(->\n  [\"/api\"\n   [[(bidi.bidi/alts \"/foo\" \"/bar\")\n     identity]]]\n  (puppetlabs.comidi/wrap-routes #(fn [request] (% request))))\n{code}\nis corrupted as follows:\n{code}\n[\"/api\"\n [[{:alts #<main$eval12757$fn__12758$fn__12759 puppetlabs.trapperkeeper.main$eval12757$fn__12758$fn__12759@1826f6d6>}\n   #<main$eval12757$fn__12758$fn__12759 puppetlabs.trapperkeeper.main$eval12757$fn__12758$fn__12759@798ed58e>]]]\n{code}\n(Note that {{bidi.bidi.Alternates}} object was replaced with a simple map and on top of that values in the map were replaced with the middleware wrapper functions.)\n\nThis happens because the {{puppetlabs.comidi/wrap-routes}} walks through both the {{Pattern}} and the {{Matched}} elements of the [RoutePair data structures|https://github.com/juxt/bidi/blob/1.23.1/src/bidi/schema.cljc#L38] while it should only walk through the {{Matched}} elements and leave the {{Pattern}} elements unmodified.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10203", "fixedVersions": [], "id": "10203", "issueType": "Bug", "key": "TK-297", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:093475a3-6bc8-4a70-8034-ae5a2ea66512", "resolution": "Fixed", "resolutionDate": "2015-12-15T05:38:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "puppetlabs.comidi/wrap-routes corrupts some legal bidi route trees", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I have some code that is basically stolen from JVisualVM that seems to work well for the CPU/GC CPU metrics.  It's here:\n\nhttps://github.com/cprice404/trapperkeeper-status/tree/feature/master/PE-13346-add-gc-metrics\n\nIn order to get it into a mergeable state, we will need to tie it into the TK service context so that we keep track of the values from the previous call, since those are necessary as inputs to subsequent calls.\n\nWe may also want to think about actually adding some DropWizard metrics for these (gauges?), and scheduling a sampler thread in the background that updates these metrics at some configurable interval. \n\nAnd, these metrics should probably be able to be disabled via config just in case there is any performance overhead to tracking them (though in my initial perf testing there did not seem to be any significant overhead).  I'm thinking maybe this would be a new setting in the {{metrics}} section called \"cpu-gc-sampling-enabled\" and \"cpu-gc-sampling-interval\" or something.\n\nAnother thing that would be incredibly useful would be to allow a setting like \"status-debug-log-interval\" which, if set, would cause us to dump all of the status JSON to a new log file at a specified interval.  e.g., every 30 minutes, just grab all of the status data and append a single JSON map to this new log file.  This would give support et al a much better way to observe the changes to the system over time.  It might be best to create a separate ticket to track this idea, though.", "created": "2016-02-01T13:53:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Linked TK-400 since that covers the \"status-debug-log-interval\" mentioned in the comment above.", "created": "2016-10-13T18:02:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091], just to keep my memory straight on this, we need to do the following things to close this out, right?\n\n1) Bump pe-puppetserver to the latest trapperkeeper-status version, 0.7.0, for 2017.1.x?  I think this PR, which I just merged, does this: https://github.com/puppetlabs/pe-puppetserver/pull/164.\n\n2) Release pe-puppet-server-extensions and pe-puppetserver and promote to PE 2017.1.x.\n\nPresumably this will knockout this ticket and PE-13539 together, too, right?  /CC [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] since I think he's handling PE-13539.", "created": "2017-01-04T18:57:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "OSS work was merged to trapperkeeper-status#master at [c68669|https://github.com/puppetlabs/trapperkeeper-status/commit/c68669b0e1f3e565bc9d8b99abe735e1a93a0793] and released in trapperkeeper-status 0.7.0.  Marking this resolved...", "created": "2017-01-09T17:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-12-10T11:25:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@58ca4eb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hzaq0n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_519364193_*|*_1_*:*_1_*:*_517343281_*|*_10007_*:*_1_*:*_1655974016_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_31542134425"}], "description": "The GC data that is shown in JVisualVM is very useful for understanding the health of a running system.  If we were able to determine how JVisualVM is getting that information out of JMX, and add that to our existing metrics objects in pe-puppetserver, it'd be extremely valuable.\n\nIt might even be possible to implement this in tk-metrics itself, so that we'd have it available for all TK apps.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10366", "fixedVersions": [], "id": "10366", "issueType": "Task", "key": "TK-414", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2017-01-09T17:05:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add GC metrics to trapperkeeper-status", "timeSpent": "PT0S", "updated": "2022-02-03T06:58:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:25:00.000000"}], "components": ["TrapperKeeper", "TrapperKeeper / UI"], "created": "2015-12-02T04:19:00.000000", "creator": "qm:f7b4bc64-445a-440e-8354-a55854c39cee:72907b17-1c9a-404d-bb59-d557cad56165", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3fa71f5c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xpj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Mar/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1235288138_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_196469853890"}], "description": "Right now, to include CIDER middleware in the inbuilt nREPL service, we have to include all these in the middlewares section:\n\n[cider.nrepl.middleware.apropos/wrap-apropos\n cider.nrepl.middleware.classpath/wrap-classpath\n cider.nrepl.middleware.complete/wrap-complete\n cider.nrepl.middleware.debug/wrap-debug\n cider.nrepl.middleware.format/wrap-format\n cider.nrepl.middleware.info/wrap-info\n cider.nrepl.middleware.inspect/wrap-inspect\n cider.nrepl.middleware.macroexpand/wrap-macroexpand\n cider.nrepl.middleware.ns/wrap-ns\n cider.nrepl.middleware.out/wrap-out\n cider.nrepl.middleware.pprint/wrap-pprint\n cider.nrepl.middleware.refresh/wrap-refresh\n cider.nrepl.middleware.resource/wrap-resource\n cider.nrepl.middleware.stacktrace/wrap-stacktrace\n cider.nrepl.middleware.test/wrap-test\n cider.nrepl.middleware.trace/wrap-trace\n cider.nrepl.middleware.track-state/wrap-tracker\n cider.nrepl.middleware.undef/wrap-undef]\n\nI'm not sure what it'd take, but it'd be great if instead we could simply include the {{cider-nrepl-handler}} handler:\n\n[https://github.com/clojure-emacs/cider-nrepl#via-embedding-nrepl-in-your-app]\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10202", "fixedVersions": [], "id": "10202", "issueType": "Improvement", "key": "TK-296", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "qm:f7b4bc64-445a-440e-8354-a55854c39cee:72907b17-1c9a-404d-bb59-d557cad56165", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:25:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Including CIDER middleware", "timeSpent": "PT0S", "updated": "2022-03-08T10:25:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4", "attachments": [], "comments": [{"author": "557058:2d86d754-2fbb-4e17-8e03-6e58f4f29aa4", "body": "While tackling this ticket, we discovered that there already existed support for cookies. The work done for this ticket was thus solely adding tests to make sure that the cookies were properly being set and remained on disk using the Java and Clojure APIs. ", "created": "2016-07-19T10:18:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-11-25T08:40:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Acceptance Criteria", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "N/a, not code"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@365a1984"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xov:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Jul/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_155789655_*|*_1_*:*_1_*:*_3638326795_*|*_10007_*:*_1_*:*_80103414_*|*_3_*:*_1_*:*_349999886_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_16430814780"}], "description": "Currently many of our tests use a cookie store when making requests, to test authenticated requests. We have test helpers that do something like\n\n{code}\n(defmacro as-user [username pw & body]\n    `(binding [clj-http.core/*cookie-store* (clj-http.cookies/cookie-store)]\n              (post-logout!)\n              (post-login! ~username ~pw)\n              ~@body\n              (post-logout!)))\n\n(deftest authn-test\n    (as-user\n         \"foo\"\n         \"foo\"\n         (testing \"authentication works\"\n               ...))))\n{code}\n\nBecause puppetlabs clj-http-client does not have cookie support, we have to use clj-http in tests. It would be good to remove clj-http from our code, because having multiple http clients is making things very messy.\n\nclj-http's cookie support is described at https://github.com/dakrone/clj-http#cookiestores.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10626", "fixedVersions": ["None"], "id": "10626", "issueType": "Improvement", "key": "TK-295", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-07-21T11:11:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client: add support for cookies", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This seems like a good idea to me.", "created": "2015-12-02T11:58:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-11-11T04:31:00.000000", "creator": "557058:093475a3-6bc8-4a70-8034-ae5a2ea66512", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45a94b24"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz32g7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "System Insights"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Dec/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_8557122956_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_190959895227"}], "description": "The status of each service should contain a \"human friendly name\" type filed to make it easier to present the status information in the UI.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10273", "fixedVersions": [], "id": "10273", "issueType": "New Feature", "key": "TK-294", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:093475a3-6bc8-4a70-8034-ae5a2ea66512", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:55:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add a human friendly service name", "timeSpent": "PT0S", "updated": "2022-03-08T09:55:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "This will also remove the issues of having trouble parsing tk-auth files, and having to do things like reuse a pe-internal certificate for services.", "created": "2015-11-10T15:23:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] this sounds like a really cool idea to me, thanks for the ticket!\n\nping [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] just as food for thought.\n\n[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] can you elaborate a bit on what you mean by \"remove the issues of having trouble parsing tk-auth files\"?", "created": "2015-11-12T12:17:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Ping [~accountid:623c08e1562ab90069f8aed4].  Thought you'd be interested since you've brought this up in the past as well.", "created": "2015-11-12T13:03:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "A lot of tools / PE components still reference a pe-internal-dashboard certificate as a hard coded name that they can use, so that is what is added to PE's tk-auth file. The PE installer itself still halts on finding auth.conf versions that don't match previous releases checksums, for example.\n\nBeing able to just say \"nodes with this csr_attribute can talk to this service\" means that the likelihood of needing PE to manage / change the auth.conf in the future is less.\n\nIt is another ticket to make sure that tk-auth is easily parseable by puppet (this is again assuming that some customers will want to make changes to auth.conf for some services, so an erb template isn't sufficient - for example allowing the PE radiator page viewable without having to be logged in).", "created": "2015-11-12T17:48:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We have a puppet module shipping in Ankeny that is intended to support managing the tk-auth file.  That's tangential to most of the benefits you're getting at with this ticket, but, just for the record.", "created": "2015-11-12T17:53:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}We have a puppet module shipping in Ankeny that is intended to support managing the tk-auth file.{quote}\n\nFor reference, the github project for that is here - https://github.com/puppetlabs/puppetlabs-puppet_authorization.  This should at least allow users to be able to augment the new \"auth.conf\" that puppetserver uses with additional rules via puppet code -- without having to massage the more \"global\" erb template.\n\nThe sort-order range reservation that we're using for the new auth.conf should allow custom user rules to be added into the auth.conf in such a way that the PE-managed rules can be updated on upgrade without global checksum matching / forcing the user to hand-reconcile conflicts.\n\nI'm not arguing that it wouldn't be valuable to have a way to have authorization rules express users that should be allowed/denied via other characteristics that can be shared across multiple users - e.g., more role-based like in your example - as opposed to just the ability to identify unique names as both the legacy and new auth.conf only do today.", "created": "2015-11-12T18:37:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "Yeah!!! I'm all in favor of more flexible allow criteria. \n\nMy initial spitball design was that {{allow:}} could accept maps in its array of values as well as strings. So something like \n\n{code}\nallow: [\n  node1.example.com,\n  {certname: node2.example.com},\n  $1,\n  {pp_role: compile_master}\n]\n{code}\n\nSo if it's a string, it's a certname, same as doing \\{certname: name\\}, but you can use maps to put together arbitrarily complicated combinations of cert metadata.", "created": "2015-11-13T03:46:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Yeah, being able to parse tk-auth file is great, but csr_attributes rules specifically allow for us to not have to modify the tk-auth for every service when a compile master is spun up, for example.\n\nCurrently, if I provision a compile master, puppetdb and nc services need their whitelists updated before it can take traffic. But with rules based auth, a node with pp_role: compile_master and pp_environment: pe_inf in their csr_attributes would be able to immediately talk to the NC service, the PuppetDB service, the code manager service, etc, minimize the bootstrap time from a user requesting a new compile master and it being able to take load.\n\nSee https://puppet.atlassian.net/browse/SERVER-1005 for the ability to specify autosigners that handle alt names.", "created": "2015-11-13T09:21:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] - yeah, I totally agree with you, not having to modify tk-auth at all is preferable.  Just pointing it out because a few of your comments made it sound like you weren't sure about whether the file could be managed with puppet.", "created": "2015-11-13T09:34:00.000000"}, {"author": "557058:252602f6-56c9-47a2-a176-2c9c57106330", "body": "What allows a particular node to request a particular pp_role extension in its CSR?  Does this mean we now need a PE specific custom policy executable?  (https://docs.puppetlabs.com/puppet/latest/reference/ssl_autosign.html#policy-based-autosigning)   And if so, wouldn't that preclude customers from using this facility?", "created": "2016-02-18T16:15:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] It's just a client-side config file. Nodes can request whatever they want. \n\nHowever, I think the puppet cert command and the PE console node manager still don't have any affordances for viewing the requested extensions, which makes them unusable for anyone who's not doing custom policy autosigning. We could make this a practical feature by updating puppet cert and the node manager. ", "created": "2016-02-18T16:20:00.000000"}, {"author": "557058:252602f6-56c9-47a2-a176-2c9c57106330", "body": "[~accountid:623c08e1562ab90069f8aed4] I know the csr_attributes are just a file on client prior to the csr submission--I think that's where I'm getting confused, without some policy around the ca deciding to accept a pe_role attribute, aren't we allowing any node to sign up for being allowed to talk to a pe infrastructure service that tk-auth has a pe_role specific rule for?", "created": "2016-02-18T18:07:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] Yeah\u2014that's why I consider their absence from puppet cert (list / sign) to be the underlying problem, because if you aren't using automation you're probably automatically approving all extensions. ", "created": "2016-02-18T18:52:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] can you clarify (or point me to another ticket that clarifies) what parts of the PEM/PE Installer proposal would be blocked by this and SERVER-1005?  We are interested in doing this work but there are a lot, lot, lot of things competing for our time in Couch.  I'm relying on [~accountid:70121:caffdbd6-f73d-4ae9-9c82-c4badf061584] to help prioritize and unless we end up with more wiggle room on some project like Direct Puppet it may be hard to get to this, but if I fully understood the implications on the PEM/PE Installer it might make it easier for me to advocate.\n\n[~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] [~accountid:623c08e1562ab90069f8aed4] it seems like some of the discussion about the autosigning / {{puppet cert}} bits of this might be better to have on SERVER-1005, so that if that work is picked up, your (very legitimate) concerns can be taken into account.", "created": "2016-02-19T07:19:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - This and SERVER-1005 aren't blockers for PEM/MEEP, but are speedbumps to getting rapid deployment of compilemasters setup for people in scaling situations / wanting more flexible / better installation experience of PE. Without it, we will need to be dependent on coordinating puppet runs on compile masters and puppetdb servers for example (to promote a node to be a compile master, it needs a certificate with an altname - hence server-1005, and puppetdb would need to have it's whitelist updated to include the new compile masters certificate for it to connect).\n\n[~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] [~accountid:623c08e1562ab90069f8aed4] - that is a really good point, I hadn't considered the bad actor tactic that this would enable to get access to the catalogs / infrastructure. Would it be safe to say that if we enable rules based tk-auth, we need to enable rules based routing of certificate requests - instead of just having SERVER-1005 be about dns_altnames? In this situation, i'd want to ensure that any certificate with pp_environment = pe_inf doesn't accidentally get confused with a normal agent certificate, etc. This has made this a much larger feature to add, but may answer [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]'s question of priorities (which is this is now probably too big for Couch).", "created": "2016-02-24T11:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] so, if you had this stuff, you'd include something in MEEP that allowed a user to promote a node to a compile master via autosigning... and without it, MEEP would have to include a call to a signing command?  Still not quite understanding how these would change the UX, but I know I'm just missing something...", "created": "2016-02-24T14:45:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "Without it, currently the user would just have to perform the signing manually, which is how we tell users to do the promotion process right now.", "created": "2016-02-24T14:57:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Ah, OK.  Starting to make sense now.", "created": "2016-02-24T15:02:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "As time has progressed and I've started to understand this more completely, it's now fully sunk in that there's a possible security risk here because any agent can submit a CSR with a privileged role extension in it, and the CLI cert tool doesn't show the extensions, and the existing autosigner doesn't enforce that anyone's script validate these extensions in any way.  I know I'm late to the party :)\n\nAnyway, since this work to allow the auth is already in flight, and since we're assuming we want to target this part at Couch, we should probably think about what we consider the minimum amount of additional work that we'd need to do in order to feel like these auth changes aren't going to introduce any significant additional security risk.  Otherwise we might need to target this feature at a branch that lands after Couch?\n\n[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] [~accountid:623c08e1562ab90069f8aed4] [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] interested in your feedback on this.", "created": "2016-04-08T11:39:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "Right now - and we would have to be explicit about this in the documentation and our implementation - is that all tk_auth based rules include a requirement of the dns_altnames validation for certificate - we've already established that dns_altnames certificate requests should be a specially handled request and that users shouldn't just autosign them with the same process they autosign certificates without dns_altnames.\n\nIt is not the best solution, but in the short term it would mean that in our product someone couldn't get accidentally sign or autosign a certificate that has access to sensitive information - for the certificate to be valid against the tk_auth rules, it has to contain dns_altnames, for it to be signed, the user has to override the default signing behavior with --allow-dns-altnames, and until SERVER-1005 is in the product, no autosigner will process the request either.", "created": "2016-04-08T12:09:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] so you're saying that any places where we were going to add some kind of new \"pe_role\" extension to the certs for use in the installer / PE modules, to allow us to avoid the requirement of explicitly adding all of the compile master certnames individually to those rules, that we are also going to have the rule match on altname for now?", "created": "2016-04-08T12:15:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Heheh, welcome to team \"`puppet cert` sucks\".\n\nTo my eyes, we need to do ALL of the following before trying to use extensions for real authorization:\n\n* Modify `puppet cert` to do 3 new things:\n** List all extensions for every cert when you do {{puppet cert list}}, same way we list alt names. Improve the formatting so they're easily legible and scannable (instead of just overflowing the line like we do with alt names). \n** Balk when trying to sign a CSR with extension requests unless you provide a special flag, same as with alt names. \n** Provide a way to filter the list of certificates (and/or CSRs) to show:\n*** Only those that have a given extension (or list of extensions) set/requested.\n*** Only those that have a specific value for a given extension set/requested.\n* Stress-test and improve Puppet Server and PuppetDB's ability to reject revoked certificates when in a PE-like environment.\n** Make sure we have an easy (read: automatic) workflow for securely distributing updated CRLs from the CA server to the non-CA compile masters and the PuppetDB servers. (B/c puppet agent never updates its CRL and never retrieves it securely.)\n*** Stretch goal: fix revocation on agents too.\n** Make sure the CRL actually works, and ID any actions you must take to make it work (do we have to restart the JVM? do a HUP?), and make them part of the automatic CRL distribution.\n* Update the PE console node manager to mirror our changes to `puppet cert`.\n** Right now it doesn't allow you to sign certs with alt name requests, right? If so, it should do the exact same for extension requests. \n** ...but really, it should provide an informative interface that lets you sign either if you know what you're doing. That's probably out of scope for now, but the more important extensions become, the more useless the node manager will become. \n** It should also let you browse the existing certificates with extensions in the same way described above for `puppet cert`, but again, probably out of minimum scope? \n\nThat list will at least make it possible to, with a bunch of manual work and vigilance:\n\n* Identify which certificates have special permissions in your PE infrastructure, even if you have a realistic (i.e. huge) number of issued certificates. \n* Revoke any certificates that should NOT have those permissions, and have the revocation actually take. \n* Refrain from accidentally signing certificates with unapproved extension requests. \n\nIDEK what to do about autosigning. Probably, we should at least change na\u00efve whitelist autosigning to refuse CSRs with either alt-names or extensions. (Right now it just approves everything if the name matches, right?) Policy-based autosigning already allows you to refuse based on extension requests, but the policy executable author has to do all the work, and we all know how easy it is to get certificates right. Maybe we should be providing more affordances for this kind of check in the policy exe API? Perhaps even add a new, non-script-based interface that lets you write declarative policies instead. ", "created": "2016-04-08T12:26:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c08e1562ab90069f8aed4] I agree with you on all of those things as medium-to-long-term goals.  However, we've had a bunch of discussions about doing a *major* rework of the CA stuff, like using a database to store them on the server, possibly using OCSP, doing a total re-write of the CLI tools, etc.  I think that stuff is all fairly high on [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]'s priority list, and if it is, then what you've described is obviously more effort than we can afford to put into the legacy system.\n\nAre you saying that you'd consider *all* of that stuff to be prerequisite to using extensions for auth in the PE infrastructure?", "created": "2016-04-08T12:34:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Well, I might have written the post backwards, sorry. What I actually think is mandatory are those three bullets at the bottom:\n\n* Identify any existing certs with extensions they shouldn't have. \n* Be able to neutralize any such certs. \n* Not get silently tricked into signing any more such certs. \n\nIf can't get all three of those, extension-based auth is too great a risk to use. \n\n(The list at the top was my best guess at what we'd need for that, but I might have been putting some carts before horses.)", "created": "2016-04-08T12:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c08e1562ab90069f8aed4] well, one problem with what you're proposing is that today's CA doesn't officially keep any historical record of all of the outstanding certs.  It happens to store them in a certain directory after it signs them, and serve them to the agents from that directory when they check back in, but from that point forward there is no contract that says that we have any way of authoritatively knowing what certs are out there or what extensions they have in them.  You could totally blow away that directory and everything would just keep on chugging along, and I would strongly suspect that most customers who have been using Puppet for a while and have ever needed to rebuild their MoM for any reason are likely to have lost data and not have any way to inventory all of the outstanding certs.  (This is part of the motivation for switching to some other kind of persistence store in the future.)\n\nGiven that, it seems like bullet #1 is probably not possible?", "created": "2016-04-08T12:50:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Ah, you're right. So then... extension-based auth is a non-starter until we get that rework of the CA infrastructure, right? And we should just punt this ticket until then? We'll need some way to prevent people from using this unless their CA has lived its whole lifetime under the new regime.\n\nHaving a leaky record of certs works fine for name-based auth because your name is your name, but as soon as you start using non-unique metadata for auth... I think you have to have bookkeeping. Or am I missing something again? ", "created": "2016-04-08T12:57:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c08e1562ab90069f8aed4] I definitely see what you're getting at, but I don't feel qualified to weigh in on whether those concerns would be an absolute blocker for rolling out this feature.  Maybe [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] can weigh in when he gets back.  (godspeed, [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]!)", "created": "2016-04-08T13:16:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:623c08e1562ab90069f8aed4] \n\nYes, I am saying at all tk-auth rules that are created also have to check for the presence of the environments dns_altnames. All PE related services that would be created almost always already contain dns_altnames because the reason we are deploying more compile masters, or puppetdb instances, or activemq spokes is to handle load or HA configures, which usually involve a loadbalancers, which need their hostnames added to the dns_altnames already.\n\nBy ensuring our rules that we we create in PE require the presence of dns_altnames, it means that we are providing the short term functionality until updating the CA / cert tools to handle ssl extensions is done. This does make it dependent on the tk-auth rules to be validated and tested thoroughly, but they should be already, and since we still can't control an enduser from changing auth rules from exposing themselves to security risks anyway, I don't see that we need to wait to introduce this feature as long as we follow a standard on how we implement the checks against which are valid ssl extensions / certificates.", "created": "2016-04-08T13:49:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] I think I agree with that, as long as [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] signs off on it when he gets back.\n\nI wonder, though, if we're going to require the altnames to be included in any out-of-the-box PE rules, then do we even need to add an additional extension to those rules?  Or would the altnames be sufficient for identifying the PE nodes that need access to the endpoints in question?", "created": "2016-04-08T15:10:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "We should still require more than just altnames, ie, I don't want to grant every PE Infrastructure node access to PuppetDB if it doesn't need it - activemq spokes don't need that information, etc.\n\nSo you'd have rulesets on the services with (sorry I'm munging all the UX work above):\n\npp_role = [compilemaster,rbac,console] && dns_altnames = *customer.foo.com*\n\ndns_altnames means a certificate had to go through a non automated / accidental signing process, but pp_role has to also contain the right role's allowed to talk to the service.", "created": "2016-04-08T15:16:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "It sounds like the minimum work needed to make this ticket's work viable is captured by TK-352. [~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb], [~accountid:623c08e1562ab90069f8aed4], can you confirm that?", "created": "2016-04-08T15:27:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "Hmm, I hadn't thought of (has > 0 alt names) && (particular extension value), so I guess I WAS missing something! ...Yeah, I think that makes it viable, as long as everyone making those auth rules understands the problem. \n\nDocumenting the safe use of extension rules for users is going to be kind of rough. ", "created": "2016-04-08T15:38:00.000000"}, {"author": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "body": "Yeah, I realize its not ideal, but it enables us to get this out of the door. In theory the rules remove a lot of the use cases for users to have to hand edit the auth in the first place.\n\nIt may have to fall under an advanced / *here be dragons* (or apiarists only) header until we get the rest of the toolchain in place to make signing ssl extensions a lot clearer to the users.", "created": "2016-04-08T15:44:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "It's worth noting that despite the long laundry list of things it would be nice to have in place for a complete cert-based auth experience (which [~accountid:623c08e1562ab90069f8aed4] did a great job of enumerating above), there's really only one that's an MVP hard-line requirement.\n\n{quote}\nBalk when trying to sign a CSR with *\\[a given, known extension request]* unless you provide a special flag, same as with alt names.\n{quote}\n\nUsing dns-alt-names is a cheap way of doing this today because it is effectively a given, known extension request which we balk on when signing without an explicit flag.\n\nIf we have any engineering effort to devote to this and want something *slightly* cleaner than hijacking dns-alt-names, we could choose to designate a particular OID arc as \"secure\", and require an explicit flag to sign certs that request extensions under this arc\u2014the same way dns-alt-name requests do. e.g.\n\n{code}\npuppet cert sign --allow-secure-extensions\n{code}\n\nWe would then be free to define an OID under the secure arc, name it something like \"pe_infrastructure\", and require that a node have BOTH a value in the pe_infrastructure extension AND an appropriate pp_role extension in order to grant authorization.\n\nAgain, same idea, but a little more engineering effort and I think a lot cleaner.", "created": "2016-04-08T16:18:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49] I was thinking of some things along those same lines, but I think that [~accountid:623c08e1562ab90069f8aed4]'s point is that that doesn't give us any guarantee that there aren't already existing certs that were signed with one of these newly-declared-\"secure\" extensions, and those certs would be grandfathered in, and that might be a security risk.", "created": "2016-04-09T07:37:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "Yeah exactly.", "created": "2016-04-11T14:39:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:623c08e1562ab90069f8aed4] I just talked to [~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] about this. Due to thoughtful planning in how our OID arcs were designed, we have the ability to implement a real solution cleanly, and easily.\n\nOur root OID is 1.3.6.1.4.1.34380 for \"puppetlabs\". We then have:\n\n{noformat}\npuppetlabs.1:   \"Puppet Certificate Extension\"\npuppetlabs.1.1: \"Puppet Registered Certificate Extension\" (ppRegCertExt)\npuppetlabs.1.2: \"Puppet Private Certificate Extension\"    (ppPrivCertExt)\n{noformat}\n\nSee details [here|https://github.com/puppetlabs/puppet/blob/master/lib/puppet/ssl/oids.rb#L28-L61].\n\nOur CA will currently ONLY accept extension requests if they are under one of the existing ppRegCertExt or ppPrivCertExt OIDs. See [here|https://github.com/puppetlabs/puppet/blob/master/lib/puppet/ssl/certificate_authority.rb#L325-L329].\n\nIf we want to implement \"authorization\" certificate extensions, we could do so by defining another OID arc under puppetlabs.1. For example, we could define:\n\n{noformat}\npuppetlabs.1.3: \"Puppet Authorization Certificate Extension\" (ppAuthCertExt)\n{noformat}\n\nBecause any extensions under this OID are flatline rejected today, we have full control over how we implement the methodology for accepting them. We could require on the command line something like:\n\n{code}\npuppet cert sign --allow-authorization-extensions\n{code}\n\nThis would not be subject to the security concerns expressed above.\n\nMaking an immediate-term plan to base trust on dns-alt-names existing in a cert is an acceptable work-around, but it's a hack. It is not a good design, and it is something we should be intentionally seeking a solution to. It's technical debt. If we can solve the problem cleanly now, it seems worth it to me to avoid paying back technical debt on this later.\n\nThoughts?", "created": "2016-04-12T11:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49] interesting.\n\n{quote}\nOur CA will currently ONLY accept extension requests if they are under one of the existing ppRegCertExt or ppPrivCertExt OIDs. See here.\n{quote}\n\nThat's only the ruby code, though.  [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] [~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049] [~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] do you know if this logic is also present in the Clojure CA?\n\nAssuming that we do have that protection in the Clojure code and that we decide we're safe, then it sounds like what we'd have to do to support this would be:\n\n1. Add the new OID arc in both Ruby and Clojure\n2. Add something to the Ruby ca cli tool to list extensions in a CSR?\n3. Add the '--allow-authorization-extensions' to the Ruby CLI?\n\nThat doesn't sound like a ton of work, and I agree with you that it would avoid some stuff that I'd consider tech debt in the default PE rules, but much of the work above will end up being thrown away whenever we redo the CA... so it's a different kind of tech debt.  I also think that since the PE tk-auth rules are managed by PE modules, translating the old rules that include altnames to new, better rules in the future would be pretty straightforward and invisible to the user?\n\nI see pros and cons to both, just trying to enumerate them, not necessarily advocate for one or the other.  Probably what this comes down to is how confident [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] is that we'll get to the CA rework any time soon, or whether that's far enough out that investing some energy in the Ruby cli tool is justifiable for the short term.\n", "created": "2016-04-12T11:49:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I'm going to resolve this ticket since the associated PR has been merged and the feature has landed in tk-auth.  TK-352 and PE-14835 are currently tracking follow-up work.", "created": "2016-04-12T13:27:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:623c08e1562ab90069f8aed4] [~accountid:70121:9c658341-861b-467e-8f57-dfcff20944cb] [~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] with this ticket marked resolved I thought it prudent to create a new one to track the proposal to implement Puppet Authorization Certificate Extensions instead of keying off of the presence of subject alternative names. See PUP-6166.", "created": "2016-04-12T14:30:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] Okay. Thx.", "created": "2016-04-12T15:11:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "{quote}Our CA will currently ONLY accept extension requests if they are under one of the existing ppRegCertExt or ppPrivCertExt OIDs{quote}\n{quote}That's only the ruby code, though. Jeremy Barlow Nate Wolfe Justin May do you know if this logic is also present in the Clojure CA?{quote}\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Behavior should match.  Corresponding implementation here: https://github.com/puppetlabs/puppet-server/blob/master/src/clj/puppetlabs/puppetserver/certificate_authority.clj#L550-L568", "created": "2016-04-12T16:25:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-11-10T15:20:00.000000", "creator": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@28a4285"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1305"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyng4n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Nov/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_69178995_*|*_1_*:*_1_*:*_1888513587_*|*_10007_*:*_1_*:*_604241210_*|*_3_*:*_1_*:*_2082523308_*|*_5_*:*_2_*:*_13979851970_*|*_6_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_91506873_*|*_10006_*:*_1_*:*_253165552_*|*_10005_*:*_1_*:*_8397631208"}], "description": "h2. Summary\n\ntk-auth should allow auth rules that match on CSR attributes (aka SSL Extensions) instead of just certname. tk-auth's service should accept a mapping of OID to short names that can be used to define the auth rules.\n\nh2. In Scope\n\n* Ability to provide the tk-auth service with a map of OID -> shortname\n* Ability to set an :allow or :deny stanza to use a map of shortnames (or raw OIDs) to values instead of just a hostname\n* Extracting a certificate's extensions as part of tk-auth middleware and translating them from OID -> shortname using the provided mapping\n* Affordance for an empty mapping\n* Failing fast if a given extension key in the auth rules can't be found as a shortname in the OID -> shortname mapping AND isn't a valid OID\n\nh2. Out of Scope\n* Supporting any shortnames outside of what tk-auth's service gets in the passed mapping. This includes puppet's shortnames. Such things should be passed into consumers of tk-auth (like puppet server)\n* Wildcard/pattern matching on extension values\n\nh2. Bonus Round\n\nThere is still dead code detritus leftover from when tk-auth was originally adopted from the community. This should be cleaned up as needed to implement this new functionality.\n\nh2. Design\n\nThe following are all valid values for {{allow}} or {{deny}} in the auth conf.\nPlease note that the puppet shortnames used are not supported by tk-auth\nnatively but must be passed in.\n\n{code}\n# classic\n\"node.foo.com\"\n\n# simple csr attr case\n{attrs: {pp_role: compile_master}}\n\n# complex csr attr case\n{attrs: {pp_role: [compile_master, console],\n         pp_environment: pe_inf}}\n\n# mix\n[\"node.foo.com\",\n \"node.bar.com\",\n {attrs: {pp_role: compile_master}}]\n\n{code}", "epicLinkSummary": "Securing SSL Extensions", "estimate": "PT0S", "externalId": "10272", "fixedVersions": ["PE 2016.2.0"], "id": "10272", "issueType": "New Feature", "key": "TK-293", "labels": [], "originalEstimate": "PT0S", "parent": "16417", "parentSummary": "Securing SSL Extensions", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:9c658341-861b-467e-8f57-dfcff20944cb", "resolution": "Done", "resolutionDate": "2016-09-22T10:10:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-auth should support x.509 extensions for authentication instead of just certname", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-11-10T12:05:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b7abd61"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1313"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xpz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1897695563_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_96269737598"}], "description": "We've had several things come up over time where if we had a way to add servlet filters to the Jetty context handler, it'd provide a lot of value.\n\nWe should look into what it would take to add this as a general tk-j9 thing.\n\nA more concrete use case that might overlap with the general feature request would be a way to add logback's {{TeeFilter}} to the context, because if it's enabled, you can configure logback to dump the full request/response bodies to a log file.  This would be very useful for, e.g., monitoring traffic to/from the JGit servlet. (The TeeFilter might have limited utility outside of that, though, since most of our web stuff is Clojure/ring and we already have some reasonable utility functions for logging those requests/responses.)", "epicLinkSummary": "Improved JRuby Debugging UX", "estimate": "PT0S", "externalId": "10481", "fixedVersions": [], "id": "10481", "issueType": "New Feature", "key": "TK-292", "labels": ["http", "usability"], "originalEstimate": "PT0S", "parent": "14734", "parentSummary": "Improved JRuby Debugging UX", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2018-12-20T16:49:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for ServletFilters to tk-j9", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-11-02T14:07:00.000000", "creator": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@78bbff76"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz2w67:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "PuppetDB"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_30333883335_*|*_6_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10558", "fixedVersions": [], "id": "10558", "issueType": "Improvement", "key": "TK-291", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:4c2994e4-73a9-4e99-971a-6d93d39be223", "resolution": "Fixed", "resolutionDate": "2016-10-18T17:12:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Move PDB logging test utils code into TK", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "@wyatt this is already done and released, right?", "created": "2015-12-02T11:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-10-30T14:41:00.000000", "creator": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2a6bcb9f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz2vi7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "PuppetDB"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Dec/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_30594657592_*|*_6_*:*_1_*:*_0"}], "description": "This follows up on the email I sent to the dev team on the 10/28. PDB would like to use a :starting state while we're in maintenance mode on startup, and [~accountid:557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52] is also interested in a shutting down state, which seems like a good idea too. There may be a better keyword than :shutting_down to express that.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10501", "fixedVersions": [], "id": "10501", "issueType": "Improvement", "key": "TK-290", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "resolution": "Fixed", "resolutionDate": "2016-10-18T17:12:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add :starting and :shutting_down states to tk-status", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049] and/or [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] to grab this ticket and either remove this message or add verbiage about how to fix it.", "created": "2015-11-04T11:19:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "We discussed this with [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0].  This isn't a fatal condition.  trapperkeeper-authorization will reorder the rules in memory despite the order in which they appear in the file.  We probably could come up with some sort of a message that would give the user a little more direction about what to do to avoid seeing the message in the log - e.g., move this rule's sort order before this other rule's sort order and/or just use the puppet-authorization module to apply your rules because it will automatically sort things in the right order for you.  But since nothing is fundamentally broken and any message we come up with could still be confusing / misleading, [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] was thinking it might be better at this point to not bother users with this message and instead just remove the code that generates the message from our implementation.  Per his advice, that's what we're going to do for this ticket.\n\nUsers will still have a means for seeing the run-time presentation of the rules in the log and be able to compare that to what was in the original auth.conf file.  Hopefully, that will suffice for now.", "created": "2015-11-04T12:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master branch at [65195b|https://github.com/puppetlabs/trapperkeeper-authorization/commit/65195ba1121280e85ac86aec76579f9c8b131fac].", "created": "2015-11-04T16:21:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-10-28T13:56:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6f7bbba8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz2u9r:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Nov/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_93753753_*|*_1_*:*_1_*:*_607283445_*|*_10007_*:*_1_*:*_7207066_*|*_3_*:*_1_*:*_2671957_*|*_5_*:*_1_*:*_0"}], "description": "If I change a rule name and the names of my rules are no longer in alphabetical order in the file, I get the following log warning:\n\n{code}\n2015-10-28 18:51:09,367 WARN  [p.t.s.a.authorization-core] Found rule 'puppetlabs file sync git' out of order; expected 'puppetlabs file sync commit'. Rules in configuration file not in ascending sort order.\n{code}\n\nI find this warning somewhat unclear. It doesn't actually tell me what tk-auth is going to do with the rule being out of order. Would be nice to have something like {{\"will execute rules in <x> order instead\"}} or something.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10271", "fixedVersions": [], "id": "10271", "issueType": "Improvement", "key": "TK-289", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2015-11-05T18:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK-auth rule out of order warning is unclear", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-10-22T14:21:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Scrum Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Puppet Server"}, {"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Froyo"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@806666e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Color", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-color", "value": "ghx-label-6"}, {"fieldName": "Epic Name", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-label", "value": "trapperkeeper-auth improvements"}, {"fieldName": "Epic Status", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-status", "value": "Done"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Issue color", "fieldType": "com.pyxis.greenhopper.jira:jsw-issue-color", "value": "green"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyora7:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_92301292158_*|*_6_*:*_1_*:*_0"}], "description": "This is a placeholder epic for any work to be done around trapperkeeper-authorization post-Ankeny.  This may ultimately need to be broken down into separate epics or replaced with a tk-authz release version target.  Using this for organizational purposes for now.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10365", "fixedVersions": [], "id": "10365", "issueType": "Epic", "key": "TK-288", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2018-09-24T21:36:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "trapperkeeper-auth improvements", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623c08e1562ab90069f8aed4", "body": "I think a global default \"skip\" setting is a bad idea. Right now, you determine the behavior of a rule by looking at _that rule", "created": "2015-10-23T06:06:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}I think a global default \"skip\" setting is a bad idea. Right now, you determine the behavior of a rule by looking at that rule", "created": "2015-10-23T09:32:00.000000"}, {"author": "557058:8527c9e8-8e3f-451c-b529-f6fe014233ed", "body": "One of things that I *need* tk-auth to fix for our customers in the field is PE-13583, we have to stop using generic certs otherwise we will never be able to have true HA solutions. We export and collect non-unqiue entries in app orc right now for instance and thus if you try and built even simple HA of two monolithics PE prevents it out of the box. \n\ncc/[~accountid:70121:caffdbd6-f73d-4ae9-9c82-c4badf061584]", "created": "2016-03-11T11:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-10-22T14:15:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1866b071"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-288"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp6hj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Oct/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_507163901_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_71997239591"}], "description": "In reviews of the trapperkeeper-authorization design, the point was raised multiple times that the fundamental approach of only allowing for rule evaluation to terminate at the first matching request, with no provision to fall through to subsequent rules for evaluation, is problematic.  [~accountid:63d4062f69c7ae3958d276ed] stated the problem very well in a comment on the tk-auth RFC, https://docs.google.com/document/d/1XIsGAg0Dm_aF5YWzvzZwkYaGQ15XoLVONCgYiBv9RpI/edit#heading=h.yvnoixkizihy.\n\n{quote}The first-rule-wins model makes it difficult to automatically add rules (for instance, during PE upgrades). There's the risk that they will either shadow or be shadowed by existing rules. That is, if a rule says that cert A can access route B, then a new rule that says cert C can access route B can't be added; instead, the old rule needs to be identified and extended. That's a simple task for a human, but a difficult task for a machine. This problem is compounded by the fact that a rule could be shadowed not by another rule for the same route, but even by a rule for a more or less specific route.\n\nSpecifically, the main thing needed is the ability to easily, correctly add a rule that allows some node to get at some data, with the guarantee that no other nodes or routes will be affected. One option would be to enable rules to allow-or-pass rather than the current allow-or-implicitly-deny. Then specific rules like allow node A for route B could be ordered at or near the top of the precedence order and allow-or-pass to avoid affecting any other rules.{quote}\n\n[~accountid:623c08e1562ab90069f8aed4] also discussed the issue here:\n\nhttps://puppet.atlassian.net/browse/TK-260?focusedCommentId=205309&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-205309\n\n--\n\nThis ticket would cover the idea of implementing some sort of a conditional \"skip\" or \"allow-or-pass\" type of addition to the current rule definition.  One possible approach might be to add an optional \"skip\" boolean field to the rule definition.\n\nFor a value of \"false\", the request would be allowed or denied per the definition of the allow/deny/allow-unauthenticated fields in the first matching rule found in sorted rule order.  If the request did not match a deny entry but did match an allow entry, the request would be allowed.  If the request did not match a deny entry or did not match any entry, the request would be denied.\n\nFor a value of \"true\", as suggested by [~accountid:623c08e1562ab90069f8aed4] in TK-268, if the request were to match a deny entry for a matching rule, the request would be denied.  If the request did not match a deny entry but did match an allow entry, the request would be allowed.  If the request did not match any entry - as opposed to with \"skip: false\" - authorization would evaluate the next rule in sort order - as it does today if the request were not considered a match against the path/method/query-params - rather than implicitly denying the user.\n\nIt may also make sense to, in addition to just having the ability to configure the \"skip\" behavior on a per-rule basis, have a global \"skip\" setting in the authorization section that would be used as the default for any rule that doesn't specifically set it.  For example, if the authorization section had a global \"skip\" value of \"true\" and rule 1 had an explicit \"skip\" value of \"false\" defined but rule 2 had no value specified for skip, the authorization logic could treat the \"skip\" value for rule 1 as \"false\" and the \"skip\" value for rule 2 as \"true\".\n\nNot sure what the best names for these settings would be.\n\nWould be interested in opinions in general on design approach from [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df], [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], and both Nicks.\n\n\n\n\n\n\n\n\n\n", "epicLinkSummary": "trapperkeeper-auth improvements", "estimate": "PT0S", "externalId": "10201", "fixedVersions": [], "id": "10201", "issueType": "New Feature", "key": "TK-287", "labels": [], "originalEstimate": "PT0S", "parent": "10365", "parentSummary": "trapperkeeper-auth improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-07T17:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add option for skip / allow-or-pass to tk-authz rule definition", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "attachments": [], "comments": [{"author": "623c08e1562ab90069f8aed4", "body": "I think {{authentic}} should be replaced with {{artisinal}}. Authenticity is too much of a philosophically-loaded concept, when what we're really trying to get across is just that the request was hand-crafted according to traditional methods. ", "created": "2015-10-21T11:43:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "But no seriously, I'm in favor of \"authenticated.\"", "created": "2015-10-21T11:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] and [~accountid:623c08e1562ab90069f8aed4] {{authenticated}} sounds reasonable to me.  Thanks for bringing this up!", "created": "2015-10-21T12:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "We use {{authentic?}} in a number of places in tk-authz today.  The only end-user visible place I'm aware of is in the descriptive message that is delivered to the log and HTTP failure responses from here:\n\nhttps://github.com/puppetlabs/trapperkeeper-authorization/blob/0.1.5/src/puppetlabs/trapperkeeper/authorization/rules.clj#L155\n\nThat said, it would seem better to change the internal code references to {{authenticated}} as well.  This is also used in the name of a key which is added to the ring request and, therefore, available to downstream consumers like Puppet Server - https://github.com/puppetlabs/trapperkeeper-authorization/blob/0.1.5/src/puppetlabs/trapperkeeper/authorization/ring.clj#L19-L28.  I like the idea of going with {{authenticated}} instead of {{authentic?}} here, although it will involve changing this reference in the Puppet Server repo as well.", "created": "2015-10-21T13:11:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master branch at [4744ac|https://github.com/puppetlabs/trapperkeeper-authorization/commit/4744ac416aeb3ce8e9eaefca92f0d30fbe3624b8].", "created": "2015-11-04T16:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-10-21T11:10:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@23689005"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp6gn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Oct/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_86289496_*|*_1_*:*_1_*:*_1125433_*|*_10007_*:*_1_*:*_531852468_*|*_3_*:*_1_*:*_5809711_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_693204153"}], "description": "Currently in TK-Auth, {{authentic?: true}} is used to indicate that the request had an authenticated client cert. I find this to be a very confusing term.\n\n\"Authenticated\" is the long-form for \"authentic\", but \"authenticated\" is a term I'm very familiar with from other libraries. {{authentic}} isn't an abbreviation for it that I've ever seen\nand since it's also an English word with it's own meaning, I keep getting tripped up by it.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10499", "fixedVersions": [], "id": "10499", "issueType": "Improvement", "key": "TK-286", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2015-11-05T16:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "\"authentic?\" is a confusing term", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "fyi, [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] and [~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049].  I hadn't actually fixed this yet.  Just logged the ticket for now so I wouldn't forget again.", "created": "2015-10-05T15:32:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-10-05T15:32:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@105f9b4d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyobtz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_761776372_*|*_10007_*:*_1_*:*_260766674_*|*_3_*:*_1_*:*_354186283_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1315642469_*|*_10005_*:*_1_*:*_46238"}], "description": "If a rule in a trapperkeeper-authorization config includes an allow/deny backreference but no corresponding capture group is present in the rule's path, an ugly-looking error message is returned to the caller.\n\nFor example, I modified the ring-example to include the following rule:\n\n{noformat}\nauthorization: {\n   version: 1\n   rules: [\n        {\n            match-request: {\n                path: \"^/hello/all-allowed$\"\n                type: \"regex\"\n            }\n            allow: \"$1\"\n            name: \"users allowed\"\n            sort-order: 500\n        },\n       ...\n    ]\n}\n{noformat}\n\nWhen making a request to the server which matches the rule, http://localhost:8080/hello/all-allowed, the following error message is returned in the HTTP response to the caller:\n\n{noformat}\n2015-10-05 14:10:52,851 WARN  [o.e.j.s.HttpChannel] /hello/all-allowed\njava.lang.IndexOutOfBoundsException: null\n\tat clojure.lang.PersistentVector.arrayFor(PersistentVector.java:107) ~[clojure-1.6.0.jar:na]\n\tat clojure.lang.PersistentVector.nth(PersistentVector.java:111) ~[clojure-1.6.0.jar:na]\n\tat clojure.lang.RT.nth(RT.java:763) ~[clojure-1.6.0.jar:na]\n\tat puppetlabs.trapperkeeper.authorization.acl$substitute_backreference$fn__9150.invoke(acl.clj:174) ~[na:na]\n\tat clojure.string$replace_by.invoke(string.clj:67) ~[clojure-1.6.0.jar:na]\n\tat clojure.string$replace.invoke(string.clj:106) ~[clojure-1.6.0.jar:na]\n\tat puppetlabs.trapperkeeper.authorization.acl$substitute_backreference.invoke(acl.clj:174) ~[na:na]\n\tat puppetlabs.trapperkeeper.authorization.acl$interpolate_backreference$fn__9154.invoke(acl.clj:180) ~[na:na]\n{noformat}\n\nIn this case, there are no capture groups in the regex so the substitution for \"$1\" fails.\n\nThe error message should more clearly indicate the actual problem.  Ideally, it would also seem better if this could be validated as the rules are first loaded - not just lazily when rules are being evaluated - so that a user can detect the existence of a faulty rule right away.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10200", "fixedVersions": [], "id": "10200", "issueType": "Bug", "key": "TK-285", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-11-05T18:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-authz generates IndexOutOfBoundsException for backreference with no rule capture group", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-09-30T17:35:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3c79c4a8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz29l3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1186706389_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_73791966781"}], "description": "In Puppet Server recently, we ran into an issue wherein we needed to grab the configuration for a particular webserver, but we had no way to get that information without hardcoding the name of the server and directly grabbing the configuration (SERVER-964).\n\nWe should consider adding a service function that allows us to get the webserver configuration for a particular service based on its web routes.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10557", "fixedVersions": [], "id": "10557", "issueType": "New Feature", "key": "TK-284", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:00:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add service function to get webserver configuration for a particular service", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-09-29T14:29:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7768ab57"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz27pz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_75172882_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_75001023967"}], "description": "We recently added a {{wrap-routes}} function to {{comidi}}, which can be used to apply middleware to the leaf nodes of a route tree.\n\nI had a use case in pe-puppetserver recently where I wanted to do this selectively... so, only apply the middleware to a subset of the routes in the route tree.\n\nI ended up achieving this by copy/pasting the {{wrap-routes}}/{{wrap-routes*}} functions from {{comidi}} into the app code, and then adding an extra argument to them.  The new argument is a predicate function, which accepts a zipper location as an argument and then returns {{true}} or {{false}}.  Then {{wrap-routes}} only applies the middleware to the leaf nodes where the predicate returns {{true}}.\n\nWe should consider adding this to the upstream {{comidi}} library.  See {{puppetlabs.enterprise.services.master.master-core}}.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10608", "fixedVersions": [], "id": "10608", "issueType": "New Feature", "key": "TK-283", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2018-02-14T11:59:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for predicate function in comidi/wrap-routes", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - As part of moving the {{allow-header-cert-info}} functionality over to trapperkeeper-authorization, I'd been thinking about whether or not we should try to fix SERVER-213 as well - our lack of support in Puppet Server for parsing a DN that is using the legacy OpenSSL format (which even latest nginx does, as I understand).  This has come up from a number of users, although I believe users have found effective workarounds for the problem - see https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/puppet-users/-13-AADVhOo/lzm8aMrCKp4J.\n\nIn the server-side implementation, we could do something like:\n\n- Let BouncyCastle try to parse the CN from out of the DN, as we do today.  BouncyCastle will only be successful in doing so if the format of the DN which was supplied was RFC 2253.\n\n- If the BouncyCastle CN parsing fails, try to parse out the CN by doing a string split on solidus characters, looking for the value for the \"CN=\" key if supplied.  So if the original format of the DN were \"/O=myorg/CN=myname/D=mydept\", we'd get \"myname\" for the CN.  This is the legacy OpenSSL format that nginx uses.\n\n- If we still can't get a CN after step 2, fail the request with a descriptive error message.\n\nThe OpenSSL legacy fall back approach isn't great by any means, but something similar does happen in the Ruby Puppet master today - https://github.com/puppetlabs/puppet/blob/4.2.2/lib/puppet/util/ssl.rb#L18-L33.  If your CN were to have any \"special characters\" like \"=\" or \"/\", it is possible that the CN you get back would be wrong.  Although, I think is also the behavior you'd get with the {{X-Client-DN}} parsing in Ruby today.  Here's the crude approach that jruby-openssl uses - https://github.com/jruby/jruby-openssl/blob/v0.9.11/lib/jopenssl19/openssl/x509-internal.rb#L100-L103.  I haven't checked the MRI implementation, but I imagine it would have something similar.  Unfortunately, the legacy OpenSSL format didn't have a provision for escaping special characters, so there doesn't really seem to be a way around this.\n\nWe could continue to punt on this and say that the user needs to hack around this on their load balancers like they've been doing today, but I think adding this extra fallback (with appropriate caveats about where it might fail due to the limitations of the legacy OpenSSL format) might be an improvement.\n\nWhat do you think?", "created": "2015-09-17T10:25:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "It sounds fine as a stretch goal but I definitely wouldn't put any thought / effort into it until we're feature complete on the blockers...", "created": "2015-09-17T10:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - ok, assuming [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] is good with that as well, I'll consider the first pass at this ticket to cover just handling the RFC 2253 format like we do in Puppet Server today and that we'll come back around and fold in SERVER-213 when/if we get time before release.", "created": "2015-09-17T11:24:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master branch at [8300ec7|https://github.com/puppetlabs/trapperkeeper-authorization/commit/8300ec7343542ee8093ffbaf88bfde5c74915f77].", "created": "2015-09-30T14:08:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Delivered in trapperkeeper-authorization 0.1.4 release.  Moving to testing.  [~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] - not sure if there's anything you want to test for this ticket or just wait until it all rolls up into Puppet Server, which is covered by SERVER-763.", "created": "2015-09-30T14:13:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Resolving this one and testing SERVER-763.", "created": "2015-09-30T15:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-16T15:37:00.000000", "creator": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@37bff03e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoegf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_10712798_*|*_10007_*:*_1_*:*_742153170_*|*_3_*:*_1_*:*_451708500_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_3766836_*|*_10004_*:*_1_*:*_241816"}], "description": "This ticket is basically about adding the ability to support the \"external SSL termination\" use case from Puppet Server to the trapperkeeper-authorization - http://docs.puppetlabs.com/puppetserver/2.1/external_ssl_termination.html.  Specifically, this would add the ability for the authenticated user of the request to be pulled from {{X-Client-*}} headers as opposed to only via the SSL client certificate, controlled via an {{allow-header-cert-info}} setting.\n\nFollowing Puppet Server's lead, the implementation for trapperkeeper-authorization would consist of the following:\n\n1) Add an {{allow-header-cert-info}} setting to the {{authorization}} config section.\n\nFor a value of {{false}} (the default), authenticated user info will be derived only from an SSL client certificate. For a value of {{true}}, authenticated user info will be derived from evaluating content in the {{X-Client}} HTTP headers.\n\n2) For the {{allow-header-cert-info}} {{true}} case:\n\na) Extract the authenticated user's name from the Common Name (CN) in the {{X-Client-DN}}, if possible.  Associate the resulting name with the {{authorization.name}} key on the Ring request.\n\nb) If the authenticated user's name could be found from within the {{X-Client-DN}} header and if the {{X-Client-Verify}} header is present and set to a value of \"SUCCESS\", associate a value of {{true}} with the {{authorization.authentic?}} key on the Ring request.\n\nc) Attempt to URL decode and extract a Base-64 PEM encoded form of the client certificate from the {{X-Client-Cert}} header and convert the result into a {{java.security.cert.X509Certificate}} and attach the resulting object to the {{authorization.client-cert}} key.  (This part isn't relevant to the identity that tk-authz uses when authorizing a request but is necessary in order to flow through the client certificate to downstream consumers of the Ring request map, as Puppet Server does today.)\n\nWith current code in place in trapperkeeper-authorization, the existing logic in tk-authz should be able to authorize the user via an identity deriving from HTTP {{X-Client}} headers.\n\nThis work will enable work to be done in SERVER-763 to infer the authenticated user's identity from the {{authorization}} key in the Ring request map when provided by trapperkeeper-authorization.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10607", "fixedVersions": [], "id": "10607", "issueType": "Task", "key": "TK-282", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:96a443bf-a3ab-426b-9442-ce50c9977428", "resolution": "Done", "resolutionDate": "2015-09-30T15:20:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add ability to obtain authenticated user info from HTTP headers to tk-authz", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "https://github.com/puppetlabs/trapperkeeper-scheduler", "created": "2016-02-24T18:10:00.000000"}, {"author": "61af86343618cd006f430854", "body": "module was rewritten, if issue persists, reopen", "created": "2021-12-22T11:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-15T13:02:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4f01e2d6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Free ?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons", "value": "Yes"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz27pr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_81451934_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_197772013391"}], "description": "There is some logic in the {{stop}} function of the scheduler service that assumes that \"pool\" and \"jobs\" have been initialized in the context.  If they haven't, it will throw an NPE.\n\nWe saw this in an acceptance test failure, where a SIGINT was sent to the server while it was still initializing the app, and this caused the shutdown sequence to start.\n\nhttp://jenkins-enterprise.delivery.puppetlabs.net/view/pe-puppet-server-extensions/job/enterprise_pe-puppet-server-extensions_integration-system_smoke-master/10/LAYOUT=64mdca,LDAP_TYPE=default,PLATFORM=centos7,label=beaker/consoleFull", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10480", "fixedVersions": [], "id": "10480", "issueType": "Bug", "key": "TK-281", "labels": ["final_triage", "low-hanging-fruit", "server"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Fix", "resolutionDate": "2021-12-22T11:20:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "scheduler service throws error during shutdown if it wasn't initialized properly", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master at [7e4578|https://github.com/puppetlabs/trapperkeeper-authorization/commit/7e45780b5084cae95a447945d8a78da7d7960269].", "created": "2015-09-17T17:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] I'm going to go ahead and close this out since we merged the docs work.  If you do have a chance to review this later on and have suggestions for changes, please let me know.", "created": "2015-09-17T17:51:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "(y)\n", "created": "2015-09-17T18:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-10T17:09:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3d2f231a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoegn:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Need to get some of the docs consolidated for coordination across teams."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_8123_*|*_10007_*:*_1_*:*_103678530_*|*_3_*:*_1_*:*_503637564_*|*_5_*:*_1_*:*_0"}], "description": "We've gotten far enough in the integration of tk-authz into Puppet Server now and the spec has solidified enough that it would be good to get some better docs into the tk-authz as a point of reference for configuration.  This is related to SERVER-856.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10625", "fixedVersions": [], "id": "10625", "issueType": "Task", "key": "TK-280", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2015-09-17T17:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create some initial authorization section settings docs for tk-authz", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - I know we talked about this a bit in TK-266, but did you come to any conclusions about whether you think the rule \"name\" should appear both in related messages in the server log and in the HTTP response body delivered to the client or just in the server log only.  The only reason I'm hesitating a bit on delivering the \"name\" back to the client is whether this would potentially give a nefarious client extra information to carry out some attack on the server.  /CC [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], in case you have any opinion on this.", "created": "2015-09-10T16:35:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Hmm, thought I'd commented on this somewhere - the (exposure * probability) risk of a significant security issue due to information disclosure from our error messages is essentially zero. The problems (from UX to material support costs) that arise from users having non-obvious error messages are a daily struggle for nearly everybody. So... yeah please include the name of the rule that denied the request in the response. I *think* if this is done in a way consistent with other puppet error messages it will show up in the agent logs / CLI without any agent-side changes, which would be ideal.", "created": "2015-09-10T16:46:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I have no opinion.", "created": "2015-09-10T16:48:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "k, we'll just do what [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] says then.", "created": "2015-09-10T16:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-10T16:30:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2d4161dc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz22s7:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "10/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_12460_*|*_10007_*:*_1_*:*_85804274_*|*_3_*:*_1_*:*_4238111_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_346322556"}], "description": "Currently, tk-authz isn't doing any of its own logging, e.g., pertaining to requests being authorized against rules.  TK-261 would get into doing a broader level of verbose logging that could be used for in-depth troubleshooting.  For parity with Ruby Puppet's auth.conf, however, we should at least have trapperkeeper-authorization log an error-level message when an authorization failure occurs.   Since, with TK-266, we'll have a \"name\" that we can associate with each rule, the log message should include the \"name\" as part of the message.  This ticket would just cover the implementation for logging this simple failure message.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10497", "fixedVersions": [], "id": "10497", "issueType": "Task", "key": "TK-279", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-15T17:43:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Simple tk-authz deny failure logging", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Can you paste in a code sample?  Was it the dependency args list for your service definition that was causing it?", "created": "2015-09-10T09:06:00.000000"}, {"author": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "body": "It was the dependency args list.\n\nYou could reproduce it by just creating 20 dummy services and having another service depend on all of them.", "created": "2015-09-10T09:10:00.000000"}, {"author": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "body": "So 20 actual services:\n\n(defservice service\n  RouterService\n  [Service1\n   Service2\n   Service3\n   Service4\n   Service5\n   Service6\n   Service7\n   Service8\n   Service9\n   Service10\n   Service11\n   Service12\n   Service13\n   Service14\n   Service15\n   Service16\n   Service17\n   Service18\n   Service19\n   Service20]\n  (init [this context]\n    (log/trace \"Initializing Router Service\"))    \n  (stop [this context]\n    (log/trace \"Shutting Down Router service\")        \n    context))", "created": "2015-09-10T09:12:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Discussed this in triage", "created": "2015-09-16T11:24:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924] - Do have a stacktrace for that error that you could share?", "created": "2015-09-16T13:36:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I'm guessing this is hitting Clojure's limitation on number of parameters a function can have.\n\nhttp://stackoverflow.com/questions/2735600/why-is-there-a-limit-of-max-20-parameters-to-a-clojure-function", "created": "2015-09-16T13:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-10T02:38:00.000000", "creator": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@22635f12"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz253z:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "10/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_549993777_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_202807424617"}], "description": "May just be a sign of bad design on my part.  I had a router and schema service that had over 20 models it was depending on, and I got this error: \n\nError refreshing environment: java.lang.RuntimeException: Can't specify more than 20 params\n\nI'm just going to work around it by having the models depend on the router and schema, and insert their values into the router/schema on the model's init, rather than the other way around.  ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10479", "fixedVersions": [], "id": "10479", "issueType": "Bug", "key": "TK-278", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "resolution": "Won't Fix", "resolutionDate": "2022-02-18T17:48:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "There is a 20 parameter limit on services", "timeSpent": "PT0S", "updated": "2022-02-18T17:48:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to tk-authz master at [23ec4f|https://github.com/puppetlabs/trapperkeeper-authorization/commit/23ec4f3ebebb9661536ceb41e6fe1f87c5f3fa02].", "created": "2015-09-08T14:28:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "tk-authz unit test job passed in Jenkins - http://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-authorization_unit-clj_master/14/.\n\nNot sure there's anything worth extra QA review for this one since it doesn't have any user-facing effect that I'm aware of, so just moving this to Done.  /CC [~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] for awareness.", "created": "2015-09-08T14:31:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-05T23:45:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5d558a89"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz22rr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Found when integrating changes from TK-259 w/ Puppet Server"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2783205_*|*_1_*:*_1_*:*_13152_*|*_10007_*:*_1_*:*_222571095_*|*_3_*:*_1_*:*_595503_*|*_5_*:*_1_*:*_0"}], "description": "The work for TK-259 involved having trapperkeeper-authorization use Ring's {{wrap-params}} middleware to parse query parameters out of a request's query string.  {{wrap-params}} also, in the case of a urlencoded form post, will slurp the body of the request - so that the content can be parsed for form parameters - without leaving the original body content around for downstream consumers to use, as needed.\n\nIn Puppet Server, there is code which pre-parses the request body into a string before any Ring param middleware can slurp up the request body, leaving the original string around for consumption as needed within core Ruby Puppet indirector route handling.  See https://github.com/puppetlabs/puppet-server/blob/puppet-server-2.1.1/src/clj/puppetlabs/services/request_handler/request_handler_core.clj#L87-L88.  This was originally done to make Puppet Server backward compatible with Rack and WEBrick around the handling of the request body.  So that this code can continue to function properly, trapperkeeper-authorization should parse the query params in such a way that the body of the request isn't indirectly consumed before Puppet Server request handling code can access it.\n\nThere has been some debate about whether or not it is necessary for Puppet Server to continue providing a string representation of the request body to core Ruby Puppet when the request contains a urlencoded form post payload.  SERVER-594 covers investigating this further.  In the meantime, for backward compatibility, it would be safest for trapperkeeper-authorization to avoid having the request body slurped.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10495", "fixedVersions": [], "id": "10495", "issueType": "Bug", "key": "TK-277", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-08T14:31:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Avoid slurping request body during tk-authorization", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] This doesn't have any particular risk to TK (or anything else) that I can see. Do I misunderstand? Thanks!", "created": "2015-12-21T12:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:5f73e620-a5f5-44a8-a863-f1e0061b987a] you are correct", "created": "2015-12-21T14:00:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "0.1.0 released to clojars.  Leaving this on the board as a reminder to myself to send out an announcement email to the dev list.", "created": "2016-01-09T18:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-09-04T06:26:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6571b10"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-792"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvm7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Dec/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1678949096_*|*_1_*:*_1_*:*_449050130_*|*_3_*:*_1_*:*_30196_*|*_10009_*:*_1_*:*_243861241_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_8892008361"}], "epicLinkSummary": "Metrics improvements", "estimate": "PT0S", "externalId": "10606", "fixedVersions": [], "id": "10606", "issueType": "New Feature", "key": "TK-276", "labels": [], "originalEstimate": "PT0S", "parent": "15326", "parentSummary": "Metrics improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-01-12T14:18:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Clean up and open source the cljs metrics dashboard widgets repo", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-08-31T17:07:00.000000", "creator": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1e25e941"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyofrj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Initially expected to do this work as part of TK-259, which was done this sprint. Changeset is large enough we decided to make it into it's own ticket"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_7985635_*|*_1_*:*_1_*:*_2648566_*|*_10007_*:*_1_*:*_76820737_*|*_3_*:*_1_*:*_178361395_*|*_5_*:*_1_*:*_0"}], "description": "Push the {{path}}, {{method}}, {{type}}, and {{query-params}} keys of the configuration rule down into a new submap keyed under {{:match-request}}.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10478", "fixedVersions": [], "id": "10478", "issueType": "Task", "key": "TK-275", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "resolution": "Fixed", "resolutionDate": "2015-09-03T18:57:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add :match-request subsection to rule", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-08-31T15:17:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4331398e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-288"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xwn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_159854639_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_76833653793"}], "description": "The original work done for the trapperkeeper-authorization library involved invoking the HOCON parser directly from within the library, making all properties of the parsed files available via the resulting HOCON configuration objects.  This included the ability to capture file names and line numbers associated with rule content.\n\nWhile tk-authorization's runtime rule representation still supports the ability to track file names and line numbers, tk-authorization's Trapperkeeper service is currently pulling rules from Trapperkeeper's configuration service.  Trapperkeeper's configuration service does not preserve / passthrough file names and line numbers for settings, and so, the ability to get this information and output into log messages for users (e.g., to help in diagnosing authorization failures) has been lost.\n\nTK-273 was submitted as an enhancement request to allow file names / line numbers for configuration data to be made available to Trapperkeeper services.  Assuming TK-273 were done, this ticket would cover any follow-up work needed to integrate the Trapperkeeper capabilities with trapperkeeper-authorization.\n\n\n\n", "epicLinkSummary": "trapperkeeper-auth improvements", "estimate": "PT0S", "externalId": "10270", "fixedVersions": [], "id": "10270", "issueType": "Task", "key": "TK-274", "labels": [], "originalEstimate": "PT0S", "parent": "10365", "parentSummary": "trapperkeeper-auth improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-07T17:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Restore ability to obtain file names / line numbers for tk-authz rule logging", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-08-31T15:08:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2e8b1f1a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xwv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_160510195_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_77421807560"}], "description": "The HOCON parser supports the ability to preserve the file name and line number associated with each setting/value which is parsed from a configuration file.  Trapperkeeper only preserves the resulting setting names/values in the map that it makes available to services to consume, not that HOCON config object itself and, therefore, not the file names / line numbers that individual settings derive from.  Where possible per the capabilities of the underlying configuration format parser, it would be good to consider some sort of extension to Trapperkeeper which would allow the file names / line numbers per setting to be made available to the consuming service.  This information could then be used by the service to list out the offending file name / line number of a setting which fails validation - a benefit for users in being able to more easily troubleshoot configuration problems. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10199", "fixedVersions": [], "id": "10199", "issueType": "Task", "key": "TK-273", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:47:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Preserve file name / line numbers per configuration setting in Trapperkeeper service config", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to master at [c891fc|https://github.com/puppetlabs/trapperkeeper-authorization/commit/c891fc2b6c47ecc586e5425f52a21178f0085c7e].", "created": "2015-09-04T12:53:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Resolved per QA risk assessment", "created": "2015-09-28T11:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-31T12:21:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5700840e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoefz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_64673131_*|*_1_*:*_1_*:*_170111608_*|*_10007_*:*_1_*:*_11712115_*|*_3_*:*_1_*:*_11030622_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_2066807981_*|*_10006_*:*_1_*:*_90023839"}], "description": "I created a simple tk-authorization rules config which I had expected to result in all incoming requests being denied.  Instead, however, all requests appeared to be allowed instead.\n\nI started with a small variation of the \"With a minimal config of an empty list of rules\" test in the \"authorization_service.test.clj\" file:\n\n{code:clojure}\n(testing \"Denied when deny all\"\n    (let [app (build-ring-handler [{:path \"/\"\n                                    :type \"path\"\n                                    :deny [\"*\"]}])]\n      (let [req (request \"/path/to/foo\" :get \"127.0.0.1\" test-domain-cert)\n            {:keys [status body]} (app req)]\n        (is (= status 403)))))\n{code}\n\nWhen I run this, the assertion that the status code is a 403 fails.  The actual status code ends up being a 200 instead.  Note that if I were to change the {{:deny}} directive to {{:deny \\[\"test.domain.org\"\\]}} instead, a 403 status code would be returned.\n\nI think at least part of the reason for this is that the \"*\" pattern ends up being treated as an \"allow-all\" irrespective of the \"auth-type\" associated with the ACE (Access Control Entry).  See https://github.com/puppetlabs/trapperkeeper-authorization/blob/0.1.1/src/puppetlabs/trapperkeeper/authorization/acl.clj#L90.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10623", "fixedVersions": [], "id": "10623", "issueType": "Bug", "key": "TK-272", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-28T11:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "\"Deny: *\" appears to be treated like \"Allow: *\" for tk-authorization", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to master at 0df013a.  Subsequent Jenkins job ran and passed at http://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-authorization_unit-clj_master/15/.  Moving this to \"testing\".", "created": "2015-09-14T10:39:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Resolving", "created": "2015-09-15T09:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-21T12:05:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2105223b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyotz3:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_29138_*|*_10007_*:*_1_*:*_490996043_*|*_3_*:*_1_*:*_9398604_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_82136798_*|*_10006_*:*_1_*:*_1568045586"}], "description": "For trapperkeeper-authorization rules today, the {{method}} attribute only supports a single value.  For backward-compatibility with how core Puppet auth.conf rules could be defined, however, it would be better for the {{method}} attribute to be able to support either a single value or a list of values.  In the latter case, if the HTTP {{method}} on the request being evaluated were one of the values in the list, the request would be considered a match with respect to the {{method}} attribute.  For example, if {{method}} were set to {{\\[ \"PUT\", \"POST\" \\]}}, a method of \"PUT\" or a method of \"POST\" would be considered a match whereas a method of \"GET\" would not be considered a match.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10621", "fixedVersions": [], "id": "10621", "issueType": "Task", "key": "TK-271", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-15T09:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow \"method\" for a tk-authz rule to support a list or string", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "attachments": [], "comments": [{"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/124", "created": "2015-08-21T03:42:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ping [~accountid:557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e]... this is merged, right?  Is the problem fixed?  Shall we close this ticket out?", "created": "2015-08-26T11:33:00.000000"}, {"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] yeah it is, took my eye off the ball.", "created": "2015-08-27T03:52:00.000000"}, {"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "Merged as 588eb8fb", "created": "2015-08-27T03:53:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e] if you want to do a z-release just file a changelog PR and i'll merge it and release", "created": "2015-08-27T03:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-21T03:30:00.000000", "creator": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1db7237f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz1shr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_519736486_*|*_5_*:*_1_*:*_0"}], "description": "https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/1.4.0/src/puppetlabs/trapperkeeper/services/webserver/experimental/jetty9_websockets.clj#L41-L44 Is not the correct way to extend a protocol when a function has multiple-arities, it stomps over the preceding 1-arity\n\nHave a fix and a test-case for coverage ready to submit", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10493", "fixedVersions": [], "id": "10493", "issueType": "Bug", "key": "TK-270", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "resolution": "Fixed", "resolutionDate": "2015-08-27T03:53:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "1-artity websockets.client/client! broken", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:ad2090d1-8a61-4530-9228-7d89570c23b7", "body": "Isn't the example just a case of the test assertion being checked before the future has resolved?\n\n{code}\n(testing \"thread boundary\"\n  (with-test-logging\n    (let [f (future (clojure.tools.logging/info \"test future\"))\n          _ (deref f)]\n      (is (logged? #\"test future\" :info)))))\n{code}\n\nseems to pass.", "created": "2015-08-20T14:08:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:ad2090d1-8a61-4530-9228-7d89570c23b7] - Yup, that's correct, good catch.  It seems like this problem is actually a bit more subtle than the ticket currently describes, although it's something that we've run into multiple times in testing TK apps.", "created": "2015-08-20T14:13:00.000000"}, {"author": "557058:ad2090d1-8a61-4530-9228-7d89570c23b7", "body": "OK. :) \n\nI just a couple days ago discovered with-test-logging and started using it for our stuff so I'll try to keep an eye on this to learn what the more specific limitations are.", "created": "2015-08-20T14:18:00.000000"}, {"author": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "body": "[~accountid:557058:ad2090d1-8a61-4530-9228-7d89570c23b7] updated with a real failing example :)  If the thread is started during the test, it doesn't work. ", "created": "2015-08-20T14:33:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Here's another example, this time using a test helper from our Jetty library:\n\n{code}\n(with-test-webserver\n  (fn [request]\n    (log/error \"hi\")\n    {:status 200 :body \"here is the body\"})\n  port\n  (slurp (:body (http/get (str \"http://localhost:\" port)))))\n2015-08-20 13:38:54,254 ERROR [p.t.main] hi\n=> \"here is the body\"\n(with-test-logging\n  (with-test-webserver\n    (fn [request]\n      (log/error \"hi\")\n      {:status 200 :body \"here is the body\"})\n    port\n    (slurp (:body (http/get (str \"http://localhost:\" port))))\n    (is (logged? #\"hi\"))))\n\nFAIL in clojure.lang.PersistentList$EmptyList@1 (form-init6874433420588717854.clj:8)\nexpected: \"Exactly one log message matching the pattern 'hi'\"\n  actual: \"0 matches", "created": "2015-08-20T14:46:00.000000"}, {"author": "557058:ad2090d1-8a61-4530-9228-7d89570c23b7", "body": "Is it just a matter of whether or not the *logger-factory* binding is getting conveyed to the new thread? (Which future does to its body automatically.) Using bound-fn in place of fn makes the new example pass it looks like.", "created": "2015-08-20T14:49:00.000000"}, {"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "I lost an amount of hair over this the other week also.\n\nMy investigation got as far as the discovery that {{binding}} creates [thread-local bindings|https://github.com/clojure/clojure/blob/clojure-1.7.0/src/clj/clojure/core.clj#L1853] which explains why bound-fn serves as a workaround in the case of callbacks defined in a test-case, but that won't help for testing that the library code under test is logging correctly.", "created": "2015-08-21T02:38:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:ad2090d1-8a61-4530-9228-7d89570c23b7] - Yeah, once again, good call.  :)  I didn't know that {{future}} did that {{cloneThreadBindingFrame}} voodoo.  That seems like a likely explanation for why the initial example using {{future}} didn't exhibit this behavior.\n\nIt seems like we could just rewrite {{with-test-logging}} to be threadsafe - i.e. perhaps use an atom instead of a thread-local binding - but I haven't actually dug into it enough to say if that approach will work for sure or not.", "created": "2015-08-21T10:44:00.000000"}, {"author": "557058:ad2090d1-8a61-4530-9228-7d89570c23b7", "body": "Maybe replacing {{binding}} with {{with-redefs}} in the helper would work? I know you have to be a little careful with {{with-redefs}} to make sure things get cleaned up properly, but it is supposed to rebind the value for all threads.\n\nEdit: Thing I'm not sure of is whether that's \"all existing threads\" or \"all existing and future threads\"...", "created": "2015-08-21T15:41:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Note that @rbrw's PR #196 seems to fix this.  I'm working on adding explicit test coverage in that PR.", "created": "2015-12-03T14:01:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:4c2994e4-73a9-4e99-971a-6d93d39be223]'s PR has been merged, so this should be fixed in the next release of TK (which will be either 1.1.3 or 1.2.0 depending on what else is in it).", "created": "2015-12-15T09:57:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-20T12:35:00.000000", "creator": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1e160ac5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Highest Test Level", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Unit"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynvl3:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Hack Week!"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1297626514_*|*_1_*:*_1_*:*_514499827_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_38106_*|*_10005_*:*_1_*:*_9588474165"}], "description": "While writing tests that check for log message output we noticed that logging across thread boundaries is not correctly captured.  It should allow assertions against logging generated in services.\n\nTo reproduce:\n\n{code}\n(testing \"threading breaks stuff\"\n    (with-test-logging\n      (let [x (promise)\n            t (.start (Thread. (fn [] (clojure.tools.logging/info \"test thread\")\n                                      (deliver x true))))]\n             (is @x)\n             (is (logged? #\"test thread\" :info))))\n{code}\n\nResults in:\n\n{noformat}\nFAIL in (test-catch-all-logger) (logging_test.clj:28)\nthreading breaks stuff\nexpected: \"Exactly one log message matching the pattern 'test thread'\"\n  actual: \"0 matches; `with-test-logging-debug` may be useful for debugging tests.\"\n{noformat}\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10269", "fixedVersions": [], "id": "10269", "issueType": "Bug", "key": "TK-269", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8", "resolution": "Fixed", "resolutionDate": "2015-12-30T10:26:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "with-test-logging does not work across thread boundaries", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - here's the allow/deny thing that I brought up with you today.  For context, pasting from a separate e-mail thread going around on this...\n\nThe code in trapperkeeper-authorization today attempts to follow what legacy auth.conf has done.  It doesn\u2019t strictly order all \u201cdeny\u201d ACEs before all \u201callow\u201d ACEs for an individual rule.  It does things like having a name which is specified with an \u201cexact\u201d value take precedence over a name specified with an \u201cinexact\u201d value, irrespective of whether the associated directive is \u201callow\u201d or \u201cdeny\u201d.  So, for example, the following ACL...\n\n{noformat}\n  allow: a.mydomain\n  deny: *.mydomain\n{noformat}\n\n\u2026 would result in \u201ca.mydomain\u201d being allowed whereas \u2026\n\n{noformat}\n  allow: *.mydomain\n  deny: a.mydomain\n{noformat}\n\n\u2026 would result in \u201ca.mydomain\u201d being denied.\n\nPUP-4630 documents this phenomenon in legacy auth.conf and this has behavior been inherited thus far in trapperkeeper-authorization.\n\nI\u2019d prefer we change the logic to just make any explicit \u201cdeny\u201d directives take precedence over any \u201callow\u201d ones and throw away the historical ordering based on whether wildcard patterns are used in the entry names, relative lengths of the names, etc.\n\nSo basically, if a rule is considered a match for the request, tk-authz would:\n\n1) See if the certname for the request matches one of the \"deny\" ACEs.  If it does, the result would be \"denied\".\n... else ...\n2) See if the certname for the request matches one of the \"allow\" ACEs.  If it does, the result would be \"allowed\".\n... else ...\n3) The result would be \"denied\".\n\nWhat do you think?  [~accountid:623c08e1562ab90069f8aed4] - also curious what you'd think of us going with this approach?\n\n\n", "created": "2015-09-02T17:14:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "I think this is a nice, easy-to-explain repair. +1. \n\nI'm still in favor of adding a \"pass\" / \"skip\" directive at some point (with the order being deny -> allow -> skip -> default-deny), but even just this would be a clear improvement over existing behavior. ", "created": "2015-09-03T18:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Thanks, [~accountid:623c08e1562ab90069f8aed4].  FWIW, I'm (y) on the idea of adding on some sort of \"skip\" directive at some point and agree with the order of evaluation you proposed.  This came up in some conversations I had with PS and CS as something some customers would like to do once in a while.  I can file a ticket about that.  [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - curious what you think...", "created": "2015-09-03T18:55:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to tk-auth master at [5bf21e|https://github.com/puppetlabs/trapperkeeper-authorization/commit/5bf21e06ecc59158a571831956deb7de6658a2aa].", "created": "2015-10-12T10:56:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "trapperkeeper-authorization tests passed in Jenkins - http://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-authorization_unit-clj_master/25/.  Moving this to testing.", "created": "2015-10-12T11:01:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Tested manually with rule like this:\n{noformat}\n        {\n            match-request: {\n                path: \"/puppet/v3/environments\"\n                type: path\n                method: get\n            }\n            allow: \"*\"\n            deny: \"*\"\n            sort-order: 500\n            name: \"puppetlabs environments\"\n        },\n{noformat}\nValidated on 2015.3.0-rc3-515-g69d6950 in CentOS6.", "created": "2015-10-21T17:40:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] Hey, historical note: I remember the ruby auth.conf implementation seemed like it should work with a rule like that, but if you gave it \"allow: *", "created": "2015-10-22T04:16:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Thanks, [~accountid:623c08e1562ab90069f8aed4], for those test cases.  The behavior you describe for each of those is exactly what I'd expect now with the change having been integrated.  Will defer to [~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] on working those into his test plan.", "created": "2015-10-22T11:29:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:623c08e1562ab90069f8aed4] I would like very much to have the time to test at the level you have described above", "created": "2015-10-22T13:41:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "I managed to fit in checking the case where we\nallow: this node\ndeny: '*'\n\nI've documented the rest of the test cases mentioned by [~accountid:623c08e1562ab90069f8aed4] in Test Rail.  If there is no additional activity on this ticket (even a note saying HOLD THIS OPEN), I'm going to CLOSE this ticket before we end the Emerald sprint on WE Oct 28.", "created": "2015-10-23T17:25:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-18T12:19:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7c38ec57"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyobun:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_82158739_*|*_10007_*:*_1_*:*_508289659_*|*_3_*:*_1_*:*_81181672_*|*_10009_*:*_1_*:*_508912126_*|*_5_*:*_2_*:*_72106256_*|*_10011_*:*_1_*:*_800117418_*|*_10006_*:*_1_*:*_4077080006"}], "description": "This ticket was broken out from a conversation in TK-262.  The ticket would cover investigating how the current implementation of tk-authorization works when it comes to processing the presence of allow and deny directives on the same tk-auth rule.  There is some logic which decides how to prioritize the directives based on whether the directive refers to \"all\", length of the rule, etc.  We'll probably end up needing to dive into this code - https://github.com/puppetlabs/trapperkeeper-authorization/blob/1ac74458d6ee857f0fdcbf198584f635ed0ed1bd/src/puppetlabs/trapperkeeper/authorization/acl.clj#L55-L72.\n\nAt the very least, we should come out of this ticket with some documentation about the current tk-auth behavior, documentation that could be repurposed for later for end users.  We may also decide based upon what we capture that we ultimately want to make some changes to the current implementation.\n\nUPDATE:\n\nBased on the conversation in the comments below, we're going to change the behavior to the following:\n\nIf a rule is considered a match for the request, tk-authz will:\n\n1) See if the certname for the request matches one of the \"deny\" ACEs. If it does, the result would be \"denied\".\n... else ...\n2) See if the certname for the request matches one of the \"allow\" ACEs. If it does, the result would be \"allowed\".\n... else ...\n3) The result would be \"denied\".\n\n\n", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10198", "fixedVersions": [], "id": "10198", "issueType": "Task", "key": "TK-268", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-10-28T11:04:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Deny request when allow and deny ACEs overlap for matched request", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-08-17T02:49:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Scrum Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "PE Core"}, {"fieldName": "Scrum Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Puppet Server"}, {"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Froyo"}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@191080b0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Color", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-color", "value": "ghx-label-1"}, {"fieldName": "Epic Name", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-label", "value": "TK Status Service: Future Improvements"}, {"fieldName": "Epic Status", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-status", "value": "Done"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Issue color", "fieldType": "com.pyxis.greenhopper.jira:jsw-issue-color", "value": "dark_grey"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz1nlb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_205430299772_*|*_6_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10364", "fixedVersions": [], "id": "10364", "issueType": "Epic", "key": "TK-267", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2022-02-18T17:47:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK Status Service: Future Improvements", "timeSpent": "PT0S", "updated": "2022-02-18T17:47:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Ping [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], [~accountid:623c12b6ee1b5a0070293582], [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330], [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df]", "created": "2015-08-14T14:15:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "For rule-id, given that the primary purpose is to map the configuration element to the Puppet catalog model, I propose we rename it to {{rule-name}} or more simply, {{name}}.  It should be a simple string.  If there is a collision on name between two rules the system should error with a clear warning message.  This will simplify the logic in the type and the provider by avoiding the situation where a duplicate resource with different sort-id's could exist.\n\nFor sort-id, the value should be a simple integer.  Duplicates should also be treated as a critical error with a clear error message.  Rules should be sorted in ascending order, the first in sorted-order will become array index 0 on disk in the configuration file.\n\nThose are my thoughts on how this should be implemented, I don't hold any of them terribly strongly.", "created": "2015-08-14T14:35:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "If name/sort-id were combined into a single field then we could detect the duplicate resource / duplicate sort order all in one shot, and not need a separate field for sort order.  Just a thought, but I don't have a strong opinion either way.", "created": "2015-08-17T00:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I tend to think of rule-id/name as being a separate thing from sort-id.\n\nAt least in some scenarios, I could see utility in having a canonical name that could be used in Puppet code to be able to manage a named resource without having to necessarily understand exactly what the order of the rule is relative to other rules.  For example, if there's a common rule designated for managing access to the certificate_status endpoint (which, based, on the user's rule hierarchy would not conflict with any other rules), that endpoint might be named \"certificate status\".  The effective sort order of that rule might get moved around relative to where it is when it first comes into existence.  If I just want to write a Puppet resource which expands the values in the {{allow}} directive for the \"certificate status\" rule to include a new host that I've added to my infrastructure, though, I could see where it could be useful to be able to just identify that rule by its more fixed name, \"certificate status\", rather than have to know in advance what the sort order position the rule is currently in so that the proper rule is selected for modification.\n\nUnlike rule-id/name, I'm not sure whether sort-id is something which needs to be encoded as a separate element into the rule definition.  For example, as [~accountid:623c12b6ee1b5a0070293582] indicated, the sort-id of a rule could be the same as the position of that rule within the rules array for cases where the rules are being managed as a monolithic list in a configuration file.  In terms of a Puppet resource representation of the rule, the rule's position in the monolithic array could be projected directly to/from an integer-based \"sort-id\" attribute.  I worry that by having a separate sort-id field in the rule definition when we're using a monolithic list of rules that it might be confusing.  If the rule appears at list position 0 but the sort-id is hand modified to be 1, is its true position 0 or 1?  I guess if we want to allow users to hand edit the sort-id of a rule by just editing the field in its rule definition rather than actually moving the rule into the intended position in the array that having the sort-id in the file might be valuable but I'd tend not to go for that kind of solution.  Of course, this could be very different if we're talking about file-snippets based configuration.  Presumably in that case we might be representing the sort-id as a leading portion of the snippet file name, e.g., for \"00_my_rule.conf\" the sort-id would effectively be 0 whereas for \"12_my_other_rule.conf\" the sort-id would effectively be 12.  If we were to represent the sort-id of a rule in the file name, though, having it also represented as a field in the rule definition could lead to the same sort of ambiguous situation where a rule could seemingly have two different sort-ids at the same time, based on a user's hand editing.\n\nI like using {{name}} as the name (sans sort order semantics) of a rule as an element captured in the content of the rule.  I also like the idea of a sort-id/order as an \"integer\", as [~accountid:623c12b6ee1b5a0070293582] had suggested.  I wonder if the sort-id/order would be best not to represent as an element in the content of a rule definition, though, and instead just be attribute in the Puppet resource representation, projected from/to the corresponding array position in the monolithic rules representation or from/to some convention in the rule file name in a file-snippets rule representation, if we choose to do that later.\n\nThat said, I, too, do not hold any of these opinions strongly and so am willing to go with whatever solution sounds most sane to others for this.", "created": "2015-08-17T13:33:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "I'm getting lost. Can someone post the latest thinking about what a complete rule looks like?", "created": "2015-08-17T16:40:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Can someone post the latest thinking about what a complete rule looks like?{quote}\n\nSo my thinking was that this would basically look like where we were at the current end of the discussion on TK-260 with the new piece just being a {{name}} embedded as a first-level element in the rule as persisted to disk.  Something like...\n\n{noformat}\n[\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate/\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    allow_unauthenticated: true\n    name: \"ca certificate\"\n  }\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate_status/\n      method: put\n    }\n    type: path\n    allow: [\"console-admin\"]\n    name: \"ca certificate_status\"\n  }\n]\n{noformat}\n\nMight be good for manageability sake to have {{name}} be required and for the presence of any duplicates to represent a schema validation - e.g., for which Puppet Server would throw an error when detected at boot time.\n\nRegarding the \"sort-id\", I was debating whether \"sort-id\" would have to be present in the rule as persisted to disk.  So, for example, the Puppet \"resource\" (in the sense of a \"resource\" being manipulated in a Puppet catalog) would be created from the rule on disk might have a {{sort_order}} of 0 for the \"ca certificate\" rule and 1 for the \"ca certificate_status\" rule.  The {{sort_order}} value, in that case, though, would be dynamically populated based on the position of the element in the array as persisted to disk rather than as a specific attribute value written into the rule on disk.\n\nAgain, though, I'm definitely willing to be overruled on this one.  Just trying to explain my thinking... \n\n\n", "created": "2015-08-17T18:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "One of the main use cases that [~accountid:623c0a337910a200718b9059] and [~accountid:623c12b6ee1b5a0070293582] have been highlighting is to be able to allow the rules to be managed from multiple disparate locations... e.g. the PE installer needs to be able to manage some rules, the user needs to be able to manage some rules in their own puppet code, and the user needs to be able to edit the file by hand to manage rules.\n\nThe rules that are managed by puppet (regardless of module vs. file snippet approach) are going to appear in disparate modules / parts of the catalog, so they're going to have to specify some kind of sort order that allows them to be sorted relative to the other rules coming from other parts of the catalog, and the maintainers of those bits of Puppet code are going to *have* to be aware of the fact that other rules are being managed elsewhere in the catalog, and what the sort order is for the other resources, so that they can choose a sort order that is correct relative to the other rules.\n\nI believe that this makes it absolutely mandatory that the sort order data is captured in the final output on disk", "created": "2015-08-18T03:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}The rules that are managed by puppet (regardless of module vs. file snippet approach) are going to appear in disparate modules / parts of the catalog, so they're going to have to specify some kind of sort order that allows them to be sorted relative to the other rules coming from other parts of the catalog, and the maintainers of those bits of Puppet code are going to have to be aware of the fact that other rules are being managed elsewhere in the catalog, and what the sort order is for the other resources, so that they can choose a sort order that is correct relative to the other rules.{quote}\n\nYeah, I think I get that.  The solutions that I've heard so far seem to revolve around reserving \"ranges\" of sort orders and/or adding free slots between rules to help avoid collisions.  Approaches like (making up numbers):\n\n- Reserve sort orders 1 - 9999 for users\n- Orders 10000 - 20000 for internal Puppet use (e.g., defaults and PE module/installer managed).\n\nAnd for the internal Puppet rules ensure that rules are spaced apart like 10000, 11000, ... so that users might be able to inject rules between the internal Puppet ones if needed in some circumstances.\n\nI'm still skeptical about whether or not we are going to be able to come up with a scheme along these lines which is \"foolproof\" - specifically that parts of the system that want to manage subsets of the rules can move around the relative priorities of rules in those subsets without having to be concerned that another part of the system might invalidate that work.  This might be feasible for cases where the rule definitions are constrained enough, e.g., path regexes that don't overlap much, that the subsets can be managed independently.  So maybe that's enough of a compelling reason then to facilitate this kind of approach?  I do agree that if we want to enable these kinds of approaches that having the sort_id/order encoded into the rule as an extra field/element will be necessary, especially for the monolithic rule array on disk that we're planning on going with for the initial release.\n\nIt sounds like there's support for the idea of separating sort_order/id and rule-id/name into two discrete fields in the rule definition, so what if we went a format like this (actual values purely meant to be representative)?\n\n{noformat}\n[\n  {\n    match-request: {\n      path: /puppet-ca/v1/certificate/\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    allow_unauthenticated: true\n    name: \"ca certificate\"\n    sort-order: 100\n  },\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate_status/\n      method: put\n    }\n    type: path\n    allow: [\"console-admin\"]\n    name: \"ca certificate_status\"\n    sort-order: 200\n  }\n]\n{noformat}\n\nAssuming we do want to go with this, a couple of follow-up questions I have are:\n\n1) What should we do in tk-auth if, when reading the rules back from disk, we find {{sort-order}} values that aren't incrementing from one array element to the next one (e.g., the rule at array element one has a {{sort-order}} of 100 but the rule at array element two has a {{sort-order}} of 99)?\n\nShould we, as I think [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] may have suggested at one point, just have tk-auth reorder the rules in memory based on the value in the {{sort-order}} field on disk - essentially making the position that the rule appears in the array on disk irrelevant?  Or, instead, do we assume that this may have happened because of a user/module management error and should just throw an error - with a good explanatory message about what was found and what needs to be fixed - at bootup of the Clojure application?\n\nI don't have a strong opinion on this so am willing to defer to others.\n\n2) How do we want to have the {{sort-order}} set for the internal Puppet rules?  Do we want to have them be in some range - maybe \"lower\" is better in order to give user rules priority?\n\nI'd definitely like to get [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330]'s feedback on all of this.\n\n\n\n\n\n\n\n\n\n\n", "created": "2015-08-18T11:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}Approaches like (making up numbers):\n\n    Reserve sort orders 1 - 9999 for users\n    Orders 10000 - 20000 for internal Puppet use (e.g., defaults and PE module/installer managed).{quote}\n\nI'm not quite sure whether it makes sense to try to reserve some ranges for users vs. others for PE, because it seems like the sort order for any given rule is going to have to be evaluated entirely on a per-rule basis, to make sure that it slots in in the correct place relative to all of the other rules.  (This seems like a tricky thing to deal with regardless of single-file vs. snippets approach.)\n\n{quote}And for the internal Puppet rules ensure that rules are spaced apart like 10000, 11000, ... so that users might be able to inject rules between the internal Puppet ones if needed in some circumstances.{quote}\n\nThis I do think will be important.  Also, we probably want to try to write the pe modules so that whatever they are using as their default sort order for any given rule, the user could override it via hiera or something?\n\n{quote}What should we do in tk-auth if, when reading the rules back from disk, we find sort-order values that aren't incrementing from one array element to the next one{quote}\n\nSo, if they're using the (proposed) module (which I think would always be the case in PE), then the module will sort the rules on every agent run and this situation would be self-remediating.\n\nI think my recommendation in this situation would be to have the service tolerate the out-of-order rules and sort them properly, but log a loud warning message about it (and maybe even mention that the puppet module might kindly re-sort it for you)... but I don't have too strong of an opinion about it either.\n", "created": "2015-08-19T02:13:00.000000"}, {"author": "557058:252602f6-56c9-47a2-a176-2c9c57106330", "body": "Catching up here...I agree that name and sort-order should be separate fields.\n\nAnd it makes sense to space the sort order around different rules to allow users to inject other rules in between.  Seems like that would just depend on the sort-orders we define in the puppet_enterprise module for these resources.  We could certainly have parameters for the sort-orders for hiera overrides, although if we space the numbers out sufficiently, this may not be too critical", "created": "2015-08-19T09:50:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Is \"name\" just a friendly human-readable tag for the rule?", "created": "2015-08-19T11:12:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "\"name\" is something that we'd map onto each Puppet \"rule\" resource that would map to one of the rules.  So, for example, you might envision that a rule definition in the configuration file which looks like this ...\n\n{noformat}\n[\n  {\n    match-request: {\n      path: /puppet-ca/v1/certificate/\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    name: \"ca certificate\"\n    sort-order: 100\n  },\n...\n{noformat}\n\n... could project into a Puppet resource which looks like this ...\n\n{noformat}\ntk_auth_rule { \"ca certificate\":\n   match-request => { \n      \"path\" => \"/puppet-ca/v1/certificate/\",\n      \"method\" => \"get\"\n   }\n   \"type\" => \"path\",\n   \"allow\" => [\"*\"],\n   \"sort-order\" => 100\n}\n{noformat}\n\nSERVER-850 was where I was hoping we might be able to capture more of the thoughts around the Puppet \"rule\" resource definition.  Mainly just wanted to include the example here to show how we were thinking it might be used.\n", "created": "2015-08-19T12:52:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Hm, in reading back through this discussion, it seems like:\n\n* low numbers should come first\n* there should be an upper bound to the range that isn't something BIGNUM, i'd suggest 3 digits.\n* i do not think duplicate {{sort-order}} rules should be an error. It just means that they are non-overlapping paths and the order of evaluation doesn't matter. \n* range reservation adds a lot of visual and mental complexity\n\nIn fact, I would propose that, for example, all of the default rules (which do not overlap paths) would have the same neutrally-weighted sort id (like \"50\"), as would any rule inserted without a specific order. That way the main thing users adding their own rules would need to decide is (and let's be clear, this is not something tons of users do) is whether it:\n\n* must come before one of the default rules and therefore needs a number less than 50.\n* doesn't matter where it goes, and therefore doesn't need a specific sort order\n* must come after the default rules (but before a \"999-Implicit-Deny-Rule\") and therefore should be >50.\n\nJust thinking through this in the hopes of walking back some complexity.", "created": "2015-08-19T17:56:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "An additional thought struck me w/r/t the logging section: if we have a 'name' component, when a request is matched against the rule, that name should be included in a debug log message on the server and (for deny responses) potentially returned in the error response so the agent sees something like: \"403 forbidden - auth rule 'catalog_match' denied\". Not a must-have hard requirement, but something to think about as implementation rolls around. (I don't think this is a risky information disclosure vulnerability because you don't show the pattern match, just the ID.)", "created": "2015-08-20T15:22:00.000000"}, {"author": "557058:252602f6-56c9-47a2-a176-2c9c57106330", "body": "Okay, so, sort-order is optional, and everything defaults to 50.  Would we sort on [sort-order, name]?\n\nSo if you add a rule without sort-order that has an overlapping path, is that an error?  I would vote yes.\n\nOr do we just re-sort to [sort-order, name] and that's the authorization you get until you correctly supply a sort order to bump it ahead or behind the default PE rules?  Assuming physical order won out in sort-order ties.", "created": "2015-08-20T15:55:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I'm generally good with the suggestions in [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]'s last couple of comments.  A few follow-ups in-lined below...\n\n{quote}there should be an upper bound to the range that isn't something BIGNUM, i'd suggest 3 digits.\nIn fact, I would propose that, for example, all of the default rules (which do not overlap paths) would have the same neutrally-weighted sort id (like \"50\")\nOkay, so, sort-order is optional, and everything defaults to 50.\nSo if you add a rule without sort-order that has an overlapping path, is that an error? I would vote yes.{quote}\n\nIf we're going to have an upper bound for the range be 3 digits, should we have the sort order for the default rules be about right in the middle of that - i.e., 500?  That way users would have an equal number of priorities for slotting rules in front of and/or behind the default ones.\n\n[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], were you suggesting that sort order be optional for a rule or just that by convention the default ones would be explicitly specified to be at a \"neutrally-weighted\" position?  I still tend to think it would be better to make sort order a required field - to force users to think about where they want rules to be evaluated relative to other rules - even if, by convention, they might choose to use the same \"neutrally-weighted\" position that our default rules would.\n\nI'd definitely not like to try to get into trying to determine what paths overlap and throwing errors in those cases.\n\n{quote}Would we sort on \\[sort-order, name\\]?{quote}\n\nI'd prefer the behavior to be that we would sort on the sort order only, and not secondarily on name - at least in terms of how the rules are evaluated by trapperkeeper-authorization.  We may still want to sort by sort order, then by name in the Puppet provider so that we don't run the risk of rules moving around in the file on disk arbitrarily from one Puppet run to the next.  I'd mostly be concerned about users relying upon the secondary sort by name to try to control the order in which rules are evaluated when they should just be using the sort order instead.\n\n{quote}An additional thought struck me w/r/t the logging section: if we have a 'name' component, when a request is matched against the rule, that name should be included in a debug log message on the server and (for deny responses) potentially returned in the error response so the agent sees something like: \"403 forbidden - auth rule 'catalog_match' denied\". Not a must-have hard requirement, but something to think about as implementation rolls around. (I don't think this is a risky information disclosure vulnerability because you don't show the pattern match, just the ID.){quote}\n\nThis is a good thing to think about.  Especially where we may not have the ability to identify rules by position in the rules.conf for the first release, \"name\" would seem like a good secondary identifier.  I think at a minimum that if we were to consider including the name in any log messages or HTTP responses that we'd need to clearly document that to users so that they would take extra-special care as to what kind of content they'd be putting into the name.  i.e., names like \"bob gets access to everything\" could be a really dangerous thing to have leak out.  What if we were to just have the name logged in the server logs but not in the HTTP response - at least making it much less likely that a nefarious client might be able to glean something from the name which it could use for an attack?\n\n--\n\nI don't have super-strong opinions on a number of these points.  Curious what you think on these, [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0].\n\n\n", "created": "2015-08-24T10:15:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}I'd prefer the behavior to be that we would sort on the sort order only, and not secondarily on name - at least in terms of how the rules are evaluated by trapperkeeper-authorization.{quote}\n\nI'm rethinking this a bit now.  I know in some offline discussions that we'd talked about a non-deterministic ordering of rules weighted per the same {{sort-order}} as being sufficient, that users detecting a problem with that would just need to adjust the relative sort-orders of the rules to achieve the behavior that they want.  If we don't have a deterministic order in the implementation, though, users might see a different result from one authorization attempt vs. another for cases where rule paths overlap for equal sort-orders.  That would seem like a really bad thing.  Given that we may still eventually support the ability for individual rules to live in different files and that we'll want to enforce a uniqueness check on the {{name}} field, the {{name}} field would seem like a logical field on which to do a secondary sort.\n\nSo, I'd be in favor of going with a strategy of sorting by {{sort-order}} then by {{name}} for equal {{sort-order}} values.  Since the secondary sort by {{name}} would just be for consistency / correctness, I'd suggest that the {{name}} sort just be a lexicographic sort based on Unicode values - essentially a \"binary\" sort, not considering locale.  This should hopefully simplify the implementation a bit.  In user-facing documentation, I think it would make sense to cover how the sorting is done but advise that the {{name}} should be considered a fixed value for the life of a rule, for manageability purposes, and that ordering between rules should be controlled via {{sort-order}} values in the rules.", "created": "2015-09-01T18:45:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "So, rolling up a few comments from earlier (including what I believe I've heard from some offline discussions):\n\n* Valid range for sort-order is 1 to 999.  The presence of any sort-order values in a rule outside of this range will be handled as a service startup failure (with an appropriate error message).\n* A block in the middle of that range (maybe from 400 to 600?) is reserved for PuppetLabs use.  This would include default rules in packaging (for OSS) and the PE module managed rules (for PE).  Users would then have the block from 1 - 399 for inserting rules in front of (higher priority than) PuppetLabs ones and from 601 - 999 for putting rules after (lower priority than) the PuppetLabs ones.\n* sort-order is required to exist in rule definition in the auth.conf file.  The Puppet type/provider that manages the sort-order may populate a default for a rule when one is not set on the associated Puppet resource.  This default would be in the 1 - 399 range (maybe 200?), assuming that users are most likely to want their custom rules to be honored ahead of any PuppetLabs ones.  The absence of a sort-order will be handed as a service startup failure (with an appropriate error message).\n* PuppetLabs rules, where non-conflicting, will conventionally use a neutrally-weighted sort-order in the PL-reserved range - maybe 500, assuming the range scheme described earlier?\n* The run-time service implementation will not assume that the rules to be loaded have been pre-ordered in the auth.conf file on disk.  Instead, it will order them by sort-order primarily, then lexicographically by {{name}} for equal sort-orders.  The same sort-order value can be present across multiple rules.  Any duplicate {{name}} values across rules will result in a service startup failure, with an appropriate error message telling the user what is wrong. \n\nDoes all of the above sound reasonable?  [~accountid:623c0a337910a200718b9059]?  [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330]?", "created": "2015-09-02T14:18:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Great summary Jeremy - that's both an accurate summary of the discussion to date and comes to good conclusions for the questions that were open. ", "created": "2015-09-02T14:56:00.000000"}, {"author": "557058:252602f6-56c9-47a2-a176-2c9c57106330", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] Yes, that's very clear", "created": "2015-09-02T17:52:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}The run-time service implementation will not assume that the rules to be loaded have been pre-ordered in the auth.conf file on disk. Instead, it will order them by sort-order primarily, then lexicographically by name for equal sort-orders. The same sort-order value can be present across multiple rules. Any duplicate name values across rules will result in a service startup failure, with an appropriate error message telling the user what is wrong.{quote}\n\nThis sounds perfectly reasonable to me, but it seems like there is *some* value in saying that the best practice is to have that file ordered properly, so that it's easy to read through and reason about... so, would it be acceptable for us to say:\n\n* When the puppet module is managing the file it will always sort the rules properly? and\n* When the service parses the file, it will log a warning if the rules are not sorted in the file?", "created": "2015-09-03T01:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}so, would it be acceptable for us to say:\nWhen the puppet module is managing the file it will always sort the rules properly? and\nWhen the service parses the file, it will log a warning if the rules are not sorted in the file?{quote}\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - thanks, agree with this.  I've updated the description with a roll-up of this discussion thread, including these two suggestions.", "created": "2015-09-09T10:19:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Ping [~accountid:557058:31c596d1-7e27-4c91-bc18-1254edb3caab]", "created": "2015-09-09T15:18:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Related to [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]'s suggestion about including the \"name\" in the log message, I created a new ticket covering the log message - TK-279.", "created": "2015-09-10T16:38:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to tk-authz master at [2bb2aa|https://github.com/puppetlabs/trapperkeeper-authorization/commit/2bb2aa9d2830d2b3d7f6baea367fd2dbbbfdbfe8].", "created": "2015-09-14T17:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-14T14:14:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4db3812c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz22rz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth allowed"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_5913310_*|*_1_*:*_1_*:*_420884216_*|*_10007_*:*_1_*:*_340651500_*|*_3_*:*_1_*:*_183630377_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1743298793"}], "description": "We should consider the possibility of adding an element to the definition of a tk-auth rule which could be used for identification when managing the content populated into a rule on disk.  A couple of options:\n\n* 'rule-id' - Just a simple id that could be used to identify a specific instance of a rule, e.g., to allow for a rule to be mapped to a 'puppet' resource to be applied from a catalog.\n\n* 'sort-id' - Similar to a 'rule-id' in terms of providing uniqueness but could additionally be used for establishing the order in which tk-auth should evaluate a rule relative to other rules when authorizing access to a URI.  The 'sort-id' could provide users with the ability to indicate how tk-auth could recompose the rules into its ordered list in memory without necessarily imposing that the actual representation of the rule on disk follow a specific top-to-bottom order (e.g., that if all rules were represented in an array in a single file on disk that rules wouldn't need to appear top-to-bottom in array element position if the 'sort-id' were used as an aid by tk-auth to reorder as necessary when composing rules in memory).\n\nAdditional thought will need to be put into how such an 'id' would be used by whatever mechanisms are used to manage rule content.  This may end up being an implementation ticket but exists for now to capture discussion on the topic.\n\n---\n\nh4. Roll-up Update from Discussion Below\n\nh5. Service Implementation Notes\n\nWe're going to add two new elements to a rule.  Both of these elements will be required for every rule.  The absence of a value for any rule will result in a service startup failure.\n\n- 'name' - String used to identify a specific instance of a rule.  Will map to the 'namevar' for the Puppet rule resource that the tk-auth Puppet module will allow users to manage.  \"name\" values must be unique across rules.  Any duplicate name values will result in a service startup failure.  (We should also research whether there are any specific restrictions on allowed characters in a Puppet resource's 'namevar'.  If such restrictions exist, the service implementation should fail at startup if any rule it loads has a 'name' value which violates these restrictions.)\n\n- 'sort-order' - Numeric value indicating the order in which one rule is to be processed relative to other rules.  Rules with lower numbered 'sort-order' values will be processed before rules with higher numbered 'sort-order' values.  The valid range for sort-order is 1 to 999. The presence of any sort-order values in a rule outside of this range will be handled as a service startup failure.  Unlike 'name' values, the same 'sort-order' value may be used by more than one rule.\n\nThe run-time service implementation will not assume that the rules to be loaded have been pre-ordered in the auth.conf file on disk. Instead, it will order them by sort-order primarily, then lexicographically by name for equal sort-orders.  When the service parses the file, it will log a warning if the rules are not in ascending sort-order in the file on disk.\n\nFor any cases where the service implementation enforces a startup failure, an appropriate error message advising the user what the problem is and how to fix it should be logged.\n\nh5. Notes on sort-order Usage\n\nA block in the middle of that range -- from 400 to 600 -- is reserved for PuppetLabs use. This would include default rules in packaging (for OSS) and the PE module managed rules (for PE). Users would then have the block from 1 - 399 for inserting rules in front of (higher priority than) PuppetLabs ones and from 601 - 999 for putting rules after (lower priority than) the PuppetLabs ones.\n \nEven though 'sort-order' will be required to exist in the auth.conf rule definition, the Puppet type/provider that manages the sort-order may populate a default for a rule when one is not set on the associated Puppet resource. This default would be 200, assuming that users are most likely to want their custom rules to be honored ahead of any PuppetLabs ones.  Even though the service implementation will be able to tolerate rules in the file on disk not being organized by sort-order, the module should organize the rules by sort-order when it is populating the file.\n\nPuppetLabs rules, where non-conflicting, will conventionally use a neutrally-weighted sort-order in the PL-reserved range - 500.\n\n\n\n\n\n\n\n\n", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10521", "fixedVersions": [], "id": "10521", "issueType": "Task", "key": "TK-266", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-14T18:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add 'name' and 'sort-order' to tk-auth rules definition", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Are there other query parameters that could be in the array? I can see your position about losing generic applicability, but on the other hand {{environment}} is so fundamental to Puppet's operation that unless there are a few other high-profile options I would suggest promoting it to first-class key status would be appropriate.", "created": "2015-08-10T18:27:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "If we're just talking about the existing Puppet HTTP APIs, it seems pretty unlikely that you'd add anything other than {{environment}}.  I think there are some APIs that the puppet agent will call with other query params - e.g., source_permissions or ignore for file_metadata - but those seem highly dubious as something a user would want to create an authorization rule around.  This may have more general utility as authorization would come into play for the HTTP APIs in other Clojure services, not sure.  If we did end up making {{environment}} a top-level setting, it would seem a little out of place where tk-authorization could be applied to other services besides Puppet Server in the future.  [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - anything else you'd like to add here?", "created": "2015-08-10T18:54:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I would invite [~accountid:557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52] and [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] to weigh in here.  IMO, medium-to-long-term goals for this service include:\n\n* applicability to other clojure HTTP endpoints besides the puppet master, where \"environment\" is probably, often, not meaningful\n* ability to integrate this authorization layer with RBAC in the future, as [~accountid:557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52], [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9], et al have mentioned / weighed in on on other tickets\n\nIf we think that for most/all other use-cases outside of the puppet master, 'environment' will still be a meaningful criteria, and/or can be ignored safely, I guess I don't have a problem with changing the name of this service to 'tk-puppet-authorization' and including 'environment' as a top-level construct, but that seems like it might be a bit of a stretch.\n\nEven within the puppet master, we now have endpoints (such as the CA endpoints, the admin endpoints, et al) where the concept of \"environment\" doesn't make much sense... so if we were going to include it as a top-level construct we'd have to decide what the behavior should be if you specify it for an endpoint that doesn't know anything about environments...", "created": "2015-08-11T03:33:00.000000"}, {"author": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "body": "I actually think I like the complex version since it makes it clear to the user how the filter is implemented. There is no magic around application knowledge of environment just filtering on a query param. It also ensures that the implementation fits neatly in the middleware stack based purely on the raw request. The downside is non-environment endpoints would have to reject requests with an environment param but that seems simpler than adding an environment to the request object before tk-auth\n\nIf 'environment' is magic it's going to be difficult to add this in to something like code-manager where environment isn't a query param and application logic would have to be moved high in the middleware stack. For example some requests to code manager won't have a single environment and the environments won't be known until pretty late in the request cycle after the control repo is fetched.", "created": "2015-08-11T09:40:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}The downside is non-environment endpoints would have to reject requests with an environment param but that seems simpler than adding an environment to the request object before tk-auth{quote}\n\nIn case this wasn't clear from the proposal, I wasn't thinking that \"environment\" would be a fixed element that would need to appear in the {{query-params}} for a rule.  I was thinking that {{query-params}} itself would be optional.  For example, as [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] had mentioned, the concept of \"environment\" doesn't apply to the CA endpoints.  So you might envision rules like the following:\n\n{noformat}\n  [\n    {\n      path: /puppet-ca/v1/certificate_status\n      type: path\n      allow: [ \"my-ca-admin\" ]\n    },\n    {\n      path: ^/puppet/v3/node/([^/]+)$\n      type: regex\n      allow: [ \"$1\" ]\n      query-params: {\n        \"environment\": \"production|test\"\n      }\n    }\n]\n{noformat}\n\nSo for this case, requests to the \"certificate_status\" endpoint wouldn't have to consider an environment {{query-params}} since it is irrelevant to that endpoint.  Requests to the \"node\" endpoint, in this case, would consider the \"environment\" {{query-params}}.  This would be optional, as well, though.  For example, if the node rule were defined like this...\n\n{noformat}\n{\n  path: ^/puppet/v3/node/([^/]+)$\n  type: regex\n  allow: [ \"$1\" ]\n}\n{noformat}\n\n... then a node making a request for its own \"node\" endpoint would be allowed irrespective of the environment it were including as a {{query-params}}.  This would maintain compatibility with \"environment\" as a top-level parameter in Ruby Puppet auth.conf, which is currently optional.\n", "created": "2015-08-11T10:30:00.000000"}, {"author": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "body": "I think we're more or less in agreement.\n\nMy concern is what happens when I intend to give dev boxes full access to their environment but accidentally write an insecure rule:\n\n[updated to fix sloppy copy paste]\n{noformat}\n{ path: ^/*\n  allow: dev.*.example.com\n  query-param: { environment: \"dev\" }}\n{noformat}\n\nIf code-manager and the CA don't reject requests with the environment query-param I've given devs access to deploy any environment with code-manager and full access to the CA. It would be possible to tell tk-auth to ignore those rules instead of rejecting but that seems harder to provide good errors around. Perhaps this is just a documentation problem.\n\nAt least with the generalized syntax it's kind of clear what happening. If environment is a top level setting it's a lot harder to understand what it will do and why some services honor it and others don't. It's bad enough for the CA which isn't environment aware but it would be really confusing for code-manager which does use environments and will have environment based permissions in RBAC that aren't based on a query-param.\n\n[updated to fix sloppy copy/paste]\n{noformat}\n{ path: ^/*\n  allow: dev.*.example.com\n  environment: \"dev\" }\n{noformat}", "created": "2015-08-11T11:05:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Fair enough, I'm convinced. Thanks for the thoughtful discussion. ", "created": "2015-08-11T11:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}My concern is what happens when I intend to give dev boxes full access to their environment but accidentally write an insecure rule: ... If code-manager and the CA don't reject requests with the environment query-param I've given devs access to deploy any environment with code-manager and full access to the CA.{quote}\n\nI think in this case that the \"$1\" wouldn't match since the path doesn't include a regex group that it would be matched against?\n\nI'm not sure if this scenario is any different than what you'd see if trying to create a similar rule with \"environment\" as a top-level setting in auth.conf in core Puppet today...\n\nI agree with your other points about the generalized syntax with {{query-param}} being much more self-describing about exactly what the rule will be evaluating the incoming URL against for a match - no magic behaviors - and that that ultimately seems like a good thing.", "created": "2015-08-11T11:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Fair enough, I'm convinced. Thanks for the thoughtful discussion.{quote}\n\n[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - Awesome, thanks much.", "created": "2015-08-11T12:01:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I had been thinking that the matching trapperkeeper-authorization would do here would be fairly \"dumb\" as to whether or not the backing service for an endpoint would actually use a specific {{query-param}} or not.\n\nSo if you had a rule like this defined...\n\n{noformat}\n{ \n  path: ^/*\n  type: regex  \n  allow: dev.*.example.com\n  query-param: { environment: \"dev\" }\n}\n{noformat}\n\n...which was listed before/above any other rule which controlled access to any of the CA endpoints, a request to \"/puppet-ca/v1/certificate_status?environment=production\" or \"/puppet-ca/v1/certificate_status\" would not be considered a rule match and so the result of authorization would depend upon the outcome of evaluating a lower-priority rule that may match or, if none, deny by default.  If a request were made to \"/puppet-ca/v1/certificate_status?environment=dev\" from \"dev.something.example.com\" - even though the \"certificate_status\" endpoint doesn't actually use the \"environment\" query parameter - the request would be considered a match to the rule and ultimately be allowed.\n\nA rule covering all paths against the \"environment\" query-param may not be what the user would want for that reason.  But I think that by showing that the \"environment\" is matched from the {{query-param}} on the URI, I'd hope that the results could be understood.\n\n[~accountid:623c12b6ee1b5a0070293582] - would appreciate any sanity check you may want to add to this...\n", "created": "2015-08-11T15:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "One distinction I should bring up here about the initial proposal that it sounds like was not clear, at least to some, previously:\n\n{noformat}\n    query-param: {\n       \"environment\": \"production|test\"\n    }\n{noformat}\n\nIn this case, I was expecting the value for the \"environment\" to \"always\" be a regular expression.  This would be a little different than how the match for the URI \"path\" itself is expressed, where there is a distinction made between literal match, \"type: path\", vs. a regex, \"type: regex\".  We could make this a little more complex, but arguably consistent, with something like:\n\n{noformat}\nquery-param: {\n  \"environment\": {\n    type: regex,\n    value: \"production|test\"\n  }\n}\n{noformat}\n\nvs.\n\n{noformat}\nquery-param: {\n   \"environment\": {\n     type: literal,\n     value: \"production\"\n   }\n}\n{noformat}\n\nI believe [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] doesn't like the extra complexity that this would add to the definition, though?\n\n--\n\nAlternatively, we could also say that we only support a single literal match for a {{query-param}}, no regex values.  This would presumably require a lot of extra rules to have to be created though - one per environment to be matched.  Note that the Puppet auth.conf {{environment}} directive allowed for multiple environments to be specified in the definition of a single rule - with \"comma\" as a delimiter.\n\nOr we could turn the value into a list of literal values with an implicit OR join.  For example:\n\n{noformat}\nquery-param: {\n   \"environment\": {\n     \"production\",\n     \"test\"\n   }\n}\n{noformat}\n\nI'd been thinking that having it always be a regex would give the most flexibility but hopefully be concise enough.  That said, I'm definitely open to opinions from usability experts on the best approach.\n\n[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df], [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]?\n", "created": "2015-08-13T13:34:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "I think regex all the time is a good option. It'd be nice to have a signifier that these plus the path matches are both regexes (like requiring opening and terminating forward slashes {{environment: /this-is-obviously|regex/}} but I don't feel super strongly about that and would defer to JD for existing UX pattern", "created": "2015-08-14T11:38:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "+1 to all-singing-all-dancing regex.", "created": "2015-08-14T12:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df], So you want us to require that the regex have a leading and trailing \"/\" and use the part in the middle as the regex to be used for matching, like in [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]'s example?  Any other restrictions in format that we should be following?", "created": "2015-08-14T13:02:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "If the {{environment}} regex needs to be enclosed in a pair of {{/}}, then it's strange that the other known regex in the format (the {{path}} one) isn't enclosed also in a pair of {{/}}. \nBut using a pair of {{/}} in this latter case will force everybody to escape the various {{/}} appearing in the url path which isn't a very good idea :)", "created": "2015-08-14T14:18:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "How often would {{environment}} need to be something more complex than an OR?", "created": "2015-08-17T16:31:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "A request cannot exist in two environments at the same time, so I don't think environment can be an {{AND}}.", "created": "2015-08-17T17:54:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I believe the {{environment}} keyword in core Puppet's auth.conf only allowed for two variations:\n\n* Implicit \"*\" (all environments)\n* Literal list of environments (no regexs) to which the rule would apply, implicitly an OR join (e.g., {{production}} OR {{test}}, expressed in configuration as \"production,test\")\n\nI think omitting the {{environment}} from {{query-params}} entirely would be equivalent to the implicit \"*\".\n\nIf we just had something like this...\n\n{noformat}\nquery-params: {\n   \"environment\": [\n     \"production\",\n     \"test\"\n   ]\n}\n{noformat}\n\n...where no regexes were involved, I think we'd have backward compatible behavior with what one could get with core Puppet's auth.conf for {{environment}}.\n\nI'd only suggested the regex since it seemed like it would be the most flexible default and might help avoid us having to get into discussions about what kinds of situations we might see with future query-params besides {{environment}} which could be used with this approach.  All of that is clearly speculative, though, so, [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df], if you have a strong opinion about this which meets the minimal requirements for backward compatibility without constraining the ability to reuse this concept for other services (i.e., that don't have an innate concept of Puppet environment), I'm inclined to go with whatever you recommend.\n", "created": "2015-08-17T18:05:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I would again suggest pinging other potential future consumers of this endpoint when asking about possible use-cases for the query-param stuff", "created": "2015-08-18T03:45:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "I don't have any", "created": "2015-08-18T11:34:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Hm. I think I'm inclined to say no regex for environment, unless we need to deal with a highly dynamic set of envs. I think the last syntax [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] poses is clean and simple to understand.", "created": "2015-08-19T11:22:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] When the user only wants a single value in the \"environment\", should we still require it to be a list (in this case, of only 1 element)?\n\nFor other TK config work in the past, we've tended to require the list always.\nBut, there are other settings in tk-authz that support either a single string or a list of strings.", "created": "2015-08-24T13:10:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Naturally, I'd like the latter, and not require the list unless you have more than one item to list.", "created": "2015-08-24T15:48:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "It's possible that an HTTP request can come in with multiple occurrences of the same parameter, something like:\n{code}\nhttp://host:1234/endpoint?foo=this&foo=that\n{code}\n\nWe'll need to handle this scenario in the code, so we don't assume there will only ever be a single value for any parameter", "created": "2015-08-26T15:33:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "FYI during implementation we decided to pluralize the query parameter section to {{query-params}}.\n\nI updated the ticket body to reflect this, as well as some of the examples in the comments.", "created": "2015-08-31T16:51:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to tk-authz master at [e9cdbc|https://github.com/puppetlabs/trapperkeeper-authorization/commit/e9cdbcf8e2b88ea85b76ea9e50de493d310c5d1f].", "created": "2015-09-02T16:47:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-10T12:34:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@59477169"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyogy7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_784996_*|*_1_*:*_1_*:*_169519796_*|*_10007_*:*_1_*:*_178093117_*|*_3_*:*_1_*:*_861209433_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_786962347"}], "description": "auth.conf in Ruby Puppet supported the ability to specify that a rule only applied to a specific \"environment\": https://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html#environment.  As it currently stands, however, trapperkeeper-authorization does not support the ability to specify \"environment\" as a rule constraint.  For backward compatibility, it would seem that we would need to come up with a way to add \"environment\" specification to a rule.  If we do so, however, we should come up with a more generic way for doing so than by making \"environment\" an explicit element in a rule definition since doing so would make tk-authorization much less generic.  \"environment\" may not have the same meaning when tk-authorization is applied to other Clojure projects in the future.\n\nOne way we could do this would be to add a \"query-params\" element to a rule definition.  For example, a rule might have:\n\n{noformat}\n{\n    path: /path/to/resource\n    type: path\n    allow: [ \"*.domain.org\", \"*.test.com\" ]\n    query-params: {\n       \"environment\": \"production|test\"\n    }\n  }\n{noformat}\n\n... where {{query-params}} would be a map of the names of query-params at the end of a URI which should be matched against the regex provided as a value for each name.  Using this example, an attempt to access \"http://127.0.0.1/path/to/resource?environment=test\" as user \"joe.domain.org\" would be allowed whereas an attempt to access \"http://127.0.0.1/path/to/resource?environment=other\" or \"http://127.0.0.1/path/to/resource?something=else\" would be denied.  If we went with something like this, it might make sense when multiple {{query-params}} settings are specified for the join condition to be an \"AND\", i.e., that each param specified would have to match in order for the overall rule to be applied.\n\nFirst, we should establish whether or not providing for a way to match on \"environment\" is a backward compatibility target from Ruby Puppet auth.conf that we need to meet for tk-auth and Puppet Server.  [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] or [~accountid:70121:caffdbd6-f73d-4ae9-9c82-c4badf061584] - could you weigh in on this?  If maintaining support for this is not a requirement, we may consider not supporting this feature at all.\n", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10197", "fixedVersions": [], "id": "10197", "issueType": "Task", "key": "TK-259", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-02T15:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-authorization support for specifying \"environment\" in rule", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] Here's my thinking for what all work would be done for this ticket:\n\n1) Create the basic shell of the new Trapperkeeper service - namespace with implementation per the defservice signature, etc.\n\n2) In the init function implementation of the service:\n\n- pull in a \"rules\" vector from the \"authorization\" Trapperkeeper configuration section {{(:ConfigService get-config)}},\n- do any initial structural validation that seems appropriate\n- transform that structure into the working {{puppetlabs.trapperkeeper.authorization.rules.Rules}} vector that \"trapperkeeper-authorization\" will need to use for its {{allowed?}} checks later on\n- store the {{Rules}} vector into the service context\n\n3) In a new protocol function for the service, take in a {{handler}} as an argument and return back a Ring middleware function.  The Ring middleware function's implementation could be pretty close to what's already in the {{wrap-authorization-check}} Ring middleware function in \"trapperkeeper-authorization\"'s ring_middleware.clj namespace.  That function already pulls the \"name\" of the user to authenticate from the SSL client certificate and uses {{allowed?}} to validate the caller, returning a 401 (probably better to turn into a 403, I think) on failure.  Maybe the only difference we'd need is that the {{rules}} argument which is passed into {{wrap-authorization-check}} could be pulled from trapperkeeper-authorization's service context rather than something that the caller of the protocol function would need to provide.\n\nSound reasonable?", "created": "2015-08-07T14:02:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] And I was thinking that the source for the Trapperkeeper configuration on disk could look something like this:\n\n{noformat}\nauthorization: {\n rules: [\n {\n   path: /path/to/resource\n   type: path\n   allow: [ \"*.domain.org\", \"*.test.com\" ]\n   deny: \"bad.guy.com\"\n },\n {\n   type: regex\n   path: \"(incoming|outgoing)\"\n   allow: \"www.domain.org\"\n }\n ]\n}\n{noformat}\n", "created": "2015-08-07T14:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] - With respect to the new Clojure / HOCONified version of \"auth.conf\", what do you think the name of the conf file that holds these rules should be?  Should it be something different than \"auth.conf\" to avoid user confusion with the \"auth.conf\" file from Puppet that it is replacing?  We've been kicking around the name \"rules.conf\", but not sure that's the best name either if it eventually has more than just \"rules\" in it - like other general settings related to the authorization service.", "created": "2015-08-07T14:34:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "The intent is for the Puppet auth.conf to go away eventually, yeah? If so, naming the new one auth.conf seems reasonable to me. Since we can do comments, let's just spell out what's going on at the top of both files.", "created": "2015-08-07T17:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}The intent is for the Puppet auth.conf to go away eventually, yeah?{quote}\n\nYeah, that's the hope.\n\n{quote}Since we can do comments, let's just spell out what's going on at the top of both files.{quote}\n\nSounds good to me, thanks!", "created": "2015-08-07T17:59:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "I'm handing this work off to [~accountid:623c12b6ee1b5a0070293582] since I'm leaving for vacation on Monday.\n", "created": "2015-08-14T17:20:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Still need to implement the protocol function that wraps a ring handler with the authorization check.  Cleaned up the remaining core service transformation function and added some tests to cover it.", "created": "2015-08-18T14:52:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "PR is ready for review.", "created": "2015-08-19T12:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Initial PR was merged to master at [8ee299|https://github.com/puppetlabs/trapperkeeper-authorization/commit/8ee2990745d4fd96b32385fd74bbcae6f1a7e2f2].\n\nThere were a few comments on the PR that had not been addressed at the time the first PR was merged.  Capturing the high-level ones here and moving this ticket back to \"doing\", assuming that the remaining work will continue to be tracked against this ticket.  If we want to just break those out into a new ticket later, I'm good with that:\n\n* Would like to see if we can reuse more of the existing tk-auth code in constructing the ACL, like using what config->rule in config.clj does but just starting from a TK config representation instead of the HOCON one. Maybe there's some intermediate massaging that would need to be done to get to that?\n\n* Support for translating method from the config into the rule. Maybe addressing the first bullet could implicitly take care of this point?\n\n* Add a couple of extra service tests - just enough to give more assurances that the rule representation from the config is what is actually being used during authorization checks for a request.", "created": "2015-08-21T11:58:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Second PR is ready for review, I'll keep adding test cases while it's being reviewed.  https://github.com/puppetlabs/trapperkeeper-authorization/pull/3", "created": "2015-08-25T15:33:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "IMHO, one issue with reusing the Service config is that we apparently lost the file and line number of the loaded rules (the service config is an unordered map), which are useful for troubleshooting in case of deny.", "created": "2015-08-26T01:32:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Second PR merged to master at [bc0e8f|https://github.com/puppetlabs/trapperkeeper-authorization/commit/bc0e8fcaa2dfd8958351b8d4124de98f79d9a898].", "created": "2015-08-27T11:57:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:623c12b6ee1b5a0070293582] - this one's probably good to move to the \"testing\" column now, right?", "created": "2015-08-31T14:58:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}IMHO, one issue with reusing the Service config is that we apparently lost the file and line number of the loaded rules (the service config is an unordered map), which are useful for troubleshooting in case of deny.{quote}\n\n[~accountid:623c15ada1d81f0069d8e3ba], thanks for pointing this out.  This is something which occurred to us as a capability we would lose in moving to the use of Trapperkeeper's configuration service as a source for the configuration data.  Ultimately, we'd like to add this as a core capability to the Trapperkeeper framework so that not only trapperkeeper-authorization but also other Trapperkeeper services could take advantage of this capability for logging better user messages for troubleshooting.\n\nI've submitted TK-274 to track follow-up work on this.", "created": "2015-08-31T15:20:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]\n\n{quote}this one's probably good to move to the \"testing\" column now, right?{quote}\n\nYep, I moved it over.", "created": "2015-08-31T15:48:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Moving directly to resolved without testing.  QA Testing will occur when this feature reaches a build.", "created": "2015-09-02T09:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-08-05T14:46:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@70ac6ced"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyogxr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_359409860_*|*_1_*:*_1_*:*_5345651_*|*_10007_*:*_2_*:*_331082825_*|*_3_*:*_2_*:*_1478144703_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_150564789_*|*_10006_*:*_1_*:*_76067291"}], "description": "This ticket comes out of one of the discussions in SERVER-801.  [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] and I are both of the opinion that other Trapperkeeper services should interact with trapperkeeper-authorization via a new Trapperkeeper service.  This ticket would be about creating the basic implementation of this service.  We'll need to determine what parts we want to pull into the service on the first pass.  This may lead to follow-on tickets in which we would add on to the service.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10556", "fixedVersions": [], "id": "10556", "issueType": "Task", "key": "TK-258", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-09-02T09:37:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create Trapperkeeper service for tk-authorization", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "attachments": [], "comments": [{"author": "623c12b6ee1b5a0070293582", "body": "Note, as a requirement of the include support, we need to ensure globbing is also supported.  The goal is to add or remove snippets without also having to modify the file that does the {{include}}.  Unless we support globbing, or something like it, adding a snippet which also requires a new line in the file performing the include will not be sufficient since this new include line will have defeated the purpose of the snippet.", "created": "2015-07-20T17:30:00.000000"}, {"author": "70121:caffdbd6-f73d-4ae9-9c82-c4badf061584", "body": "Assigning to [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] for clarification ", "created": "2015-08-05T15:09:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "To peel back a layer, the underlying problem for this requirement is (from above):\n\n{quote}\nThe goal of this functionality is to support managing rules using a Puppet defined type ...\n{quote}\n\nOur preference for conf.d style snippets is actually a reaction to Puppet's historical difficulty managing parts of configuration files (the classic problem is separate modules contributing rules to a common framework like sudoers stanzas). If there is a type which can cleanly manage rules inside a single file from Puppet, the need for this specific implementation goes away.", "created": "2015-08-05T15:43:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "-Closing as \"wontfix\" - We're instead going to focus on managing the rules idempotently from Puppet, which addresses the root problem without requiring this implementation.-\n\nRe-opened based on jeff's discussion.", "created": "2015-08-11T12:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:56:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@19b7e278"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-288"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp6hz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "05/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_79286755_*|*_6_*:*_2_*:*_5781356_*|*_10004_*:*_1_*:*_1803858869_*|*_10006_*:*_1_*:*_257609606_*|*_10005_*:*_1_*:*_78469799922"}], "description": "As part of taking ownership and maintenance of trapperkeeper-authorization, we need to ensure there is a mechanism for loading rules expressed in a \"conf.d\" style file snippet in addition to a single rules.conf file.  The goal of this functionality is to support managing rules using a Puppet defined type which ultimately manages the existence or absence of a single file in a conf.d style directory.\n\nThe following quote from Eric0 in [this discussion|https://groups.google.com/forum/#!topic/puppet-dev/P6vas3tvUzM/discussion] mentions this need:\n\n{quote}include - Should support dropping snippets in a directory since these are easier to manage with puppet itself, than a monolithic file. Commentary on this email thread suggested that hocon does this out of the box, which would be cool. {quote}\n\nThis ticket captures the work of making sure HOCON does this out of the box, and if so, making sure the behavior works as required in puppet-server itself.", "epicLinkSummary": "trapperkeeper-auth improvements", "estimate": "PT0S", "externalId": "10268", "fixedVersions": [], "id": "10268", "issueType": "Task", "key": "TK-263", "labels": [], "originalEstimate": "PT0S", "parent": "10365", "parentSummary": "trapperkeeper-auth improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Won't Do", "resolutionDate": "2018-02-07T17:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support conf.d style include snippets in addition to a monolithic rules.conf file", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Given that we need to support multiple files for auth.conf rules, which may spread the rules list across multiple HOCON files{quote}\n\nI think we need to validate this with [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] before we do anything special with this one.  If it were acceptable to have them all managed in a single file, as a single HOCON array as is done in the current POCs for SERVER-768 and SERVER-769, this wouldn't seem to be required.", "created": "2015-07-20T17:03:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "There are multiple problems at play here:\n\n* allow splitting rules across multiple files: unfortunately this isn't that well supported in HOCON right now (there's no `include *.conf` magic bullet), and worst it won't respect file ordering, unless  we guarantee the user to always read them in lexicographic order.\n* ordering explicitly rules: it still leaves an uncertainty in the ordering if two rules in separate files have the same order number. Or you can do like cisco ACL, which prevents reusing an ACL order. Unfortunately this latest scheme is really painful to deal with, especially if there are multiple files involved (it is already painful in the cisco case, and you have all under the eyes at the same place).\n\nI'm not a huge fan of explicit ordering for those reasons.\n\nNow ordering can be dealt outside of tk-authz/rules.conf. rules.conf can be expressed as a json file that can be generated by a puppet manifest for instance. We could imagine the resources to have an order number that will in turn generate the correct ordering.\n\n", "created": "2015-07-21T02:04:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "[~accountid:623c15ada1d81f0069d8e3ba] What do you think about this idea for ordering of the ACE's in the ACL?\n\n1: We make the app read filenames, sorted in lexicographical order, from {{/etc/puppetlabs/puppetserver/rules.d/*.conf}}.\n2: {{rules = [ ]}} entries in each file, at the same version as per SERVER-805, are concatenated together by appending in sorted order, into a single {{rules}} ordered list in-memory.\n\nWhile parsing, and as part of [SERVER-804 Implement rule by rule ordered logging|SERVER-804], people should be able to see that things land as they expect.\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] I'm concerned this above idea / proposal departs fairly significantly from how configuration files are typically handled today.  Given the product feedback Eric gave, mentioned in SERVER-804, this ticket, and SERVER-807, specifically that he'd like to see all of logged ordering during parsing, logged ordering during evaluation, and file-snippets, what do you think?  Is there a more copacetic way to accomplish those goals without departing from established conventions?", "created": "2015-07-21T12:01:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "[~accountid:623c12b6ee1b5a0070293582] yes, I do agree with with your scheme, I'm just not sure if you mean that rules are implicitly ordered inside a given file, though.\n\n\nThe main issue about logging inside tk-authz (and the reason I didn't any logging) is that I'm not sure the library itself can depend on a logging library. Or do we have a standard we can assume to be available (like slf4j or clojure equivalent?). In short, I didn't want tk-authz to force the consumers of the library to use a logging lib they might not use.\n\nIf this can be solved (either by making sure slf4j or any other is OK), or injecting a logging system into the library at initialization, then we can then dump the rules after logging and during match. \n\nI'm a bit afraid logging all non-matched/matched rules (and why they do match or not) might generate a ton of logs, and I suppose we should restrain this to the DEBUG or TRACE level.\n", "created": "2015-07-21T12:25:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}I'm just not sure if you mean that rules are implicitly ordered inside a given file, though.{quote}\n\nI think that's what I mean, but may be tripping over semantics.  Maybe to clarify, I mean the order implied by the corresponding order of the list inside a given file.\n\n{quote}In short, I didn't want tk-authz to force the consumers of the library to use a logging lib they might not use.{quote}\n\nAgreed.  As part of SERVER-801, it might be good to think about if a consumer could provide a logging instance to the service.  Brice, have you thought about what that might look like already?", "created": "2015-07-21T16:52:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}As part of SERVER-801, it might be good to think about if a consumer could provide a logging instance to the service{quote}\n\nWe've already set a precedent for a number of our Clojure services and libraries -- including non-Trapperkeeper specific ones like clj-kitchensink and clj-http-client -- to log via macros provided in {{clojure.tools.logging}}.  According to that project's README.md (https://github.com/clojure/tools.logging/tree/tools.logging-0.2.6#logging):\n\n{quote}At runtime a specific implementation is selected from, in order, slf4j, Apache commons-logging, log4j, and finally java.util.logging.{quote}\n\nFollowing that precedent for logging inside of the new authorization library -- regardless of where the code eventually ends up -- would seem reasonable to me.\n", "created": "2015-07-21T17:10:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "Is this ticket describing something different than the sorting/ordering achieved by TK-266?", "created": "2015-09-16T12:57:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049] Looking back over this again, I agree that that the text from the original description is largely covered by the work done in TK-266.  The comment log gets a bit into ordering behavior around the idea of supporting rule snippets residing in different configuration files.  I think it would be better to confine discussion about rule snippets in different files to TK-263.\n\n[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - any other reason you can think of as to why we'd want to hold this ticket open?", "created": "2015-09-16T13:09:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Nope, marking closed/dupe as it's implemented in TK-266.", "created": "2015-09-23T23:51:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Dup of [TK-266]", "created": "2015-09-23T23:52:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:50:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2facd01"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynqqv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_79439741_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_5561851762"}], "description": "trapperkeeper-authorization currently implements an implicit mechanism for the ordering of rules.  That is to say, the rules list is assumed to be in order and will be processed by the library in a front-to-back ordering.\n\nGiven that we need to support multiple files for auth.conf rules, which may spread the rules list across multiple HOCON files, the implicit ordering may create an issue where it's not clear which rules will be implicitly processed ahead of other rules.  This, in turn, creates a security concern, especially with broader-application regexp based rules that may mask other more specific rules.\n\nEric0 expressed a requirement that rules be explicitly ordered instead of implicitly ordered.  From [this discussion|https://groups.google.com/forum/#!topic/puppet-dev/P6vas3tvUzM/discussion]:\n\n{quote}ordering - It needs some explicit way to indicate order of application for rules (and potentially resolve conflicts?). The closest model seems to be cisco style ACLs with just a number and you evaluate them in increasing order. There is a set order of evaluation for ACE rules inside an ACL, but not ACLs against one another - with regexps in particular its possible to match things you don't intend.{quote}", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10515", "fixedVersions": [], "id": "10515", "issueType": "Task", "key": "TK-264", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Duplicate", "resolutionDate": "2015-09-23T23:52:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Implement a mechanism for rule ordering", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623c08e1562ab90069f8aed4", "body": "Another thing we need firmly specified for this effort: how \"allow\" and \"deny\" directives will interact. See PUP-4630 for failures in the current implementation. ", "created": "2015-08-11T17:35:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "FWIW, the current tk-authz implementation follows strictly the Puppet implementation (which I think was the path of least surprises for users): global allow or global deny is a short circuit that prevents any other ACL to trigger. Hence PUP-4630 would still apply. This has its roots in the very old code of the fileserver.conf system in Puppet code, which was reused for auth.conf, if you want to know more :)", "created": "2015-08-13T03:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:623c08e1562ab90069f8aed4] I agree that we should be able to put together clear documentation as to exactly how the \"allow\" and \"deny\" directives are processed, including the behaviors about which directives \"win\" over other directives, etc.  I think this warrants a separate ticket where we explore the behavior of the current implementation and help create appropriate documentation.  Makes sense to me that the dev team would lead this effort and work with you or someone on your team to refine whatever documentation we come up with, like we've been doing with other feature-specific docs in Puppet Server.  Sound okay?", "created": "2015-08-17T12:50:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] Yup, sounds like the way to do it. I wouldn't spend too much time trying to figure out the current behavior", "created": "2015-08-18T11:02:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Thanks, [~accountid:623c08e1562ab90069f8aed4].  I broke the allow/deny investigation out into TK-268.", "created": "2015-08-18T12:20:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - I would like to get your take on how we should be \"versioning\" the rules.  It seems like we should consider having some more general strategy with respect to how we version Trapperkeeper service sections.  I can't think of a precedent for any that we've done so far in that way, however.  We could just add a {{version: 1}} field to the {{authorization}} section of the TK configuration, as I think is being suggested here, and be done with this question for now.  But I wanted to see if you had some broader vision in mind for how this would be done for TK service configuration that we should be trying to be consistent with.", "created": "2015-08-20T18:44:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yeah, we've never versioned this sort of thing before", "created": "2015-08-24T12:22:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - I assume you still want to just go with putting {{version: 1}} into the rules config for now?  Also, I'm assuming that the version applies at the level of the {{rules}} element in the config - meaning that all of the rules in the config need to confirm to a specific version rather than allowing for the user to mix different versions of rules within the same config?", "created": "2015-09-02T12:57:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Uh, yeah that'd be crazy-pants. Faces tried that and it's unused/unusable.\n\nJust a version tag for the file please.", "created": "2015-09-02T13:56:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Makes sense to me.  So, it should look like what we've got in the RFC right now:\n\n{code}\nauthorization: {\n  version: 1\n  rules: [...]\n}\n{code}\n\nPresumably, we'd make {{version}} a required field and fail to start if it weren't present - not defaulting to \"1\" if not there?", "created": "2015-09-02T14:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:43:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1cd254be"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz22sf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Aug/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_4436239_*|*_1_*:*_1_*:*_154889959_*|*_10007_*:*_1_*:*_1369323_*|*_3_*:*_1_*:*_7891653_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_3730_*|*_10006_*:*_1_*:*_4764464024"}], "description": "As part of [this discussion|https://groups.google.com/forum/#!topic/puppet-dev/P6vas3tvUzM/discussion] Eric0 mentioned that we need to make sure that the rules.conf file is versioned.  As currently implemented, there is no identifying version information in the rules.conf so there is an implicit assumption that the rules are expressed in a format that the library will understand.\n\nWe need to add version information into the loading and parsing behavior of trapperkeeper-authorization.  The goal of this version information is to enable new, backwards incompatble changes, while supporting older versions in the same file path in the filesystem.  To this end the library will inspect which version of the rules specification are being loaded and adjust behavior accordingly before parsing the rules.\n\nEric's quote is: {quote}versioning - Should have some concept of which version of the syntax the config is written in, like puppet reports do. {quote}", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10477", "fixedVersions": [], "id": "10477", "issueType": "Task", "key": "TK-262", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Fixed", "resolutionDate": "2015-09-15T19:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create v1 of rules.conf (make sure the spec is versioned)", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "623c15ada1d81f0069d8e3ba", "body": "FYI, I started working on a system to allow upstream code to log both the loaded rules, and the what happened during a match.\n\nInstead of letting tk-authz do the logging by itself which I found clumsy, the library will return a Report datastructure after an authorization, that contains all tested rules (and which one matched, the ones that were skipped, etc), along with which ACE did match (or not).\n\nI think this will be ready during next week-end, I'll post more information here at that time.", "created": "2015-07-29T12:29:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}I think this will be ready during next week-end, I'll post more information here at that time.{quote}\n\nAwesome, this is great.  I like the approach of returning a data structure that the caller can log as it sees fit.\n\n-Jeff", "created": "2015-07-29T14:42:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Decided this isn't required for MVP", "created": "2015-08-12T16:19:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "[~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049] I have something almost ready for this feature (unfortunately not published yet, and still based on my original code). If you want I can hand it to you at the Puppet Contributor Summit.", "created": "2015-10-02T14:52:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "[~accountid:623c15ada1d81f0069d8e3ba] Yeah that'd be great to see what you've got! I won't be at the Contributor Summit but look for [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]", "created": "2015-10-06T18:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master branch at [ab8fca3|https://github.com/puppetlabs/trapperkeeper-authorization/commit/ab8fca340fa254d369f1888b898377e8857348cf].", "created": "2015-10-13T17:24:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "This was included in the trapperkeeper-authorization 0.1.5 release, which passed in a Jenkins unit test run at http://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-authorization_release-clj_master/8/.  Moving to testing.", "created": "2015-10-13T17:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:37:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@29b7c059"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz1n8f:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_155282683_*|*_10007_*:*_1_*:*_424779823_*|*_3_*:*_1_*:*_542453907_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_77637984_*|*_10006_*:*_1_*:*_6224465563"}], "description": "Eric0 mentioned in [this thread|https://groups.google.com/forum/#!topic/puppet-dev/P6vas3tvUzM/discussion] two specific logging behaviors that he'd like to see in the auth.conf replacement.  This ticket captures both of them.\n\n{quote}When fully parsed, log out the internal representation of the rulesets w/ ordering, so people can see that things are landing where they expect. {quote}\n\nThis does not apply to the current POC builds from SERVER-768 because rules parsing happens very late, on demand for each request.  In the real implementation we expect rules.conf to be parsed earlier in the application lifecycle, more copacetic with how all TK services handle their configuration.  At this point of loading and parsing rules.conf, this logging requirement captures the need to log the internal representation of the rules and their ordering.  The goal is to give the end user a way to discover the actual ordering being used by the service so that they can compare this to the rules as expressed in configuration file(s) on disk.  This, in turn, will allow the user to compare what they write in rules.conf to what the system uses as an internal data structure.\n\n{quote}When processing an incoming request, the service should log rule-by-rule misses or matches. (It may already do this, as you mentioned earlier in the thread, I need to get it running and try){quote}\n\nThis is similar to the above, but applies to each request as it is being processed instead of to the configuration itself as it is being parsed into an internal data structure.  In an effort to help the user understand why a particular request is allowed or denied, each request needs to be clearly logged along with each rule, in order, that is evaluated against the request.\n\nh3. Feedback\n\n * [I'm a bit afraid logging all non-matched/matched rules (and why they do match or not) might generate a ton of logs, and I suppose we should restrain this to the DEBUG or TRACE level.|https://puppet.atlassian.net/browse/SERVER-806?focusedCommentId=197623&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-197623]\n\n", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10520", "fixedVersions": [], "id": "10520", "issueType": "Task", "key": "TK-261", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Done", "resolutionDate": "2015-10-14T15:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Implement rule by rule ordered logging", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "623c15ada1d81f0069d8e3ba", "body": "I still think IP should be kept, because you could express something as allow \"cert.domain.com\" as long as it is in our IP subnet.\nDNS based authentication was there only because you want your \"allow\" and \"deny\" rule to match something when the client is not authenticated. So if you want to allow any non-authenticated client to access the service, you'll need to filter them by some ways. IP is one way, DNS is another.\nOr we can simplify the problem (which is if I'm not mistaken what happens currently with tk-authz), and never allow non-authenticated (or globally allow them without passing those inside tk-authz).", "created": "2015-07-21T01:57:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Sorry I'm going to hold the line on this - let's concentrate on certificates not IP/DNS.", "created": "2015-08-12T16:32:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Note that this may also allow removing the {{type}} field on the matchers since they will all be regexes.", "created": "2015-08-12T16:43:00.000000"}, {"author": "623c15ada1d81f0069d8e3ba", "body": "Well, the library is in Puppetlabs hands now, so I'm not very well placed to argue :)\n\nJust I think allowing/denying based on IP is IMHO a good feature and I'd love to still be able to use it, especially for non-authenticated clients/endpoints. \nOn another hand, if you remove the IP matching, the library code will be much shorter :)", "created": "2015-08-13T03:35:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Note that this may also allow removing the type field on the matchers since they will all be regexes.{quote}\n\n[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] - Are you talking about removing the {{type}} keyword which modifies how the value for the {{path}} key is interpreted in a rule?  So, in essence, the {{path}} would always be treated as a regex with no option to treat it as just a literal value?  I'd been thinking that the {{type: path}} was included in the design of tk-auth initially because the {{path}} values will frequently have {{/}} characters in them and that having to escape them for use in a regex would be a bit more tedious for cases where a regex was not otherwise required.  I wasn't quite clear how this topic related to whether we were going to support allowing/denying against IP/DNS addresses, so I may be missing something here.", "created": "2015-08-17T11:51:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "With respect to \"removing IP & DNS based authorization from trapperkeeper-authorization\", I think the explicit changes we're talking about are:\n\n1) Removing support for the {{allow-ip}} and {{deny-ip}} directives from the ACE, including the logic that pulls the IP address from {{:remote-addr}} in the Ring request for the purpose of doing that comparison.\n\n2) Removing the ability for having the \"name\" compared to the values in the {{allow}} and {{deny}} directives be derived from the result of a reverse-DNS lookup done against the {{:remote-addr}} of the client in the case that the client has not authenticated with the server via an SSL client certificate.\n\nEffectively, then, the only source for a client's name to be matched against the {{allow}} and {{deny}} directives would be from the Common Name within the Subject of the client's SSL certificate.  (Although I believe we'll also be adding on the ability to fallback to an HTTP {{X-Client-DN}} header as a source for the client's name.  The latter, to support the use case where authentication of the client is done external to the server itself, would only be allowed when the {{allow-header-cert-info}} setting were set to \"true\".  This latter work would be done as part of SERVER-763.)", "created": "2015-08-17T12:11:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I just put up a PR which removes support for {{allow-ip}} and {{deny-ip}}, along with supporting logic and tests.  The PR does not change anything about how the {{type}} field works - which applies to the {{path}} in a rule - or about how an access control entry (ACE) is expressed.  In the latter case, a \"regex\" type ACE still must be expressed with surrounding {{/}} characters whereas other forms do not.", "created": "2015-10-06T14:25:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Also, I should mention that the PR I put up for this ticket only covers removing IP-based authorization.  The work to remove DNS-based authorization had already been done as part of TK-260.", "created": "2015-10-06T14:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to trapperkeeper-authorization master branch at [5bf21e|https://github.com/puppetlabs/trapperkeeper-authorization/commit/5bf21e06ecc59158a571831956deb7de6658a2aa].", "created": "2015-10-12T11:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "trapperkeeper-authorization tests passed after the PR was merged - http://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_trapperkeeper-authorization_unit-clj_master/25/.  Moving this to testing.", "created": "2015-10-12T11:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:28:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45bb91c1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz2h1r:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth - made sense to do along with the work being done for TK-268"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_155817100_*|*_10007_*:*_1_*:*_508473859_*|*_3_*:*_1_*:*_5895442_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_111170351_*|*_10006_*:*_1_*:*_6569513399"}], "description": "As Eric0 mentioned in [this discussion|https://groups.google.com/forum/#!topic/puppet-dev/P6vas3tvUzM/discussion], we will likely need to remove the IP and DNS based authorization rules from the trapperkeeper-authorization library as part of taking over ownership and maintenance of the library.\n\nThe deep dive code review in SERVER-801 should inform us about the complexity of this task.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10619", "fixedVersions": [], "id": "10619", "issueType": "Task", "key": "TK-265", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Done", "resolutionDate": "2015-10-13T18:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Remove IP & DNS based authorization from trapperkeeper-authorization", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "623c15ada1d81f0069d8e3ba", "body": "IMHO, it's not that we want to disable authorization for a given endpoint, it's that we want to disable authentication for a given endpoint. I.e. it might still be beneficial to allow only an IP range accessing an endpoint while being unauthenticated. ", "created": "2015-07-21T12:30:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Yeah the way I think of phrasing this is that we'd be allowing on a per-endpoint basis for a way to specify that authentication is required or not.  I think the description on the ticket is reasonable.  Maybe could just tweak the summary / headline for the ticket to be something like \"Design a way to specify if authentication is required for an endpoint\"?", "created": "2015-07-21T12:38:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}IMHO, it's not that we want to disable authorization for a given endpoint, it's that we want to disable authentication for a given endpoint. I.e. it might still be beneficial to allow only an IP range accessing an endpoint while being unauthenticated.{quote}\n\nI was thinking about this the other day. What does it mean to authorize a request that isn't authentic?  If we assume that we don't know anything about the origin IP or DNS, and they don't yet posses a way to authenticate themselves, how do we authorize such requests?\n\nI was starting to think about it from a natural language perspective, and the closest way I could come up with to say it is, \"Well, just disable authorization entirely and allow those requests.\"", "created": "2015-07-21T16:11:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] - Since the concept of {{auth any}} vs. {{auth yes}} are well-entrenched in how Puppet's auth.conf is used today, would it make most sense to just carry forward the same concept into {{trapperkeeper-authorization}}?  So we could have rules like this...\n\n{noformat}\n[\n  {\n    path: /puppet-ca/v1/certificate/\n    type: path\n    allow: [\"*\"]\n    auth: any\n  }\n]\n{noformat}\n\n... where the {{auth: any}} for the \"certificate\" rule would allow even an unauthenticated caller, i.e., one that didn't provide an SSL client certificate to the server when negotiating the SSL connection, to access the \"certificate\" endpoint.\n\nThe default for \"auth\", if not specified, could be \"yes\" - i.e., authentication is required - in order for a rule to be considered a match for a request.\n\nOne simplification we could do in the migration from the legacy Puppet auth.conf is to drop support for {{auth: no/off}} - as specifying that a rule only applies when the user is not authenticated doesn't seem particularly valuable - as well as {{auth: on}}, a synonym for \"yes\"?\n\n---\n\nArguably, we could overload the definition of {{allow}} with some designation indicating that not only all authenticated requests are accepted but that any non-authenticated requests would be accepted as well.  I agree with [~accountid:623c12b6ee1b5a0070293582]'s comment in the description, though, that overloading the {{allow}} keyword in this way doesn't seem right semantically.\n\nI'm open to an alternative suggestion for how to express this constraint if you can think of one.  What do you think?\n\n/CC [~accountid:623c08e1562ab90069f8aed4], [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]\n\n\n\n", "created": "2015-08-11T15:48:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "So, something that's historically been hard for a lot of users to understand is that the {{auth:}} directive is actually part of the MATCHING part of the ACL, rather than the RULE part. If we're continuing that approach, I think it's worth reconsidering the way we represent ACLs to make that more clear. \n\n(Tangentially: are we thinking yet about how to specify allowed HTTP methods? in auth.conf we use indirector methods instead, which are bad because they don't actually map very well to the real interface.)\n\nI dunno, maybe like\n\n{code}\n{match: \n  {path: /puppet/v3/catalog/(.*)\n   auth: yes\n   method: GET\n   url_parameters: {environment: production}\n  }\n allow:\n  [ {certname: \"$1\"}\n    {pp_preshared_key: \".cqjntk", "created": "2015-08-11T16:27:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "(Also thinking about things we can specify to authorize a request other than just certname, like maybe a developer key of some kind signed into a certificate to let you fetch whatever.)", "created": "2015-08-11T16:28:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}So, something that's historically been hard for a lot of users to understand is that the auth: directive is actually part of the MATCHING part of the ACL, rather than the RULE part. If we're continuing that approach, I think it's worth reconsidering the way we represent ACLs to make that more clear.{quote}\n\nCould you clarify a bit more on the distinction between the matching behavior and the rule behavior [~accountid:623c08e1562ab90069f8aed4]?  This information surprises me a bit too, I'd been thinking the way this does and will behave is to match on the URI (URL + query parameters) and the request method only.  I'll need to update my mental model if current matching is more complicated than that.", "created": "2015-08-11T16:34:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}are we thinking yet about how to specify allowed HTTP methods? in auth.conf we use indirector methods instead, which are bad because they don't actually map very well to the real interface.{quote}\n\nYes, the library in it's current form allows you to specify either a specific method, e.g. {{get}}, or the keyword {{any}} (which is the default).", "created": "2015-08-11T16:37:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "{quote}\nCould you clarify a bit more on the distinction between the matching behavior and the rule behavior\\[?]\n{quote}\n\nYeah, it's basically all in the docs, on the auth.conf page in the Puppet reference manual. \n\n- [Section of that page describing the parts of an ACL and their effects|http://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html#acl-syntax]\n- [Also on that page: this section|http://docs.puppetlabs.com/puppet/latest/reference/config_file_auth.html#default-auth-rules], which mentions a weird code misbehavior with the hardcoded default ACLs. This problem happens because the part of the code that inserts those default ACLs was written under the misconception that request matching works the way you described (test against path only), with the consequence that an ACL matching a disjoint set of requests can disable a default ACL that should actually still be in effect. Stuff like this is why I'm pretty positive auth.conf is the lowest quality code in Puppet. ", "created": "2015-08-11T16:45:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}So, something that's historically been hard for a lot of users to understand is that the auth: directive is actually part of the MATCHING part of the ACL, rather than the RULE part. If we're continuing that approach, I think it's worth reconsidering the way we represent ACLs to make that more clear.{quote}\n\nYeah, I believe the implementation of {{trapperkeeper-authorization}} that we've inherited for this effort, at least so far, does still keep this distinction.\n\n[~accountid:623c12b6ee1b5a0070293582] So as I understand it, when tk-auth receives a request that it is being asked to authorize, it traverses through its ordered set of rules.  A rule is considered a \"rule match\" if the HTTP request method and URI path match that on the rule - https://github.com/puppetlabs/trapperkeeper-authorization/blob/1ac74458d6ee857f0fdcbf198584f635ed0ed1bd/src/puppetlabs/trapperkeeper/authorization/rules.clj#L126-L128.  If a rule is a \"rule match\", then it is evaluated to see if it is an ACL match - https://github.com/puppetlabs/trapperkeeper-authorization/blob/1ac74458d6ee857f0fdcbf198584f635ed0ed1bd/src/puppetlabs/trapperkeeper/authorization/acl.clj#L228.  At the ACL match stage, we've decided that the rule applies to the request and can just return \"true\" if allowed or \"false\" if the user is in the \"allowed\" - and not the \"deny\"- list.  If the rule is not a \"rule match\", though, I believe it just moves on to the next rule in the list and repeats the process.  At the first point we have a \"rule match\", the result of that check is the overall return value for \"allowed?\".  If we don't find any rule matches, the result of the \"allowed?\" check is false.\n\nI agree that the extra level of grouping for \"match\" that [~accountid:623c08e1562ab90069f8aed4] suggested would be valuable for calling user attention to this behavior.  [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0], [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] - what do you think?\n", "created": "2015-08-11T17:02:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}If an ACL in auth.conf has the same path value as a default rule, Puppet will magically exclude the default rule even if the additional directives in the ACL mean they match completely disjunct sets of nodes.{quote}\n\n(facepalm)\n\nYeah, let's not do something like that ever again.\n\nIf we decide to hard-code rules in code I'd like to avoid this problem entirely by _never_ trying to mix-and-match user-specified rules with hardcoded defaults.  That is to say, if {{rules.conf}} exists at all then hard-coded defaults will never be used.\n\nI think this is much easier for all of us to reason about, end-users included, and avoid issues like this by making it impossible to introduce this kind of bug.", "created": "2015-08-11T17:07:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}(Tangentially: are we thinking yet about how to specify allowed HTTP methods? in auth.conf we use indirector methods instead, which are bad because they don't actually map very well to the real interface.){quote}\n\nYes.  We're not using indirector names for these anymore.  You should just be able to do something exactly like what you put in your example, a {{method}} element with an HTTP method as the value.  Some very early docs on this: https://github.com/puppetlabs/trapperkeeper-authorization/tree/1ac74458d6ee857f0fdcbf198584f635ed0ed1bd#rule.", "created": "2015-08-11T17:08:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}I agree that the extra level of grouping for \"match\" that Nicholas Fagerlund suggested would be valuable for calling user attention to this behavior. Eric Sorenson, J.D. Welch - what do you think?{quote}\n\nI agree too, right now {{method}} seems like a secondary-level attribute rather than a critical attribute of rule matching.  The primary focus is on {{path}} so it's a bit surprising that {{method}} is just as important when it comes later.\n\nHere's an example of what we have now:\n\n{code}\n[\n  {\n    path: /puppet-ca/v1/certificate/\n    type: path\n    allow: [\"*\"]\n    auth: any\n    method: get\n  }\n]\n{code}\n\nPerhaps we could tweak this format to be something akin to:  (Note, I'm only mentioning this to facilitate discussion and give examples, I don't have a strong preference on what this should look like.)\n\n{code}\n[\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate/\n      query_parameters: { environment: production }\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    auth: any\n  }\n]\n{code}", "created": "2015-08-11T17:19:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}If we decide to hard-code rules in code I'd like to avoid this problem entirely by never trying to mix-and-match user-specified rules with hardcoded defaults. That is to say, if rules.conf exists at all then hard-coded defaults will never be used.{quote}\n\nI had been thinking that the simple way out of that would be to not embed any default rules in code - that it can be driven only from configuration.  I think this becomes even more important when we're talking about {{trapperkeeper-authorization}} as a service that could be used by any services that might exist in the application stack where it is running.  tk-auth would not have any knowledge ahead of time of what other services might be using it and, so, embedding defaults in tk-auth itself wouldn't seem to make sense.  Also, embedding defaults that would be service-specific in those services and contributing those back to a consolidated rules list seems like it could complicate things as well in cases where those rules could conflict among services - in addition to with those in a separate configuration file.\n\nWe should have a separate ticket, though, about creating the default rules for Puppet Server - even assuming it is just what the default Clojure \"auth.conf\" / \"rules.conf\" file that is shipped in the Puppet Server package would have in it.  [~accountid:623c12b6ee1b5a0070293582] - do we have such a ticket yet?\n\n/CC [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]", "created": "2015-08-11T17:20:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "FWIW it may be worth moving any discussion of matching behavior and config specification to TK-262 or perhaps another ticket if we don't know if it's required for the v1 spec or not.\n\nThis ticket is pretty specifically about {{auth any}} behavior, which I don't like being called {{auth any}}.  For that specific Design/UX I'd suggest something more clear and direct like: {{allow_unauthenticated: true}}", "created": "2015-08-11T17:23:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "{quote}\nThis ticket is pretty specifically about auth any behavior, which I don't like being called auth any. For that specific Design/UX I'd suggest something more clear and direct like: allow_unauthenticated: true\n{quote}\n\nIf we change the implementation to make auth part of the rule behavior instead of the match behavior, then I'm with you. If we don't, and leave it as part of the match criteria, then that rewording would be misleading. ", "created": "2015-08-11T17:29:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}(Also thinking about things we can specify to authorize a request other than just certname, like maybe a developer key of some kind signed into a certificate to let you fetch whatever.){quote}\n\nThis is an interesting idea.  Not sure if we have a specific requirement to authenticate a user based on anything other than the CN from the Subject in an SSL client certificate or an {{X-Client-DN}} HTTP header, if allowed by configuration.  Not sure if I'd want to go with a format other than just a \"string\" until we have other sources of input that we'd definitely want to enable authorization against and can design how we want the join conditions between attributes to work, etc. - like whether the rule should allow for one credential vs. another to be used for matching.  I'm thinking this would be good to break out into a new ticket.", "created": "2015-08-11T17:35:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "fyi, RE: url_parameters vs. query_parameters mentioned in some of the examples above, we're discussing that in TK-259.", "created": "2015-08-11T17:37:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}I had been thinking that the simple way out of that would be to not embed any default rules in code - that it can be driven only from configuration.{quote}\n\nIf we go that route then we'll be taking on quite a bit of complexity internally in Engineering that we could otherwise avoid.  For example, reconciling ez-bake changes, packaging changes, filesystem permissions, coordinating with the integration team, docs, etc...\n\nMy thinking is that in the ideal world we ship by default with no configuration file at all in order to avoid these complexities internally in Engineering.  Most users will never touch rules.conf so organizing things so that changes to the default behavior don't create churn in the packages, ezbake, integration, etc... is desirable.\n\nWhatever future module exists that manages rules could help the user ensure there is always a copy of the default rules whenever it manages a single rule.  In this way we can safely make changes to the default behavior without much overhead or concern and the end users have a clear way to handle their customizations of those defaults.\n\n{quote}I think this becomes even more important when we're talking about trapperkeeper-authorization as a service that could be used by any services that might exist in the application stack where it is running.{quote}\n\nYes, I agree.  This is the primary reason I'm in opposition to the idea of making trapperkeeper-authorization responsible for knowing all of the rules required by all of the services using trapperkeeper-authorization.  It will be difficult to coordinate and separate out concerns because all of the consuming services will need to have their endpoints changed in code in tk-authz.\n\nNow, we could get around this by just having tk-authz, and all services, not hard-code defaults.  The only mechanism for a consuming service to register rules would be through filesystem configuration.  This is where a filesystem based precedence list would be useful.  Read from /etc if the file exists, otherwise read from /opt to populate the defaults.\n\nEither way, filesystem or hard-coded defaults, the goal is to provide some clear way to toggle entirely from default rules to user-defined rules, avoiding mixing and matching user defined rules with default rules.\n\n{quote}Also, embedding defaults that would be service-specific in those services and contributing those back to a consolidated rules list seems like it could complicate things as well in cases where those rules could conflict among services - in addition to with those in a separate configuration file.{quote}\n\nYeah, I see the complexity too and agree with you that it's a concern.  I've been struggling to try and reduce that complexity while also avoiding the sort of issue Nick highlighted.\n\nIn my mind the balance point (thing we should do taking everything into account) is on the /opt unless /etc all-or-nothing approach with no defaults in code.\n\n{quote}We should have a separate ticket, though, about creating the default rules for Puppet Server - even assuming it is just what the default Clojure \"auth.conf\" / \"rules.conf\" file that is shipped in the Puppet Server package would have in it. Jeff McCune - do we have such a ticket yet?{quote}\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] No, not that I know of, agreed it's something that should be a discrete ticket.", "created": "2015-08-11T17:42:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}For that specific Design/UX I'd suggest something more clear and direct like: allow_unauthenticated: true{quote}\n\nThat seems okay to me.  Will defer to [~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] and others on the name...", "created": "2015-08-11T18:02:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "{quote}> This ticket is pretty specifically about auth any behavior, which I don't like being called auth any. For that specific Design/UX I'd suggest something more clear and direct like: allow_unauthenticated: true{quote}\n\n{quote}If we change the implementation to make auth part of the rule behavior instead of the match behavior, then I'm with you. If we don't, and leave it as part of the match criteria, then that rewording would be misleading.{quote}\n\nHrmmm...  OK, let's try and focus on this because I still don't understand the distinction you're making.  In my mind the behavior we could document is:  \"Rules are matched against the URI and request method.  If a rule match it will be allowed by comparing the identity of the client against the list of allowed clients specified in the allow attribute.  In the scenario where an cannot prove its identity (unauthenticated), then the request may still be allowed by setting {{allow_unauthenticated: true}}.\"\n\nI'm not really understanding where the issue lies with regarding to keeping these semantics inside of the allow attributes and how moving it into the matching portion of a rule will help.  Could you please help me understand [~accountid:623c08e1562ab90069f8aed4]?", "created": "2015-08-11T18:08:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Crap, I inverted the sense of what you said, I thought you said if we leave that in the authorization portion.  I re-read it a third time and I think we're on the same page.  Is that correct [~accountid:623c08e1562ab90069f8aed4]?\n\nWhat do you think of that example I posted above?  Would something like that work?", "created": "2015-08-11T18:10:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Whoops, missed this comment from [~accountid:623c08e1562ab90069f8aed4]:\n\n{quote}If we change the implementation to make auth part of the rule behavior instead of the match behavior, then I'm with you.{quote}\n\nI guess I'd been thinking of this as being more closely associated with the \"allowed\" check against the \"matched rule\" than as being part of the matching criteria itself.  So something like [~accountid:623c12b6ee1b5a0070293582]'s example makes sense to me:\n\n{noformat}\n[\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate/\n      query_parameters: { environment: production }\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    allow_unauthenticated: true\n  }\n]\n{noformat} \n\nIs there a compelling historical reason for having \"auth\" be part of the criteria to see if the rule matches the request?", "created": "2015-08-11T18:11:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "RE: the discussion on default rules, I created a new ticket, SERVER-846.  I think it would be better to have conversation related to that topic in that ticket to keep this one focused on the original question about {{auth any}}.", "created": "2015-08-11T18:26:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "- The way it works now is as part of the match request. \n- I actually can't tell from the preceding comments whether that's currently the case for tk auth. I'd have to read more closely. \n- Y'all can do it either way, but the form and the behavior need to match. \n\nHere's an example that might help make the distinction clear (using current auth.conf syntax):\n\n{code}\npath ~ ^/puppet/v3/catalog/([^/]+)$\nmethod find\nauth yes\nallow $1\n\npath ~ ^/puppet/v3/catalog/([^/]+)$\nmethod find\nauth no\nallow special-dev-node.example.com\n{code}\n\nIn current Puppet, if special-dev-node makes an unauthenticated request, the first ACL _will not actually match,_ and the request will fall through to the second ACL. That's because the auth status is being used as part of the match criteria. \n\nIf auth status wasn't part of the match criteria and was instead part of the allow criteria, the first ACL would _always_ match \u2014 it would be impossible to construct a catalog request that would reach the second ACL, since the path and method for both of them describe the full set of catalog requests. \n\nSo:\n\n* If you have implemented entirely different logic for tk auth so that it would be impossible to ever reach the second ACL, then Jeff's suggestion of having {{allow_unauthenticated}} outside the set of match criteria makes sense, and I agree that it reads much better than {{auth any}}.\n* If you haven't rewritten the logic, and it's still possible to reach the second ACL in that example, then nope. Everything that's part of the match criteria must be _represented_ as part of the match criteria. Also, the wording \"allow_unauthenticated\" wouldn't work, because that's not the actual thing you'd be controlling", "created": "2015-08-11T18:32:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "[~accountid:623c08e1562ab90069f8aed4], [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f],\n\nThis discussion about authorizing requests that do not have a authentic client certificate leads me to believe the rules.conf spec _must_ have a way to express 3 sates:  1: The matched rule is allowed.  2: The matched rule is denied.  3: The matched rule is neither allowed or denied and rule processing from the access control list should continue.\n\nWithout 3 in the above list, we have no way to express the two rules that Nick highlighted in his example in a way that works as the user expected.  One rule will always be authoritative on the authorization result when we need a way to allow the rule to defer to a subsequent rule in the list.   ", "created": "2015-08-12T09:59:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "[~accountid:623c08e1562ab90069f8aed4]\n\n{quote}If you have implemented entirely different logic for tk auth so that it would be impossible to ever reach the second ACL, then Jeff's suggestion of having allow_unauthenticated outside the set of match criteria makes sense, and I agree that it reads much better than auth any.{quote}\n\nThis is the case.  With trapperkeeper-authorization today, there would be no way to reach the second rule.  The first rule will always match and deny the unauthenticated case.\n\nWhat concerns me is there's actually no way to express what the user intends in your example with the new system.  Is that a problem?", "created": "2015-08-12T10:03:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "{quote}\nWhat concerns me is there's actually no way to express what the user intends in your example with the new system. Is that a problem?\n{quote}\n\nI might not be the one to ask", "created": "2015-08-12T11:42:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Agree that {{allow_unauthenticated: true}} is far clearer.", "created": "2015-08-12T15:18:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:623c0a337910a200718b9059] and [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], can I get a sanity check on following?\n\nSo, just as a rollup comment to the discussion on this ticket.\n\nI think we're gravitating toward a format like the one that [~accountid:623c12b6ee1b5a0070293582] proposed...\n\n{noformat}\n[\n  {\n    match_request: {\n      path: /puppet-ca/v1/certificate/\n      query_parameters: { environment: production }\n      method: get\n    }\n    type: path\n    allow: [\"*\"]\n    allow_unauthenticated: true\n  }\n]\n{noformat}\n\n...  Ignoring the exact definition of \"query_parameters\" for now, since we're having a separation conversation about that in TK-259.\n\nThis proposes a slight behavioral deviation from core Puppet's auth.conf in that the {{allow_unauthenticated}} directive, which basically would replace what we get from {{auth any}} in auth.conf, would no longer be used to consider whether a request matched a rule but instead would only be evaluated after a rule had been determined to be a match for the request.  I don't think we came up with any good use cases for keeping {{allow_unauthenticated}} as part of the match criteria and instead had come to the conclusion that this would be an improvement for users since it is more intuitive that be evaluated post-match.  (Please correct me if anyone disagrees here).\n\nRegarding [~accountid:623c08e1562ab90069f8aed4]'s idea about maybe making the {{allow}} directive itself more complex - moving from having the values just be a string whose value is assumed to evaluated against the CN for the request to a map with more complex ways to represent aspects of identity to be evaluated like \"cert-name\" vs. some trusted fact on the cert (including even the notion of \"unauthenticated\"?) - I'm open to the idea as a later enhancement.  Not sure we want to add that in now, though.  I'd propose we consider that as a separate ticket - possibly for a future release.\n\nThere was also some discussion about the possibility of creating a more general purpose \"passthrough\" directive - i.e., a way for a rule to express that in the event if the request matches but that the user is not permitted via the allow/deny directives that the result not immediately be set to \"denied\" but that instead evaluation be deferred to other rules in the ordered list.  This is an interesting idea as well.  Again, since this doesn't seem like a backward compatibility requirement, I'd propose that this be captured in a separate ticket.  This would also be one that we could consider for a future release.", "created": "2015-08-13T13:05:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I don't have any strong opinions on this one.  (for once :) ).  [~accountid:623c12b6ee1b5a0070293582]'s proposal sounds good!", "created": "2015-08-14T03:35:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "This ended up being pretty straight-forward given the structure we now have in place, specifically the end-to-end integration test at the TK service layer.", "created": "2015-08-27T17:54:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] raised the point that if {{allow_unauthenticated}} were set to {{true}} for a rule that it would make sense to disallow the use of {{allow}} or {{deny}} for the same rule.  The reason for this is that it doesn't seem particularly sane for a user to want to create a rule that would allow any request from an unauthenticated user but deny a request made from users with specific certificate names.  If such a rule were created, the nefarious authenticated user who was denied might just try to make the request again without using a certificate and be allowed.  In such cases, it would seem more likely that a user might have combined the {{allow_authenticated}} directive with an {{allow}} or {{deny}} by accident and, so, failing such a combination at rule parsing time would alert a user right away to the problem and help them fix it.\n\nTalked through this with [~accountid:623c12b6ee1b5a0070293582] as well, and we'll plan on adding this to the current PR assuming there's no pushback from others.", "created": "2015-08-31T11:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to tk-authz master at [7cbd4|https://github.com/puppetlabs/trapperkeeper-authorization/commit/7cbd4c453df4a997ddd6d700f847c9080d719bc1].", "created": "2015-09-04T12:55:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Testing will occur in PE-11861", "created": "2015-09-15T09:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-20T16:17:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@301b6937"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-111"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyofrb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_156454402_*|*_10007_*:*_1_*:*_673358843_*|*_3_*:*_1_*:*_22060132_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_938088541_*|*_10006_*:*_1_*:*_3110417360"}], "description": "As part of SERVER-801, we'll decide what changes, if any, need to happen in order to handle the authorization of a REST API call from a client that does not yet posses a signed SSL certificate.  For example, when a new puppet agent is bootstrapping itself it submits a CSR and requests a signed certificate.  These API calls need to be authorized in the absence of a signed certificate.\n\nThe current implementation of the SERVER-768 POC has no facility other than {{allow: [ \"*\" ]}}, however the semantics of this expression are to allow any authentic, signed request.  We need something similar to {{auth.conf}}'s {{auth any}} statement, which will allow any request, even those which have not been authenticated.\n\nThis ticket depends on SERVER-801 because these facilities may already be present in trapperkeeper-authorization.", "epicLinkSummary": "auth.conf replacement", "estimate": "PT0S", "externalId": "10476", "fixedVersions": [], "id": "10476", "issueType": "Task", "key": "TK-260", "labels": [], "originalEstimate": "PT0S", "parent": "15806", "parentSummary": "auth.conf replacement", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Fixed", "resolutionDate": "2015-09-15T09:30:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Design a way to specify if authentication is required for an endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:18109e62-1b97-4fa3-8217-9c25de3a4710", "body": "Currently in PuppetDB, we're using with-redefs at an internal API which wraps clj-metrics at a higher level. \n\nhttps://github.com/puppetlabs/pe-puppetdb-extensions/blob/master/test/puppetlabs/pe_puppetdb_extensions/sync/core_test.clj#L805\n\nSomething like this ticket would allow us to test the system more completely. ", "created": "2015-08-04T09:26:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-17T11:12:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@36fe08f9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz14vr:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_433381788_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_209174430618"}], "description": "From [this thread on dev-team@|https://groups.google.com/a/puppetlabs.com/forum/?hl=en#!topic/dev-team/cvLfQ-_6aXY]\n\nAdd a test fixture to tk-metrics that can be used by downstream apps to reset the metrics registry for test purposes", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10196", "fixedVersions": [], "id": "10196", "issueType": "Improvement", "key": "TK-256", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:36:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-metrics: Add fixture to reset registry", "timeSpent": "PT0S", "updated": "2022-03-08T10:36:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "duplicate of TK-253", "created": "2015-07-17T12:56:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-17T11:08:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@39efafdd"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz14vj:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6450169_*|*_6_*:*_1_*:*_0"}], "description": "From [this thread on dev-team@|https://groups.google.com/a/puppetlabs.com/forum/?hl=en#!topic/dev-team/cvLfQ-_6aXY]\n\nAdd a dependency from tk-metrics to metrics-clojure, and use the metrics-clojure default registry as the registry in all cases", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10605", "fixedVersions": [], "id": "10605", "issueType": "Improvement", "key": "TK-255", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Duplicate", "resolutionDate": "2015-07-17T12:56:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-metrics: Use registry from metrics-clojure ", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "duplicate of TK-252", "created": "2015-07-17T12:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-17T11:05:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ad7fa6c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz14vb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6602280_*|*_6_*:*_1_*:*_0"}], "description": "From [this thread on dev-team@|https://groups.google.com/a/puppetlabs.com/forum/?hl=en#!topic/dev-team/cvLfQ-_6aXY]\n\nStop supporting the global {{enabled}} setting, and log a warning if it is encountered (so as to be backward-compatible with existing config files in user installations).", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10618", "fixedVersions": [], "id": "10618", "issueType": "Improvement", "key": "TK-254", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Duplicate", "resolutionDate": "2015-07-17T12:55:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-metrics: Remove 'enabled' setting", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "https://github.com/puppetlabs/trapperkeeper-metrics/pull/11", "created": "2015-07-20T05:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "After discussion with [~accountid:557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e] on the PR, it sounds like they were able to get their metrics working without the need for global state, so we're closing this as \"won't fix\" for now.  We can revisit in the future if other teams run into the issue.", "created": "2015-11-13T08:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-17T07:47:00.000000", "creator": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1edc5f21"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoo3b:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Blocker"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Client Platform"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Nov/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_249481628_*|*_10007_*:*_1_*:*_10036105847_*|*_3_*:*_1_*:*_2017680_*|*_6_*:*_1_*:*_0"}], "description": "Add a dependency from tk-metrics to metrics-clojure, and use the metrics-clojure default registry as our registry in all cases\n\nThis will enable users to control the destination of metrics (JMX etc) via the tk-metrics configurations, and allow developers to continue to use the helpers from metrics-clojure in their code with confidence that it'll be available by the tk-metrics 'managed' MetricRegistry", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10195", "fixedVersions": [], "id": "10195", "issueType": "Improvement", "key": "TK-253", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "resolution": "Won't Fix", "resolutionDate": "2015-11-13T08:27:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Refactor tk-metrics to wrap metrics-clojure's default-registry", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "body": "https://github.com/puppetlabs/trapperkeeper-metrics/pull/10", "created": "2015-07-20T05:05:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-17T07:34:00.000000", "creator": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4dddd3ac"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyolin:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Blocker"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Client Platform"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_967037_*|*_10007_*:*_1_*:*_1393368306_*|*_3_*:*_1_*:*_249227899_*|*_5_*:*_1_*:*_0"}], "description": "Creating a MetricsRegistry is very light and updating metrics is very light, but by enabling the user to disable the metrics registry code has to double-check if a metrics registry has been created which leads to an unfortunate amount of busy-work in the code to check if metrics are enabled before maybe recording a metric.\n\nStop supporting the global 'enabled' setting, and log a warning if we encounter it (so as to be backward-compatible with existing config files in user installations)\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10604", "fixedVersions": [], "id": "10604", "issueType": "Improvement", "key": "TK-252", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bc51acb1-04f0-4d4a-bab9-86e3e7c0520e", "resolution": "Fixed", "resolutionDate": "2015-08-05T08:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Deprecate/remove tk-metrics `enabled` option", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-07-15T11:06:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@70d51464"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz10k7:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Fifteen minute fix"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_131237_*|*_1_*:*_1_*:*_726570_*|*_10007_*:*_1_*:*_72014424_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_18622601"}], "description": "Currently, ruby-hocon throws an exception when trying to parse a ruby hash with keyword keys for insertion into  a config. Since keywords are something present in ruby but not Java, we should support them.\n\nThe upstream library does not support anything other than string keys when parsing a Hash value. In the interest of not peppering knowledge of ruby throughout the ported code, we should convert all keyword keys in a hash to strings in a pre-processing step before parsing the Hash.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10363", "fixedVersions": [], "id": "10363", "issueType": "Improvement", "key": "TK-251", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-07-16T12:31:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support hashes with keyword keys in ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "[~accountid:557058:0f255f44-5dce-4849-80f5-c0db60d9b049] [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I noticed you two merged this PR on Friday. Do you think this ticket needs FR, or can we move it straight into done? And does the follow up work need to be done as part of this ticket?", "created": "2015-07-20T11:33:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "[~accountid:623e7507866b810069e57527] Oops, forgot to move the ticket after merging.  It's gone through CI so I marked it Resolved.  I'm going to put up a follow-up PR today with the discussed changes, probably just under MAINT.", "created": "2015-07-20T11:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-14T08:12:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f2df687"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz10jz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "external dependency"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_24246_*|*_10007_*:*_1_*:*_530400094_*|*_3_*:*_1_*:*_252151_*|*_5_*:*_1_*:*_0"}], "description": "_emphasized text_Working with the London devs I found some cases where they needed to be able to generate some keys/certs and were shelling out to Puppet to do it.  This isn't ideal because we're eventually going to replace those CLI tools, plus it requires having Puppet/Ruby/various dependencies set up on your system, plus it should be easy to do it via clojure code.\n\nThe current API for ssl-utils is really great, but as I was working up a little script for them that they could use to generate certs for development purposes, I ended up needing to get a little farther into the weeds of ssl-utils than I'd hoped.  So, I think it would be good to add a supplemental 'simple' or 'basic' namespace to ssl-utils, which could be used for simple cases like setting up a development environment.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10616", "fixedVersions": [], "id": "10616", "issueType": "New Feature", "key": "TK-250", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-07-20T11:37:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add simple API for generating certs/crls via ssl-utils library", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "This should be a really easy, really fast fix. \n\nWhen a ConfigValue rather than a string is inserted into a ConfigDocument, it is rendered with default render options, and then inserted into the document. All we should need to do here is change the options we pass in when rendering the ConfigValue to NOT render the origin comments (which is where the {{# hardcoded value}} is coming from).\n\nThis change should be made upstream, and then ported down into ruby-hocon.", "created": "2015-07-13T16:52:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I'm moving this into Ready for Merge so the ruby-hocon review can get merged. However, I still need to do a ruby-hocon release and update the hocon module, so when the PR is merged it should go back into \"Doing\".", "created": "2015-07-14T10:41:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:623e7507866b810069e57527] Merged, release away", "created": "2015-07-14T11:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-07-13T15:49:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@148812ec"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz10jr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Really quick, really easy fix"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_50014_*|*_1_*:*_1_*:*_4066396_*|*_10007_*:*_1_*:*_4013854_*|*_3_*:*_2_*:*_580536994_*|*_5_*:*_1_*:*_0"}], "description": "When adding in a value to a ConfigDocument that's an array or a hash, when that value is rendered, every entry will have a comment attached to it that reads {{# hardcoded value}}. The display of these comments should either be configurable or be removed.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10603", "fixedVersions": [], "id": "10603", "issueType": "Bug", "key": "TK-249", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-07-20T11:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "ruby-hocon adds `# hardcoded value` comments", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] can you review this and make sure it matches up with what you needed?  If so, we should just keep in touch w/rt prioritization and make sure this gets done before you need it.  I'm 100% in favor of it and think it would be a very useful addition to the API but probably won't pull it into a sprint until it's blocking something else.\n\n[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] ping, since you'd also asked me about this.\n\n[~accountid:557058:808c35de-34a9-46bd-a472-c5ecf2deee86] ping since I think you might have run into something kind of like this in PuppetDB.", "created": "2015-06-30T02:24:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:624502c2258562006fa39d9e] this is the ticket I was mentioning.\n\nI still haven't implemented it because my team hasn't run into an immediate need for it, but if someone writes it and files a PR, I'll make sure it gets merged and released quickly.", "created": "2015-08-17T04:30:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "Fixed in 0.3.0", "created": "2015-09-21T06:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-30T02:22:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6d7fee04"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0rhz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Sep/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_120685271_*|*_10007_*:*_1_*:*_1480677254_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_5584342697"}], "description": "In compojure, because your routes are just nested functions all the way down, it's easy to wrap middleware around any subset of your route tree at any time, simply by wrapping a function around the current handler.\n\nIn comidi/bidi, your route tree is a data structure and you generally don't want to convert it to a handler function until the last possible moment, because once you convert it into a function it becomes opaque and you lose the ability to introspect the route data structure.\n\nUnfortunately this makes it hard to apply middleware at a level other than the root, given the current API of comidi.  We've mostly been handling that so far by just including the necessary middleware around the handler functions at the leaf nodes of individual comidi routes, but this is limiting because sometimes you want to wrap middleware around a subset of your route tree, and do so from a place in the code where the leaf handler functions have already been defined.\n\nI think that a reasonable solution would be to just provide a new function in the comidi API that looked something like this:\n\n{code}\n(schema/defn wrap-leaves-with-middleware :- BidiRoutes\n   [routes :- BidiRoutes\n    middleware :- IFn]\n  ;;... walk the tree and return the updated one here ...\n   )\n{code}\n\nFrom an API perspective hopefully this wouldn't be too tough a change from the mechanisms that people currently use to accomplish this sort of thing via compojure, and it should effectively accomplish the same end goal.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10475", "fixedVersions": [], "id": "10475", "issueType": "Improvement", "key": "TK-248", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-09-21T06:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add mechanism for wrapping intermediate comidi routes with middleware", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:623c0b72bef8a60068c796ce] - Is there a PR up for this?  If so, can you link it to this issue?", "created": "2015-07-20T14:25:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Put it back in In Progress. I had a PR up, but we decided (in the PR) the tests should be in the tk-jetty9 repo. I'll update the description too", "created": "2015-07-20T14:40:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Ok, thanks.", "created": "2015-07-20T14:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-26T11:48:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@166b97c2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyze5z:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Security concerns were brought up around the issue"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_368872_*|*_1_*:*_1_*:*_56131_*|*_10007_*:*_2_*:*_354465663_*|*_3_*:*_2_*:*_151624888_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1741010567"}], "description": "Concerns were brought up about how tk-jetty9's {{add-proxy-route}} handles [path traversal attacks|https://www.owasp.org/index.php/Path_Traversal].\n\nFor example, a potential attack could involve 3 endpoints\n\n{panel}\nJetty Instance 1: HTTPS, 8081\n- {{/status}}\n- {{/secret}}\n\nJetty Instance 2: HTTP, 8080\n- {{/status-proxy}} (setup to proxy to {{/status}} only. Using certs also valid for {{/secret}})\n{panel}\nand then requesting something like {{/status-proxy/../secret}} and getting illegitimate access to {{/secret}}.\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]'s initial testing shows that this doesn't happen because {{/status-proxy/../secret}} is translated by jetty into a request to {{/secret}} and does not hit the {{/status-proxy}} endpoint at all. Since {{/secret}} is an endpoint which doesn't exist on the second, plaintext jetty instance, the request returns a 404.\n\nThis being said, it would be great to add some testing around path traversal attacks to the status-proxy-service for greater peace of mind.\n\nThese tests should live in the tk-jetty9 repo since they test {{add-proxy-route}} more than the {{status-proxy-service}}", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10267", "fixedVersions": [], "id": "10267", "issueType": "Improvement", "key": "TK-247", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Fixed", "resolutionDate": "2015-07-22T12:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create tests around Path Traversal attacks for the status-proxy-service", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "Note that this is also probably a bug in the upstream Java library as well, so it should be fixed there and the fix should be ported down to ruby.", "created": "2015-06-23T09:52:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] [~accountid:557058:0b16fa29-44bc-4e11-82b0-a346967ad808] any news on whether we have a decent workaround for this for now?", "created": "2015-06-29T14:32:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I just talked to [~accountid:557058:0b16fa29-44bc-4e11-82b0-a346967ad808], it sounds like he wasn't able to get a workaround in place for this issue. Given that, it sounds like it would probably be a good idea to go ahead and fix this bug, as I don't think it will be a lot of work and it would avoid a significant amount of annoyance for users.", "created": "2015-06-29T15:27:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "The linked PR was merged yesterday, so I'm going to close this out.", "created": "2015-07-01T16:28:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "We're just waiting on the gem to be promoted into PE, so yeah good to close. Thanks for fixing this!", "created": "2015-07-01T16:55:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:0b16fa29-44bc-4e11-82b0-a346967ad808] do we have an owner for that?  (gem promotion?)  No problem if that is something that needs to be on our plate, just want to make sure we're all on the same page :)", "created": "2015-07-02T02:25:00.000000"}, {"author": "557058:0b16fa29-44bc-4e11-82b0-a346967ad808", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Oh yeah, Rob made a ticket, I just forgot to link it from this ticket: https://puppet.atlassian.net/browse/RE-4957", "created": "2015-07-02T11:08:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:0b16fa29-44bc-4e11-82b0-a346967ad808] awesome, thanks.", "created": "2015-07-03T05:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-23T09:37:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7e998d0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0mnr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_539625118_*|*_10007_*:*_1_*:*_105788901_*|*_3_*:*_1_*:*_70330546_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_87422"}], "description": "The other day, [~accountid:557058:0b16fa29-44bc-4e11-82b0-a346967ad808] saw some really ugly configuration being generated by the hocon module (tracked in PE-10528). Normally, the HOCON module should add new settings in a map to a new, indented line within that map. However, settings are instead all being added to the same line within the map, leading to a single-line map with a large number of settings.\n\n[This method|https://github.com/puppetlabs/ruby-hocon/blob/master/lib/hocon/impl/config_node_object.rb#L168-L270] is what handles the addition of new settings, so the bug is in here somewhere, and likely has to do with the handling of whitespace tokens.\n\nI'm fairly certain that when you add a new setting that's part of a map that doesn't exist it'll do something like\n\n{code}\nfoo : { bar : \"a\" }\n{code}\n\ninstead of\n\n{code}\nfoo : {\n  bar : \"a\"\n}\n{code}\n\nSince the resulting map added does not contain any newline characters, I'm fairly certain that the addition of new settings into this map are just adding the setting onto the end of the current line, causing the ugly config.\n\nI'm thinking that if we just change the way new single-value maps are inserted into the config file to be in the style of the second code snippet above it should fix the issue.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10399", "fixedVersions": [], "id": "10399", "issueType": "Bug", "key": "TK-246", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-07-01T16:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Whitespace bug in hocon gem generates ugly configuration", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-22T09:21:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@aef0b63"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoq3z:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1971412_*|*_1_*:*_1_*:*_7449_*|*_10007_*:*_1_*:*_337470820_*|*_3_*:*_1_*:*_103216785_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_260405092"}], "description": "Currently the status proxy doesn't validate the configuration is uses for SSL cert information. It should perform some validation to ensure it matches an expected schema", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10194", "fixedVersions": [], "id": "10194", "issueType": "Improvement", "key": "TK-245", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Done", "resolutionDate": "2015-06-30T12:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improved error handling for status proxy service", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:43c81f8c-ae3f-46d9-84b0-c9c65e1da709", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:06:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@30ffc8ae"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jv3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1218642213_*|*_6_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10459", "fixedVersions": [], "id": "10459", "issueType": "Sub-task", "key": "TK-244", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10509", "parentSummary": "Response status code should reflect status of a service or services", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-07-01T15:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "docs should reflect status codes ", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:06:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4f4c7fa3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0juv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1218687215_*|*_6_*:*_1_*:*_0"}], "description": "Should this be documented separately from the individual services? If not, this can just be closed", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10410", "fixedVersions": [], "id": "10410", "issueType": "Sub-task", "key": "TK-243", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10360", "parentSummary": "Ability to configure minimalist monitoring for status code and text response", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-07-01T15:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "docs for minimal monitoring endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "body": "Verified in build 4.0.0-rc5-164-gad6ae4e", "created": "2015-06-29T15:49:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-17T13:05:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@78361be8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jun:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1046622668_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10396", "fixedVersions": [], "id": "10396", "issueType": "Sub-task", "key": "TK-242", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10360", "parentSummary": "Ability to configure minimalist monitoring for status code and text response", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-29T15:49:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "QA for minimal status monitoring endpoint ", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:05:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7a49a092"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0juf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_247448324_*|*_1_*:*_1_*:*_600905469_*|*_10007_*:*_1_*:*_3142340_*|*_3_*:*_2_*:*_185447872_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_9355665"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10362", "fixedVersions": [], "id": "10362", "issueType": "Sub-task", "key": "TK-241", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10360", "parentSummary": "Ability to configure minimalist monitoring for status code and text response", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-29T15:43:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dev work for minimal status monitoring endpoint", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "body": "verified in 4.0.0-rc5-144-g2652891", "created": "2015-06-25T23:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-17T13:04:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7f76eee5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0ju7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_726978453_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10266", "fixedVersions": [], "id": "10266", "issueType": "Sub-task", "key": "TK-240", "labels": [], "originalEstimate": "PT0S", "parent": "10394", "parentSummary": "Status Service responses have incorrect Content-Type header", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-25T23:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "QA for content-type header fix ", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "body": "verified in 4.0.0-rc5-144-g2652891", "created": "2015-06-25T23:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-17T13:04:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@12725e33"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jtz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_173597730_*|*_1_*:*_1_*:*_99935493_*|*_10007_*:*_2_*:*_418856603_*|*_3_*:*_2_*:*_6783781_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_27807035"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10193", "fixedVersions": [], "id": "10193", "issueType": "Sub-task", "key": "TK-239", "labels": [], "originalEstimate": "PT0S", "parent": "10394", "parentSummary": "Status Service responses have incorrect Content-Type header", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-25T23:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dev work for content-type header fix", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "body": "verified in 4.0.0-rc5-144-g2652891", "created": "2015-06-25T22:58:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-17T13:04:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@25069a19"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jtr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_173595727_*|*_1_*:*_1_*:*_441879481_*|*_10007_*:*_1_*:*_77327964_*|*_3_*:*_1_*:*_6394785_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_27673433"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10602", "fixedVersions": [], "id": "10602", "issueType": "Sub-task", "key": "TK-238", "labels": [], "originalEstimate": "PT0S", "parent": "10554", "parentSummary": "Rename is_running key to \"state\" and enumerate values", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-25T22:58:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dev work for key/value rename", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:03:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@25b15dfc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jtj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_793244473_*|*_3_*:*_1_*:*_423293959_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10615", "fixedVersions": [], "id": "10615", "issueType": "Sub-task", "key": "TK-237", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10216", "parentSummary": "status service callback error handling", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-07-01T14:59:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "QA for callback error handling ", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:03:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@58ae6f09"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jtb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_83808452_*|*_1_*:*_1_*:*_19557477_*|*_10007_*:*_2_*:*_93714449_*|*_3_*:*_2_*:*_499919948_*|*_5_*:*_2_*:*_2241056_*|*_10011_*:*_1_*:*_94019980"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10555", "fixedVersions": [], "id": "10555", "issueType": "Sub-task", "key": "TK-236", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10216", "parentSummary": "status service callback error handling", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-26T17:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dev work for callback error handling ", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:03:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@43be7e9c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jt3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_775602486_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10513", "fixedVersions": [], "id": "10513", "issueType": "Sub-task", "key": "TK-235", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10509", "parentSummary": "Response status code should reflect status of a service or services", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-26T12:29:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "QA for status code responses ", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T13:02:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@43e23f31"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0jsv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_250906212_*|*_1_*:*_1_*:*_84795984_*|*_10007_*:*_1_*:*_363585326_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_76327819"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10458", "fixedVersions": [], "id": "10458", "issueType": "Sub-task", "key": "TK-234", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10509", "parentSummary": "Response status code should reflect status of a service or services", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-06-26T12:29:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "dev work for status codes", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:43c81f8c-ae3f-46d9-84b0-c9c65e1da709", "body": "Looks like 2pts for docs", "created": "2015-07-22T14:33:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "Temporarily moving to backlog for Burnside prioritization", "created": "2015-10-23T16:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-17T12:56:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4999b4fb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyo1c7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "PE Core"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Jul/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2959153644_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_205905507612_*|*_10005_*:*_1_*:*_1799641272"}], "description": "As a Puppet Infrastructure Administrator, I want to configure the status communication timeout for the PE services that I monitor so that I can adapt the monitoring to reflect the varying latencies and other dimensions of my infrastructure.\n\n*In Scope*\n* Make the timeout for TK status service configurable by the user\n* Updating Puppet enterprise module ( adding parameter)\n\n*Out of Scope*\n* Specifying timeout on a service-by-service basis?", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10192", "fixedVersions": [], "id": "10192", "issueType": "Story", "key": "TK-233", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:47:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ability to configure timeout for status monitoring endpoints", "timeSpent": "PT0S", "updated": "2022-02-18T17:47:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-17T04:38:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@575a3393"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz0fbz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "blocker for another ticket in sprint"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_292412531_*|*_1_*:*_1_*:*_155163_*|*_10007_*:*_1_*:*_208252920_*|*_3_*:*_1_*:*_1528658_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10361", "fixedVersions": [], "id": "10361", "issueType": "Task", "key": "TK-232", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-06-23T00:11:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "extract tk-scheduler service from file-sync service", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:623c12b6ee1b5a0070293582] we'll take a look, thanks", "created": "2015-06-17T12:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-16T18:03:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@67a0ed7a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Risk Probability", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Low"}, {"fieldName": "QA Risk Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Low"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbjj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_754392833_*|*_10007_*:*_1_*:*_64529257_*|*_3_*:*_1_*:*_7010120_*|*_10009_*:*_1_*:*_17120663_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_18475089"}], "description": "HTTP responses from the Trapperkeeper Status Service incorrectly have their {{Content-Type}} headers set to {{application/octet-stream}}.\n\nI've seen this while consuming the Status Service in File Sync.  I also poked around at the Status Service test code and found that it also happens there.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10394", "fixedVersions": [], "id": "10394", "issueType": "Bug", "key": "TK-231", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-06-26T17:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Status Service responses have incorrect Content-Type header", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] we need help here - what is the endpoint to be called, and what is the plain text we need? ", "created": "2015-06-17T12:35:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "The 'full' [status API|https://github.com/puppetlabs/trapperkeeper-status/blob/master/documentation/query-api.md] uses\n\n{noformat}\n/status/v1/services\n/status/v1/services/<service-name>\n{noformat}\n\nso I suggest something like:\n\n{noformat}\n/status-simple/v1/services\n/status-simple/v1/services/<service-name>\n{noformat}\n\nPing [~accountid:623c08e1562ab90069f8aed4]: Do you think that's sane? Any better ideas?", "created": "2015-06-17T16:28:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "Adding a new top-level mount point seems weird. Wouldn't having it be a sub-endpoint under the /status/v1 path make more sense? \n\n{code}\n/status/v1/services-simple\n/status/v1/services-simple/<SERVICE>\n{code}\n\nor \n\n{code}\n/status/v1/simple\n/status/v1/simple/<SERVICE>\n{code}\n\nThis is by comparison with things like the puppetdb API, where it goes {{/<GLOBAL PREFIX>/<VERSION>/<THING>/<SUB-THING>}}. In this case, we're still fundamentally asking for status data, so it would make sense to stay under /status. ", "created": "2015-06-17T17:47:00.000000"}, {"author": "557058:0e68498a-af24-40c4-a3ec-8d424adeeabb", "body": "[~accountid:623c08e1562ab90069f8aed4]'s second suggestion is exactly what I had in mind.", "created": "2015-06-17T17:58:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "The /status/v1/simple construction is where I started, but then began to second guess myself. So Nick's plan it is!", "created": "2015-06-17T18:26:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Updated the description.", "created": "2015-06-17T18:28:00.000000"}, {"author": "557058:0e68498a-af24-40c4-a3ec-8d424adeeabb", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] are we going with {{/status/v1/simple}}? The updated description doesn't match that.", "created": "2015-06-17T18:31:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Oh, sorry. Updated again. ", "created": "2015-06-17T18:43:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "I'm assuming this defaults to critical level?\n\nOr do we need to expose the other levels via part of the URL?", "created": "2015-06-25T11:11:00.000000"}, {"author": "557058:0e68498a-af24-40c4-a3ec-8d424adeeabb", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] services are supposed to report the same state regardless of the level, so I think the right thing to do is get the critical status (since it'll be fastest) and base the simple response on that.", "created": "2015-06-25T11:45:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-16T16:30:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@684387c5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Risk Probability", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Medium"}, {"fieldName": "QA Risk Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Medium"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbjr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_127046_*|*_1_*:*_1_*:*_72293018_*|*_3_*:*_3_*:*_253384957_*|*_10009_*:*_1_*:*_170237523_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_19457086_*|*_10006_*:*_2_*:*_775546262"}], "description": "The monitoring service should expose a minimalist endpoint that returns very small amount of plain text (if any) and a status code for the service status, and does not take query parameters.\n\nAs a PE administrator, I want to configure my \"dumb\" device to monitor the status of PE components via status code response, so that I don't have to go out and buy something fancy to parse query params or a JSON response. I'm looking at you google network load balancer.\n\n*In Scope*\n* Create an endpoint that does not need to accept query params and returns the correct status for a service along with a minimal plaintext response\n* The endpoint should follow the structure \n{noformat}\n/status/v1/simple\n/status/v1/simple/<SERVICE>\n{noformat}\n* Endpoint's response body should be the :state field's content.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10360", "fixedVersions": [], "id": "10360", "issueType": "Story", "key": "TK-230", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Fixed", "resolutionDate": "2015-07-01T15:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ability to configure minimalist monitoring for status code and text response", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "+1 to a better enumeration, and using status codes for stupider devices.", "created": "2015-06-16T10:31:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] what should the names be for the minimum \"up\" and \"down\" keys, and is \"state\" the right name? ", "created": "2015-06-17T09:15:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "{{state}} works for me, especially for something like {{/status/v1/services/rbac}} or the like: \"The state of the RBAC service is running.\" \n\nWhat are the possible states? I'd be inclined to follow more or less what you'd get from {{service status}} or {{systemctl status}}, like\n\n{noformat}\nstarting\nrunning\nstopping\nstopped\nunresponsive\n{noformat}\n\nSo full response would be something like\n\n{noformat}\nHTTP/1.1 200 OK\nContent-Type: text/plain\n\nrunning\n{noformat}\n\nor \n{noformat}\nHTTP/1.1 503 Service Unavailable\nContent-Type: text/plain\n\nstopped\n{noformat}\n\nand so on.\n", "created": "2015-06-17T16:39:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df] I think for first pass/MVP we're going to be limited to boolean values for up/down and and 'unknown' - in that case, you suggest {{running}} {{stopped}} and {{unknown}} ? ", "created": "2015-06-17T16:57:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Yup, sounds good to me.", "created": "2015-06-17T17:00:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "IMO there's a difference between {{stopped}} and {{busted}}.  {{stopped}} sounds like maybe the service is just, intentionally, not running, and could be started.  That seems like a valid state, but not one that we're likely to be able to detect for our first pass (because if the service is not running then the webserver probably won't be running, so the client will just get an HTTP connection error).\n\nIt seems like what we need for our MVP is {{running}}, {{unknown}}, and something that would be the equivalent of {{borked}}?\n\n", "created": "2015-06-18T02:56:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "Ah, I reckoned {{unknown}} was the catch-all for a non-normal state (and that we'd add more specificity as further reqs and time allowed), but agree if we can't really say {{stopped}}, then another indicator of an {{error}} state is required. ", "created": "2015-06-18T08:52:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Related to the need for a \"borked\" state, Why do we have {{unknown}}?  I keep trying to come up with a scenario where someone or something would be able to do anything interesting with a response that amounts to, \"I don't know and I can't tell you why I don't know.\"  That state seems like it's just an error condition, which relates back to the \"borked\" state.\n\nIf we introduce an {{error}} state, I suspect it should replace {{unknown}}.", "created": "2015-06-18T09:29:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "I think the {{unknown}} state was intended to reflect that the monitoring system itself was having trouble/not reliable.", "created": "2015-06-18T11:26:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I believe \"unknown\" was for the case where a service's status callback function throws an exception.  In such a case it could just be bad code in the status callback, and the service could still be operating properly.\n\nI suspect we'd still return a 50x in this case, though.", "created": "2015-06-18T15:34:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "So it sounds like we're settling on {{running}} {{error}} and {{unknown}} with both {{error}} and {{unknown}} returning 50x. ", "created": "2015-06-22T14:50:00.000000"}, {"author": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "body": "\ud83d\udc4d", "created": "2015-06-22T14:52:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-16T08:54:00.000000", "creator": "623c12b6ee1b5a0070293582", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2b04eb2a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbjb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_87608319_*|*_10009_*:*_1_*:*_66178562_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_27437039_*|*_10004_*:*_1_*:*_29816319_*|*_10006_*:*_1_*:*_683427918"}], "description": "This suggestion comes out of the [Status monitoring endpoints in pe-console-services|https://groups.google.com/a/puppetlabs.com/d/msg/dev-team/bW7EW5jq5kU/q7UfyAGAvCoJ].  Chris mentioned:\n\n{quote}That sounds like a good idea.  I kind of hated the name 'is_running' anyway... it has a \"name smell\" to it, if that's a thing.  :)  Would you like to create a ticket to capture this suggestion?  And put it into the \"status service\" epic?{quote}\n\nConsider an example status response that looks like the following:\n\n{code}\n{\n   \"is_running\": \"true\",\n   \"detail_level\": \"info\",\n   \"status\": {\n      \"db_up\": true\n   }\n}\n{code}\n\nThe {{is_running}} key was originally intended to serve load balancers and their need for a binary value representing availability for forwarding decisions.  If the needs of a load balancer are met some other way, e.g. using HTTP status codes rather than data in a JSON encoded body, then it would be helpful to rename this key to {{state}} (or something) and change the semantics to enumerate specific service states.  For example, the [github api|https://developer.github.com/v3/repos/statuses/] enumerates pending, success, error, or failure for their problem domain.\n\nAs for the values, I suggest we start small with only a few states, but avoid the use of {{true}} and {{false}}.  While this is the most simple enumeration that captures all states, which may technically meet requirements, it will be problematic in the future because some states will be difficult to categorize as true or false.  These values also make more sense for a predicate like {{is_running}}, but will be less applicable for {{state: true}} or other similar names.  Finally, a binary state will make it difficult to enumerate future states as the binary value already covers the entire space of possible states.]\n\n\n*In Scope*\n* Rename {{is_running}} key to {{state}}\n* {{state}} can have three values\n** {{running}}\n** {{error}}\n** {{unknown}}\n\n*Out of Scope*\n* Additional states (which can be added in future releases)\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10554", "fixedVersions": [], "id": "10554", "issueType": "Improvement", "key": "TK-229", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c12b6ee1b5a0070293582", "resolution": "Fixed", "resolutionDate": "2015-06-26T17:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Rename is_running key to \"state\" and enumerate values", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8] [~accountid:63d40635a05386069cdb69d6] do you guys have any thoughts on whether there are security implications here, and whether we should change the default behavior?  [~accountid:557058:dbc53efe-57a8-4acd-b329-21bc29e30ce8] [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] I'm not really even sure what all the proxy middleware is still getting used for?", "created": "2015-07-01T11:13:00.000000"}, {"author": "557058:f79f8af3-d468-4e76-b115-311ddf4eb9a4", "body": "Preben stopped by and we had a short conversation about this. As explained to me, it looks like this behavior is unexpected/noncompliant: redirect status is typically passed through/returned the same as any other HTTP response by the platforms I'm experienced with (HA Proxy, HTTPD mod_proxy, nginx, F5 BigIP), not parsed/followed and then returned. \n\nI recommended that the behavior be brought in line with the way other tools handle this. As for security implications, I'm not sure this opens up a vulnerability -- there's numerous other things that would have to be compromised to take advantage of this, but I'm sure someone more clever than me could think of something malicious to do with it.", "created": "2015-07-01T14:33:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] maybe it would make sense to just change the default behavior to *not* follow redirects?  I'm guessing that would be like a 2 minute change and would end up causing the normal behavior to be the same as what [~accountid:557058:f79f8af3-d468-4e76-b115-311ddf4eb9a4] describes that he would expect to see?", "created": "2015-07-02T02:59:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I agree, that might be a good approach to take. I'll pull this ticket into the sprint and get a PR up, I think it'll take approximately 2 minutes to change.", "created": "2015-07-06T12:17:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "-[~accountid:557058:3bbf1c83-df0e-4372-887d-cfc38dee9330] the linked PR has been merged! Let me know if there's anything else that needs to be done for this.-\n\nThat was the totally wrong ticket! Sorry.", "created": "2015-07-16T14:32:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I don't have a problem with moving to the model of not having redirects be followed automatically by default when using the proxy middleware.\n\nI recall we had a similar discussion about this when we considering redirect support for the reverse proxy functionality we exposed through {{trapperkeeper-webservices-jetty9}}'s {{add-proxy-handler}} / {{ProxyServlet}}.  In that case, I think we decided as well that it would ultimately be best for the 3XX response to be sent back to the original client rather than being followed by the servlet.  One issue we acknowledged at that time, though, was that it would be best to have the {{Location}} header in the response to be munged such at the client, assuming it chose to follow the redirect, would follow the redirect back though the same reverse proxy -- similar to what is described at https://docs.trafficserver.apache.org/en/5.3.x/admin/reverse-proxy-http-redirects.en.html#handling-origin-server-redirect-responses.  This assumes that the the node on which the middleware reverse proxy was running would have a greater likelihood of being able to resolve the intended target of the redirect than would the original client.\n\nIt seems like we also should consider whether the location header munging should factor into the {{ring-middleware}} redirects.  I'm not sure if it's a given that we would want this for all cases - like if {{ring-middleware}}'s proxy might ever be employed in a situation which isn't similar to what you'd see with a typical reverse-proxy.  (Ignoring the fact that {{ring-middleware}} doesn't allow for \"full\" reverse-proxy semantics like populating {{X-Forwarded}} HTTP headers and the like.)  It seems like that's basically what we had in mind for this, though.\n\nIIRC, we didn't quite complete the location header munging work for tk-jetty9's {{add-proxy-handler}} -- see TK-33 and https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/66.  I think it would be good to file a follow-on ticket to research into this.  Maybe we could link the work together with TK-33 to come up with a header munging approach that could be reused across both APIs?  [~accountid:623e7507866b810069e57527] or [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - what do you think?", "created": "2015-07-17T13:31:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to master of {{ring-middleware}} at [a84ca0|https://github.com/puppetlabs/ring-middleware/commit/a84ca0e0f7040f90d32720c677be1f3b57d68947].", "created": "2015-07-17T13:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-12T11:10:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f6430fa"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyonhz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_250508186_*|*_1_*:*_1_*:*_2077630139_*|*_10007_*:*_2_*:*_954278985_*|*_3_*:*_1_*:*_1340170_*|*_10009_*:*_1_*:*_75959_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_72540"}], "description": "When ring-middleware was written, the intent was for an error code to be returned when a redirect to a non-target host was hit. It seems that this does not actually work as intended due to a poorly written test. We need to ensure that ring-middleware returns an HTTP 500 or 502 error when proxying a redirect to a non-target host.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10457", "fixedVersions": [], "id": "10457", "issueType": "Bug", "key": "TK-228", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-07-20T11:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ring middleware will follow proxy-redirects to non-target hosts", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "(found sweeping epics for Burnside) [~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] this shows up as an epic on the puppet server board - is that right? is the work still in progress?", "created": "2015-10-19T12:27:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] I don't think we've started work on this.  [~accountid:623e7507866b810069e57527] Can you add any details here?", "created": "2015-10-20T09:48:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0][~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] No work on this issue has been started to my knowledge.", "created": "2015-10-20T10:49:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Hocon CI module pipeline starts here:\nhttps://jenkins-modules.puppetlabs.com/job/forge-module_puppetlabs-hocon_init-merge_master/\n\nNo one has touched this ticket in 7 months.  It appears that the \"fix\" was to stop testing Windows and Solaris.", "created": "2016-07-20T15:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-05T12:23:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@14a645de"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xfr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Oct/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_428691007_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_35093420850"}], "description": "The HOCON CI pipeline fails when it hits the PE jobs on Windows and Solaris. On Solaris, this is due to some of the acceptance tests we've written failing. On Windows, it's because Windows lacks a gem command, but the module requires that we install the hocon gem.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10191", "fixedVersions": [], "id": "10191", "issueType": "Task", "key": "TK-227", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Fix", "resolutionDate": "2016-07-20T15:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Fix hocon module CI failures on Windows and Solaris", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-06-02T11:26:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3e617fd3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xev:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_88334830_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_85281497715"}], "description": "The utility functions/macros in {{puppetlabs.trapperkeeper.testutils.bootstrap}} - e.g. {{with-app-with-config}} - should attempt to call the {{stop}} functions of the services in the case when an error is thrown during {{init}} or {{start}}.\n\nThis normally happens via the {{shutdown!}} function, when Trapperkeeper is running as it would in production; however, this does not happen when using the test helpers.  This can result in unfortunate behavior in tests - e.g. a service which initializes some global state in {{init}}, throws an exception in {{start}}, and then does not get a chance to clean up said global state since its {{stop}} function is never called.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10601", "fixedVersions": [], "id": "10601", "issueType": "Improvement", "key": "TK-226", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Fix", "resolutionDate": "2018-02-14T12:16:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Test helpers should attempt to stop services if an error occurs during init/start", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper", "TrapperKeeper / UI"], "created": "2015-06-02T10:51:00.000000", "creator": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@adee849"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz08fb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "UX Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623cfc5b01f8660070b787cf"}, {"fieldName": "UX Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_692756658_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_18315348473"}], "description": "From [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]:\n\nbq. The first would be part of the HOCON gem itself.  It'd be filed as a ticket against the TK project.  It'd let you do stuff that was something like:\n\nbq. `hocon set --file /tmp/foo/bar/conf --setting foo.bar --value \"BAZ!\"`\n\nbq. (obviously that syntax is totally made up and we could probably come up with something better, but the idea would be that it'd be a generic tool for manipulating any hocon file irrespective of its use case.  We could have a corresponding 'get' subcommand as well, for reading values.)", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10358", "fixedVersions": [], "id": "10358", "issueType": "Improvement", "key": "TK-225", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:8f2288c8-aafd-4043-8c36-5121d7f0a7df", "resolution": "Won't Fix", "resolutionDate": "2016-01-08T09:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Provide CLI tool to manipulate entries HOCON files", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "That seems reasonable.  I'd be a little worried that we don't have any sort of validation for identifiers for services, so you'd be relying on the fact that service A chose a well-known service ID string to use when it registered, and service B would have to be quite certain about what that string was going to be, and that it wouldn't change in the future.\n\nNot an unsolvable problem but it probably implies that we'd want to come up with some automated way of computing the id strings, or at least a very well-defined best practice, so that we minimize the risk.\n\nMight be worth considering baking that dependency specification into the status service API directly, so that we could fail fast if specified dependencies don't exist?  Dunno.", "created": "2015-06-02T09:22:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "I'm confused -- how is this any different from the way that dependencies are already specified? I don't think this introduces any further caveats to that process nor requires another mechanism.\n\nMy conception of how this would work is that the status service would have a function where you could pass it a service obtained from tk.services/get-service, and get back the status function that that service registered, or nil if they didn't register any.", "created": "2015-06-02T10:50:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:1381f112-1c4e-4869-ba34-30602d945124] that sounds good, I'm in agreement--it's just not how the services register their status callbacks today, so we don't currently have any way for the status service to map from the service instance back to the callback.  Right?\n\nAssuming we solve that, I'm on board.", "created": "2015-06-03T07:57:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "For some reason I just assumed that there'd be some dynamic method of checking what TK service is being initialized. If not, that means we'd need to change the API for registering the callback to pass the service instance as well? That seems like something we should do sooner rather than later.", "created": "2015-06-11T12:47:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "yeah, having the registration function take the service instance as an argument seems like it could be useful for other reasons.  And I agree that if we're going to change that we should do it soon, before we ship anything that uses the status service.\n\n[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] any opinions?", "created": "2015-06-11T13:46:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Don't really have any opinions.  Sounds fine.  One thought is that the API to get a status function can probably just take a keyword which corresponds to a protocol - if {{get-service}} needs to be called, the status service can take care of that part instead of requiring callers to do it.\n\nbq. having the registration function take the service instance as an argument seems like it could be useful for other reasons\n\nWhat other reasons?", "created": "2015-06-11T15:25:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "No opinions really, that seems fine to me. Agreed about using the protocol name if possible.", "created": "2015-06-12T11:42:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] - Isn't this exactly what you implemented somewhat recently?", "created": "2016-02-17T16:44:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:11a50a90-5585-4229-994a-72322be4a7d7] says yes.", "created": "2016-02-17T17:02:00.000000"}, {"author": "557058:11a50a90-5585-4229-994a-72322be4a7d7", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] yes, tk-status has a function to retrieve the status function by name (https://github.com/puppetlabs/trapperkeeper-status/blob/master/src/puppetlabs/trapperkeeper/services/status/status_service.clj#L15) which we use to get the file-sync storage service status function (https://github.com/puppetlabs/code-manager/blob/2016.1.x/src/puppetlabs/code_manager/services.clj#L101)", "created": "2016-02-17T17:04:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-06-01T15:58:00.000000", "creator": "557058:1381f112-1c4e-4869-ba34-30602d945124", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2a321e1d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xen:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_157678357_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_22400211483"}], "description": "Many of our TK services' statuses depend on the status of the services that they depend on. To that end, it would greatly simplify their own status checks if the TK status service exposed the registered status functions of the dependency services, so they could be called in the dependent service's status function.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10614", "fixedVersions": [], "id": "10614", "issueType": "New Feature", "key": "TK-224", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:1381f112-1c4e-4869-ba34-30602d945124", "resolution": "Done", "resolutionDate": "2016-02-17T17:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Services should be able to check status of services they depend on", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] can you provide a more concrete example of when this would be needed?", "created": "2015-05-14T04:44:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "+1, this seems like a reasonable improvement", "created": "2015-05-14T10:17:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "As soon as the PR Jeff and I are working on lands I can link to some code, but specifically we needed to implemented backwards compatibility with the way the master routes were defined in Puppet server 2.0. In order to properly implement this I needed to reach around the service and grab the routes directly from the config then make decisions on how I used it. If we're okay with the routing service being used this way, no big deal, but it seems like I shouldn't be playing around directly with a foreign service's config.", "created": "2015-05-14T10:27:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "My worry is that the 90% case is going to be to just grab the route and add a ring handler, so this proposal would basically necessitate that all consumers of the service add a nil check to their code where they didn't have one before.\n\nThat's not to say it's not doable, but I still don't feel like I have a good understanding of your use case.\n\nOff-the-cuff this seems like a subtle but important API change that could have repercussions for existing users of the service, so I'd want to be really certain we'd thought through those and that the use case was worth the consequences.\n\nAn alternate option might be to add a new function to the protocol (e.g. `get-route-if-defined` or similar), which had the alternate behavior.", "created": "2015-05-15T00:07:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "Ahh yes, that approach makes sense (adding a new service function). I probably should have simply stated the issue rather than suggested the fix. For more information on what exactly I was doing, here's the code I meant to refer to:\n\nhttps://github.com/puppetlabs/puppet-server/blob/2.1.x/src/clj/puppetlabs/services/master/master_service.clj#L11-L26", "created": "2015-05-15T14:50:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:05:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-05-13T11:03:00.000000", "creator": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@409b5c9f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xd3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_430280236_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_214792292851"}], "description": "The web routing service should maybe return a nil if the requested route can't be found instead of throwing. In some situations a service may need to programmatically respond to a missing route instead of immediately failing. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10553", "fixedVersions": [], "id": "10553", "issueType": "Improvement", "key": "TK-223", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:05:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Web routing service should return nil and not throw", "timeSpent": "PT0S", "updated": "2022-03-08T10:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I believe this should be fixed with the recent PR from [~accountid:557058:4d037d5f-6e67-465d-84d3-9631f5599649] that landed in the master branch.\n\n[~accountid:623e7507866b810069e57527] we need to get a release out that contains that fix ASAP.", "created": "2015-05-13T01:44:00.000000"}, {"author": "557058:4d037d5f-6e67-465d-84d3-9631f5599649", "body": "Tested and ended up with this:\n\n{noformat}\n puppet-admin : { client-whitelist : [\n      # hardcoded value\n      \"1\"\n  ] }\n{noformat}\n\nSo it looks like you CAN set it, but it also looks like it's stringifying a numeric within the array in the version of Puppet I tested on (3.7.4).  I'm wondering if we should get code in there to fix this (probably)", "created": "2015-05-13T06:45:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "I should have supplied the information stating what puppet version and puppetserver version I observed issues on:\nPuppet Version = 4.0.0\nPuppetServer Version = 2.1.0.SNAPSHOT.2015.05.08T0410", "created": "2015-05-13T09:53:00.000000"}, {"author": "557058:4d037d5f-6e67-465d-84d3-9631f5599649", "body": "Yeah, this error bubbled up because there was no getter method for the type property.  That should have been fixed with my changes.  Can you test from master?", "created": "2015-05-13T10:13:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:4d037d5f-6e67-465d-84d3-9631f5599649]\nJust to make sure, I tested it in puppet 4, and the numbers don't get stringified.\n\n[~accountid:623e7507866b810069e57527] and I were discussing. For puppet 3, it seems like there are a few options:\n* Add a param called something like {{parse_numbers}}\n  ** For single values, try to convert it to a number\n  ** Attempt to convert all the items in a list to numbers\n  ** Attempt to convert all the values in a hash to numbers\n  ** Do it recursively for nested structures?\n\nNone of this seems great, for a lot of reasons. People could conceivably want to mix numbers and quoted number in a list, and this would force them to go all one way or the other. It would also just be confusing (But so is everything becoming strings...)\n\nWhat are your thoughts [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]?", "created": "2015-05-14T16:23:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "If it works in Puppet 4 (which will be the version of Puppet in the first PE release that could conceivably ship this code), I think I'm probably OK with it as-is... but would be happy to discuss the options for Puppet 3 in more detail if [~accountid:557058:4d037d5f-6e67-465d-84d3-9631f5599649] or others think it's important.\n\nOne thing for certain is that if it works properly in Puppet 4, then even if we try to put in one of those heavy-handed hacks for Puppet 3 we need to make sure they aren't used in the Puppet 4 code path.", "created": "2015-05-14T23:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4] do we have a product owner for this?  We need to make a call about whether it's OK to say Puppet 4 is the minimum supported version, but I'm not sure who to ask.", "created": "2015-05-19T10:27:00.000000"}, {"author": "557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] & [~accountid:70121:caffdbd6-f73d-4ae9-9c82-c4badf061584] can you review and provide direction?  Please let Chris know if you need any additional information.", "created": "2015-05-19T10:29:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "Please target Puppet 4 for this work.", "created": "2015-05-19T11:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "OK", "created": "2015-05-21T03:57:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-05-12T17:03:00.000000", "creator": "557058:bab073e0-f060-421e-9465-366c4060cc31", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4b7aef03"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyou4n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_70644262_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1208460665"}], "description": "Given this manifest snippet:\n  hocon_setting { 'puppet-admin:client-whitelist' :\n    ensure      => present,\n    path        => '/etc/puppetlabs/puppetserver/conf.d/puppetserver.conf',\n    setting     => 'puppet-admin.client-whitelist',\n    value       => [1],\n    type        => 'array',\n    provider    => 'ruby',\n    }\n\nWe see the error \"Error: /Stage[main]/Puppetserverconfyfoo/Hocon_setting[puppet-admin:client-whitelist]: Could not evaluate: undefined method `type' for #<Puppet::Type::Hocon_setting::ProviderRuby:0x00000000a25300>'", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10511", "fixedVersions": [], "id": "10511", "issueType": "Bug", "key": "TK-222", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bab073e0-f060-421e-9465-366c4060cc31", "resolution": "Won't Fix", "resolutionDate": "2015-05-27T12:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "can't set type => 'array' in puppetlabs-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] I don't think that the first case (\"puppet resource hocon_setting\") is possible.  I think that can only ever work for resources where there is a system command that lists *all* of the resources of a type on a system", "created": "2015-05-18T11:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-05-12T16:33:00.000000", "creator": "557058:bab073e0-f060-421e-9465-366c4060cc31", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@69dee124"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xcv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1277064281_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_2_*:*_36299002134"}], "description": "As a puppet command line user, I want to be able to use commands like ;\n\"puppet resource hocon_setting\" to return a list of managed hocon settings\n\"puppet resource hocon_setting puppetserver.jruby-puppet.max-active-instances = 2\" to update this setting on the fly.\n\nThis might require making hocon a native type.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10552", "fixedVersions": [], "id": "10552", "issueType": "Improvement", "key": "TK-221", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bab073e0-f060-421e-9465-366c4060cc31", "resolution": "Won't Do", "resolutionDate": "2016-07-20T14:20:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "make hocon work with puppet resource", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-05-12T16:19:00.000000", "creator": "557058:bab073e0-f060-421e-9465-366c4060cc31", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3a27562e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzv2n:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_496900905_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_1567101726"}], "description": "Using the puppetlabs-hocon module requires the user to run \"gem install hocon\" to get it working.  The module should install this on behalf of the user.\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10407", "fixedVersions": [], "id": "10407", "issueType": "Bug", "key": "TK-220", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:bab073e0-f060-421e-9465-366c4060cc31", "resolution": "Duplicate", "resolutionDate": "2015-06-05T13:39:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Use of the puppetlabs-hocon module requires `gem install hocon`", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "+1 I'm tired of Clojure keywords with underscores in them.  :)", "created": "2015-06-11T17:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-05-08T17:31:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Server"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2efecfa"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xqf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_224387045_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_13927206770_*|*_10005_*:*_1_*:*_73371557560"}], "description": "We have a convention of using underscores in keys in JSON output. Currently, the status service is achieving this by manually constructing a map. We should see if we can figure out a better way of doing this that would result in keys that we want munged being munged and keys we don't want munged (e.g. user supplied data) not.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10456", "fixedVersions": [], "id": "10456", "issueType": "Task", "key": "TK-219", "labels": ["metrics", "refactoring"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Fix", "resolutionDate": "2018-02-14T16:31:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Handle hyphen->underscore in keys in status service JSON output", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Thanks, [~accountid:557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52], good call.  This came up on another ticket and I think we should do it.\n\nThis ticket also highlights the fact that I didn't mention anything about HTTP status codes in the docs.  :(", "created": "2015-05-11T06:38:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:79cfdf4b-b7db-45b4-904b-68a82fb46933] [~accountid:557058:5f998a8b-08b1-46f5-beb0-60cd1d60b36b] [~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] [~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c] 503 sound good to you all?", "created": "2015-05-11T06:42:00.000000"}, {"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "To be clear, the proposal is that if you hit the aggregate `/status/v1/services` and _any_ of the services aren't running, it will return a 503?\n\nConversely, the singleton case `/status/v1/services/<service-name>` , seems pretty straight forward to me.\n\nWhatever is useful for parsing by load-balancers really. Like I've stated before it doesn't _have_ to be a http status code since load balancers grep across a raw response (a new header could also do the job), but I'm fine with status codes in theory, just be mindful that 503 could be misconstrued with the actual /service endpoint failing, as opposed to the service its monitoring being down. Either way it means something is wrong I guess ... and really, the logic for 'failure' is any response that does not contain \"200 OK\" (that exact string usually fwiw), so that's precisely how we should document this for load-balancer use.\n\nSo yeah, I'm okay with non-\"200 OK\" status codes indicated the services monitored have failed. Just be mindful it also might indicate the service endpoint itself might be broken (for whatever reason).", "created": "2015-05-11T07:33:00.000000"}, {"author": "557058:ad2090d1-8a61-4530-9228-7d89570c23b7", "body": "Seems reasonable to return a straight 500 in the case of a failure in the service endpoint itself.", "created": "2015-06-10T14:31:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-05-08T16:35:00.000000", "creator": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@598b65ab"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Risk Probability", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Low"}, {"fieldName": "QA Risk Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Medium"}, {"fieldName": "QA Risk Severity Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Unlikely to get wrong, but would be pretty bad if we did..."}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbiv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_842523657_*|*_10007_*:*_1_*:*_14452_*|*_3_*:*_1_*:*_100372_*|*_10009_*:*_1_*:*_424023699_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_93439768_*|*_10006_*:*_2_*:*_3289931739_*|*_10005_*:*_1_*:*_10333640"}], "description": "It's easier to write health checks for simple up/down state based on a status code instead of parsing a JSON response. Some load balancers expect this. For example, if is_running for any of the services is not \"true\" the response could have a 503 instead of a 200 status code.\n\n*In Scope*\nUpdate TK status Service to return 200 if service is known to be running & functional and 503 if the service is known to be degraded", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10509", "fixedVersions": [], "id": "10509", "issueType": "Story", "key": "TK-218", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "resolution": "Fixed", "resolutionDate": "2015-07-01T15:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Response status code should reflect status of a service or services", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-05-08T07:44:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@19bb0bde"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyosnb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_25589_*|*_1_*:*_1_*:*_446885783_*|*_10007_*:*_1_*:*_446608567_*|*_3_*:*_2_*:*_136934397_*|*_4_*:*_1_*:*_532986212_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_107750237"}], "description": "It would be much easier for service authors to write their callback functions to react to the detail level if the detail levels could be sorted or translated to an integer.  So, for example, if we provided a function like `get-detail-level` that returned 0, 1, and 2 for critical, info, and debug, respectively, then service authors could write code that was something like this:\n\n{code}\n(let [detail-level \"debug\" ; this would come from the request\n      basic-status-info {:basic \"hi\"}]\n      (cond-> basic-status-info\n        (>= (get-detail-level detail-level)\n          (get-detail-level \"info\"))\n        (assoc :info \"hiya\")\n\n        (>= (get-detail-level detail-level)\n          (get-detail-level \"debug\"))\n        (assoc :debug \"hiya, how are you doing\")))\n=> {:debug \"hiya, how are you doing\", :info \"hiya\", :basic \"hi\"}\n{code}\n\nThis would be a lot cleaner than how you'd have to write this today, I think.\n\nAlso we could probably figure out a way to remove a lot of boiler-plate from the snippet above, so that's not actually a proposal of an API or anything :)  Just capturing the idea.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10390", "fixedVersions": [], "id": "10390", "issueType": "New Feature", "key": "TK-217", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2015-05-27T15:57:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Provide a way to look up a numeric sort order for detail levels", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-05-05T07:22:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@66d7e5cb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovfj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Found bug"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_61709_*|*_1_*:*_1_*:*_96170_*|*_3_*:*_1_*:*_14967379_*|*_5_*:*_1_*:*_0"}], "description": "The status service has a hard-coded call to compojure's `context`, passing in a path of \"/status\".  This means that if the webrouting config tries to use any other value, the service won't run properly.\n\nh3. QA\n----\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10356", "fixedVersions": [], "id": "10356", "issueType": "Bug", "key": "TK-216", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-05-05T11:34:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "status service has hard-coded URL prefix", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:b3e6b0df-198d-45f8-9ba5-d41f90e80ced", "attachments": [], "comments": [{"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "The consolidated helper methods were released in ring-middleware 0.3.0.\n\nThis ticket has remained open to track the PRs to uptake the new consolidated helpers.", "created": "2016-05-10T12:03:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "As part of updating the library it was brought up to our standard conventions and schemas were added. An added schema has caused a regression in a previously existing middleware (wrap-proxy) so there will be a 0.3.1 shortly, along with another round of version bumps for our consumer projects.", "created": "2016-05-10T12:04:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "The fix for the regression mentioned above is in: https://github.com/puppetlabs/ring-middleware/pull/30", "created": "2016-05-10T12:05:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-30T15:57:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@26d1d0a4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-447"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyndqv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_23987207_*|*_1_*:*_1_*:*_504225132_*|*_10007_*:*_1_*:*_770781189_*|*_3_*:*_1_*:*_1123621762_*|*_5_*:*_1_*:*_11137659607_*|*_6_*:*_1_*:*_0_*|*_10011_*:*_2_*:*_318061641_*|*_10006_*:*_1_*:*_30251242951"}], "description": "https://github.com/puppetlabs/trapperkeeper-status/blob/master/src/puppetlabs/trapperkeeper/services/status/ringutils.clj, https://github.com/puppetlabs/pe-file-sync/blob/master/src/clj/puppetlabs/enterprise/ringutils.clj, and https://github.com/puppetlabs/puppet-server/blob/master/src/clj/puppetlabs/puppetserver/ringutils.clj contain a lot of duplicate ring middleware code.\n\nThis should be moved out into a common library (possibly https://github.com/puppetlabs/ring-middleware/?)", "epicLinkSummary": "Non PE- Puppet Server tickets to be scoped", "estimate": "PT0S", "externalId": "10404", "fixedVersions": ["PE 2016.2.0"], "id": "10404", "issueType": "Task", "key": "TK-214", "labels": ["low-hanging-fruit", "server"], "originalEstimate": "PT0S", "parent": "16693", "parentSummary": "Non PE- Puppet Server tickets to be scoped", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Done", "resolutionDate": "2016-09-22T10:10:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Move duplicated ring middleware into common library", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ping [~accountid:557058:1b9bde12-f0a1-4355-ab73-7fc4ec69ba79] [~accountid:623c08e1562ab90069f8aed4], just wanted to make sure you saw this go through.\n\nhttps://github.com/puppetlabs/trapperkeeper-status/pull/14\n\nThis is a generic service that we are going to be re-using across several other services (kind of like what we're doing with our trapperkeeper-jetty service).  I believe that the Node Management team will probably actually be the first team to ship something, with Puppet Server following shortly thereafter.\n\nDoesn't need to go into the public docs for now, but probably will at some point?\n\nShould we create a pre-docs item for this?", "created": "2015-05-11T07:10:00.000000"}, {"author": "623c08e1562ab90069f8aed4", "body": "Ah, cool, thanks for the heads-up. Pinging also [~accountid:557058:d9fe472a-950d-429a-b103-3d6c896a6529] and [~accountid:557058:43c81f8c-ae3f-46d9-84b0-c9c65e1da709] \u2014 I feel like the answers here should be fairly clear, but I want to make sure you're looped in and you might think of something I wouldn't. \n\nItem one: This is related to DOC-1632, where we'd like to get our API docs harmonized across all our projects. These look pretty close already, tho. \n\nItem two: I think the thing to do is: once server team or node mgmt start developing a version that will incorporate this service, please make an \"incorporate TK status API into our docs\" ticket for that version, and get our attention again. At that point, we'll figure out how to wrangle the files and stuff. Does that seem like a good approach? ", "created": "2015-05-11T11:34:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Sounds good to me", "created": "2015-05-12T03:10:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-29T12:44:00.000000", "creator": "557058:f1e252bd-73da-4e0e-90f7-f0aefb98d28c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5a560513"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovev:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_45788_*|*_1_*:*_1_*:*_138924613_*|*_10007_*:*_1_*:*_22429995_*|*_3_*:*_1_*:*_14159321_*|*_10009_*:*_1_*:*_72236175_*|*_5_*:*_2_*:*_230883772_*|*_10006_*:*_1_*:*_610120230"}], "description": "\n___________________\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10401", "fixedVersions": [], "id": "10401", "issueType": "Task", "key": "TK-213", "labels": ["documentation"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:f1e252bd-73da-4e0e-90f7-f0aefb98d28c", "resolution": "Fixed", "resolutionDate": "2015-05-12T03:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Document TK status service API", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-29T12:10:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@eeadc4f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyoven:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_31871679_*|*_1_*:*_1_*:*_600943415_*|*_10007_*:*_1_*:*_122089887_*|*_3_*:*_1_*:*_3156207_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_18253540"}], "description": "If multiple functions are registered for the same {{status-version}}, an error should be thrown.\n\n___________________\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10613", "fixedVersions": [], "id": "10613", "issueType": "Improvement", "key": "TK-212", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2015-05-08T11:49:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Status Service should error if multiple functions are registered for a single version", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-29T11:23:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2497c39d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-1213"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynf5j:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_600655872_*|*_1_*:*_1_*:*_1790755_*|*_10007_*:*_1_*:*_1203174049_*|*_3_*:*_1_*:*_624726918_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_438050828_*|*_10006_*:*_1_*:*_749549288_*|*_10005_*:*_1_*:*_28359218425"}], "description": "If I create a protocol {{(defprotocol FooService}}) and then two services {{bar-service}} and {{baz-service}} that both implement that protocol, and then include both services in my {{bootstrap.cfg}}, TK will only start up the second service listed in the {{bootstrap.cfg}}. I would expect instead that it raise an error.", "epicLinkSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "estimate": "PT0S", "externalId": "10398", "fixedVersions": [], "id": "10398", "issueType": "Bug", "key": "TK-211", "labels": [], "originalEstimate": "PT0S", "parent": "15641", "parentSummary": "Improve UX for upgrades when users have modified bootstrap.cfg", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2016-05-03T13:56:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Trapperkeeper doesn't error if two services implementing the same protocol are started", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I meant this ticket as a vehicle for discussion, not a \"this must happen\"-kind of ticket.  (Perhaps an e-mail would have been better).", "created": "2015-04-29T12:13:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Oh, and I moved the issue about multiple functions to TK-212.", "created": "2015-04-29T12:14:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "So, we still haven't gotten around to discussing this, but it was kind of blocking something I was working on today so I pulled it in.\n\nHere are my thoughts:\n\n* `status-version` can't really be optional.  It's basically an API version, analagous to the way we're versioning our HTTP APIs, or the [Puppet report format](https://docs.puppetlabs.com/puppet/latest/reference/format_report.html#report-format-4).  Maybe there are some patterns / best-practices that we can recommend and add to our docs, but I don't really see a way this can be made to be optional without losing the ability to guarantee we're not breaking backward compat when services change their status information.\n\n* `service-version` seems too useful to be made optional, but I agree that it would be insanely tedious for users to have to manage a hard-coded copy of their version string in concert with their own release cycles.\n\n* `trptcolin/versioneer` in combination with maven/lein META-INF files seem like they provide a fairly sane solution for this\n\n* Since every consumer of the status service is probably going to want to use that ^^ in their call to the registration function, I thought it probably made sense to make a utility function in the status library that would handle this.  Users can optionally (and will, most likely, usually) call this to get their own version number before they register their callback handler.\n\nI'm open to discussion if anyone doesn't think those assumptions are valid, but it was easy enough to create a PR for the functionality described above that I went ahead and did it.", "created": "2015-05-06T07:44:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I think both of these versions should be optional.  \n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - I understand that you think that all of the applications we build on top of the status service should always specify these versions, and I am fine that - your reasoning about the importance of versioning HTTP APIs makes sense.  No disagreement there.\n\nHowever, I think I am considering this issue (and perhaps, the library as a whole) from the perspective of what makes it most flexible reusable in a variety of Trapperkeeper applications, perhaps those outside of Puppet Labs.  If I put myself in the shoes of a user in that perspective, I might ask \"Why do I have to specify all of these versions?\".  Even though we version all of our APIs at Puppet Labs, not all APIs everywhere are versioned, and thus enforcing users to supply these versions makes this a little bit less user-friendly in those cases.\n\nI understand that this is not the use-case for which you are optimizing for in this library.  I'm not going to lose any sleep if we keep these versions as required - just wanted to share my opinion and reasoning.", "created": "2015-05-07T11:28:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Oh, one other thing I forgot to mention ...\n\nAFAIK, these versions are not actually needed by the status service for anything - nothing about the functionality of the status service requires this data, so requiring them feels like an artificial restriction.  They feel like they fall into the category of \"recommended usage / best practices\" and not \"data that's required to fulfill a contract\".", "created": "2015-05-07T11:34:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We have a lot of business use cases for this service right now, and not a lot of time to deliver something for them (this was originally supposed to have been done about 2 months ago, by a different team, before priorities got shifted around based on release schedules), so I think it's reasonable to tailor the API towards our business use cases.\n\nIf we get a Jira ticket where someone (internal or external) is expressing consternation about the fact that these are required, we can look into relaxing the restrictions in a future release.", "created": "2015-05-07T13:53:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "I've been thinking about this for a while now, and I honestly don't have a strong opinion either way (which is why it's taken me so long to reply). I feel a bit more strongly that `status-version` should always be required, for the reasons Chris outlined, but I can also follow Kevin's reasoning that just because we think that's a good idea doesn't mean we should enforce it.\n\nHowever, ultimately I don't think requiring either of these things is a huge impediment to use this service, especially with the `get-artifact-version` function. I think for internal PL use it's probably better to require those, and if we do get feedback that these shouldn't be mandatory then it seems like that's probably not a backwards-breaking change?\n\nI think at this point we should close this ticket, since the PR for `get-artifact-version` has been merged, and we can always open a new one later if necessary.", "created": "2015-05-08T11:49:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-24T11:17:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1d77cc6c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovfr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Related to other code I was working on"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_276832_*|*_1_*:*_1_*:*_453188409_*|*_10007_*:*_1_*:*_29234617_*|*_3_*:*_1_*:*_158440610_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_570360030"}], "description": "Discuss whether {{status-version}} and {{service-version}} should be optional when a service registers a callback function with the status service.  See discussion on https://github.com/puppetlabs/trapperkeeper-status/pull/2/files#r29013853 and below.\n\nUPDATE:\nDecided that for now we'll keep both of these as required, since that matches our business need. Added a `get-artifact-version` function that can be used to grab the leiningen project version to use for `service-version`.\n\n\n\n\n\nh3.QA:\nRisk Assessment: N/A; New Feature.  Testing handled in SERVER-583", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10265", "fixedVersions": [], "id": "10265", "issueType": "Improvement", "key": "TK-210", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2015-05-08T11:49:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "status service: status-version and service-version should be optional", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [{"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "One question I have here is what to do if the output of the callback function that a service registers doesn't match the schema (that is, doesn't return a map that includes {{:is_running}}). It seems like there are a few options:\n1) when the service registers a callback function, test it using the default level and see that what it returns matches the schema (that it at least returns  {{:is_running schema/Bool}}) and throw an error that causes the application to fail to start if it doesn't\n- this seems a little weird because we're calling the status function before everything has started up?\n\n2) when one of the status endpoints is hit that would cause the callback function to be called, return an HTTP error\n- what happens if the rollup endpoint is hit and multiple services are running on the same jvm and one has registered a good callback function and one has not? should the whole response be a 500/error? or should there only be an error for the part of the response that is for that service?\n\n3) don't error at all, just return {{:is_running unknown}}\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] thoughts?", "created": "2015-05-05T19:17:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think doing number 3, plus logging something (probably at WARN level) is what I'd vote for.\n\nWe should definitely NOT do option 2 IMO, because of exactly what you're highlighting about one badly-behaved service breaking the endpoint for all of the other services.\n\noption 1 is interesting but kind of hard to predict how expensive it would be, and also, w/o calling it for every detail level and every status version for every service, we won't really know if they're broken anyway... so, doesn't seem worth the effort, IMO.", "created": "2015-05-06T04:44:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I think that's what made the most sense to me after writing up all of that, so I'll go with option 3. Thanks!", "created": "2015-05-06T10:00:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] the one other thing i was curious about was what the schema for the return value from the callback functions is going to look like.  If you look at my bunk PR against Puppet Server you can see where I kind of hacked a fake thing together for that", "created": "2015-05-06T10:01:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I was going with it being under a key - I currently have it as \n\n{code}\n{:is_running (schema/enum ...)\n :status schema/Any}\n{code}\n\nbut I don't have a strong preference as to the name of that key. Also, in the design doc that key is optional (a service doesn't have to return extra data) - do we want that to be the case?", "created": "2015-05-06T10:05:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Yes, I think it should be optional.\n\n{{:status}} or {{:status-detail}} seem like a good keywords to use there IMO.", "created": "2015-05-06T15:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-16T15:37:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@629845b4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovd3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_31885009_*|*_1_*:*_1_*:*_1108418047_*|*_10007_*:*_1_*:*_116099204_*|*_3_*:*_1_*:*_95976142_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_534709692"}], "description": "The design doc for the status service specifies that what is reported for each service should include a {{:is_running}} key which can return true/false/unknown.\n\nThis needs to be added to the status service.\n\nThe callback function that a service registers with the status-service should return a map that includes an {{:is_running}} key. The value for this should be the value that the status service reports.\n\nThis ticket should include fleshing out the schema for what the callback function returns and what the status service itself returns to include {{:is_running}}: see https://docs.google.com/document/d/1B6mmg_EwTo7QpKtE5fd2NHyrZEIopsNwRgKeZdZ0z2I/edit for more information.\n\n___________________\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10455", "fixedVersions": [], "id": "10455", "issueType": "Task", "key": "TK-209", "labels": [], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2015-05-08T11:49:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add :is_running to status service output", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "The module was released today onto the forge, so I'm going to close out this ticket.", "created": "2015-04-28T15:46:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-15T12:52:00.000000", "creator": "557058:f1e252bd-73da-4e0e-90f7-f0aefb98d28c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@79aef951"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu1r:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_59935216_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1073683352"}], "description": "_________\nRisk assessment: N/A; The HOCON work is best evaluated by the QA Integration Team for Shallow Gravy.  See ticket PE-9234.  Additionally this ticket creates a release.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10600", "fixedVersions": [], "id": "10600", "issueType": "Task", "key": "TK-207", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:f1e252bd-73da-4e0e-90f7-f0aefb98d28c", "resolution": "Done", "resolutionDate": "2015-04-28T15:46:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Release HOCON module under PuppetLabs namespace", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-15T09:17:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@59bbb635"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu2f:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_73272496_*|*_3_*:*_1_*:*_496394_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_36635"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10219", "fixedVersions": [], "id": "10219", "issueType": "Bug", "key": "TK-206", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-04-16T05:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "trapperkeeper-jetty9 tests don't report to hipchat", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-15T09:07:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3163b9a2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu27:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_73870833_*|*_3_*:*_1_*:*_491678_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_26397"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10190", "fixedVersions": [], "id": "10190", "issueType": "Bug", "key": "TK-205", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-04-16T05:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "trapperkeeper unit tests don't report to hipchat", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-15T08:32:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7d52ae9c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu1z:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_75956947_*|*_3_*:*_1_*:*_487303_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_39223"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10612", "fixedVersions": [], "id": "10612", "issueType": "Bug", "key": "TK-204", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-04-16T05:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client unit test jobs not logging to hipchat", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "One of the roadmap items that we submitted to the arch team recently for TK was to come up with a general solution for this.  Services would be responsible for providing some description of their configuration info, and then TK would do some validation of the config for each service at startup, and fail if something was awry.\n\nWhen we last left off, it sounded like [~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd] was hoping that the PuppetDB team might be able to take point on this.  [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] has also done a bit of POC work to brainstorm possible solutions for this.\n\nI think the next step is to do some design work on what the API for this would look like.  One thing I'm currently waffling on is whether or not we want prismatic schema to be a formal part of our API for this", "created": "2015-04-15T03:05:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "I don't think we need it immediately, per say. This ticket was filed more as a 'this would be nice to have for users.'", "created": "2015-04-15T09:27:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Awesome, thanks for capturing it.", "created": "2015-04-15T09:37:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I think that this would be a pretty significant change to TK, and I'm not sure that I am in support of it.  I am sympathetic to the issue, but I am not sure how this could be implemented in a way that makes sense for all TK apps.  It seems to be a big step beyond what I have been thinking of as \"validating required configuration data\" (which I think should be a feature that services can opt-in to, not required) and into the realm of forcing *all services* to tell TK which config keys they will be potentially reading.  That feels a little too heavy-handed for TK, which is supposed to be a relatively lightweight and general purpose library.\n\nAll of that said, I'm sympathetic to the cause here", "created": "2015-04-15T14:01:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] we're also happy to put some effort into this as well. How should we come to next steps? ", "created": "2015-04-30T09:40:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c] - It sounds to me like the three of us should get together for a chat.", "created": "2015-04-30T11:44:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "chat would be good, but however we decide to proceed on this i think we're going to want to have a design doc that all of the clojure teams can weigh in on before anyone starts writing code, so if any of the devs on your team have concrete thoughts on possible implementations, it might be worth writing up some notes or a proposal somewhere?\n\nif we do set up a chat i'm assuming it would probably be wise to loop in patrick or some other representative from your team as well.", "created": "2015-04-30T13:37:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] and [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] +1 on meeting & producing a draft proposal/design for review, though I probably don't need to be in it. [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] can you schedule this, and loop in [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] and [~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a]?\n\nThe backstory on bringing it up again is NMS team were discussing implementing something specific to RBAC and realized we should consider if we want to solve the problem more broadly.", "created": "2015-05-01T13:17:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Sure.", "created": "2015-05-04T17:03:00.000000"}, {"author": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "body": "I left a comment to this effect on PE-8627, but just wanted to note that I'm a bit surprised by what this ticket is asking for, and I'd rather have a feature that allowed us to specify required keys and error if those are missing, not error when unknown extra keys are supplied.", "created": "2015-05-12T14:51:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f] - ditto!", "created": "2015-05-12T14:54:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "Yep - probably just my brain working at it backwards.", "created": "2015-05-12T16:44:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "Updated to include both cases.", "created": "2015-05-12T16:46:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Months ago, I started working on an enhancement to Trapperkeeper which added a way for a service to define its required configuration.  This was implemented as an extra function that a service could (optionally) implement.  It was called {{reqiured-config}}, and it was similar to a lifecycle function (like {{init}}).  The contract was that implementations of {{required-config}} would return a schema, and Trapperkeeper would check the configuration against that schema, and terminate the startup process if it was not satisfied.\n\nFurther, I intended that part of this functionality would be to check the configuration data against *all* schemas, so that, if some required configuration was missing from multiple services, the error would not just mention the first one that happened to be checked - it would mention all of them.\n\nI also intended to implement the error handling such that a nice, user-friendly error message was logged which clearly stated which required configuration values were missing (and possibly also what type of data they required?).  i.e. - no stacktrace.\n\nI am not certain that a schema is the best way for services to express their required configuration, but I don't have a better idea at the moment.  A schema is certainly rather heavyweight in this case ... it seems like the what's really needed is a way to express a \"forest\", in the graph theory sense - i.e., a set of trees, where each node represents a configuration key.", "created": "2015-05-14T11:26:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-14T11:43:00.000000", "creator": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@55d614ee"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xan:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_86130028_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_217640779454"}], "description": "Currently, it's possible to specify a configuration key = value in a config file loaded by trapper keeper where the key is not actually known or used by any of the services.\n\nThe trouble is that if I misspell a configuration key, the service(s) can start up successfully and appear to be working fine - except my intended configuration has been quietly ignored.\n\nIf the service detects that required keys have not been supplied, an error should occur warning the user to supply the required key.\n\nIf when the service(s) starts up, if a configuration key is supplied that is not a known valid entry, either trapper keeper or the service should log a warning for the user (not sure of which makes sense in the underlying architecture).\n\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10307", "fixedVersions": [], "id": "10307", "issueType": "New Feature", "key": "TK-203", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Warn when required configuration keys have not been supplied", "timeSpent": "PT0S", "updated": "2022-03-08T10:24:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "attachments": [], "comments": [{"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "+1,000,000. Although the requirements look like its more about file polling rather than just SIGHUP, I like either/or. Some admins might find that changing a file and having the service restart a bit surprising - what if they make a typo. apachectl offers a validation service before it reloads itself, lower risk of breaking your service due to a typo, as it just refuses to reload.", "created": "2015-04-14T11:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We have a placeholder epic, SERVER-96, where we were eventually intending to address this, but it has not made its way up toward the top of the priority list yet.\n\nThat epic should probably be under TK rather than SERVER, because I do think that we should be able to come up with a general solution for it.\n\nWe haven't really even started scoping it yet, so, [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9], if this is working its way toward the top of your team's priority list we'd love for you to take it on.", "created": "2015-04-15T02:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "At PuppetConf contributor summit", "created": "2015-10-07T12:02:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I have a branch that has the restart lifecycle capability added to the TK app protocol:\n\nhttps://github.com/cprice404/trapperkeeper/tree/feature/master/TK-202-service-restart", "created": "2015-10-07T14:47:00.000000"}, {"author": "557058:fd17676f-b54f-4df6-b0e2-ce0f8a23c31e", "body": "This would be pretty useful for Client acceptance tests. Our estimate is it'd cut acceptance test runs by 30 minutes.", "created": "2015-10-30T12:13:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yep.  We have every intention of getting it in as soon as we have cycles.", "created": "2015-10-30T16:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-14T11:34:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@40fe8206"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-96"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Risk Probability", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "High"}, {"fieldName": "QA Risk Probability Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "This feature will get heavy use"}, {"fieldName": "QA Risk Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Medium"}, {"fieldName": "QA Risk Severity Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "If it doesn't work, there's an (awful) workaround of bouncing the server"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynr1b:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Hack week project"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_505227239_*|*_1_*:*_1_*:*_86624809_*|*_10007_*:*_1_*:*_2674973899_*|*_3_*:*_1_*:*_3356_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_21023430795"}], "description": "The easiest version of this would probably have TK handle SIGHUP and just restart all services without restarting the JVM.", "epicLinkSummary": "Support HUP for faster restart", "estimate": "PT0S", "externalId": "10454", "fixedVersions": ["TK 1.3.0"], "id": "10454", "issueType": "New Feature", "key": "TK-202", "labels": ["puppethack"], "originalEstimate": "PT0S", "parent": "16343", "parentSummary": "Support HUP for faster restart", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Done", "resolutionDate": "2016-01-20T13:52:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support HUP signal for restarting services", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "3", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "I've talked to [~accountid:557058:104b5720-714d-4539-b455-df472251ec89] and he's going to make a generic supported module pipeline for the HOCON module.", "created": "2015-05-11T17:37:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Moving this to \"Ready for Review\" to review the pipeline once [~accountid:557058:104b5720-714d-4539-b455-df472251ec89] has it created.", "created": "2015-05-15T10:18:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I've created an initial pipeline here:\nhttps://jenkins-modules.puppetlabs.com/view/4.%20cross%20platform/view/hocon/view/master/", "created": "2015-05-18T17:34:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "The pipeline is currently failing with PE because in the Gemfile it's set to {{gem \"beaker-rspec\", \">= 2.2\"}}, which is only pulling in beaker-rspec 3.0.0.... Which require beaker 1.x... so its pulling in Beaker 1.16.0, which has no idea how to install PE 3.8....\n\nCurrently I think beaker-rspec is in its 5.x series. We may want to investigate upgrading.", "created": "2015-05-18T21:37:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "So, I just tried investigating upgrading and I realized that my previous idea was incorrect. The *actual* reason that we're not installing a newer Beaker is because we're specifying a version of hocon. Apparently Beaker has depended on hocon \"~> 0.0.4\" since 2.8. So, since bundler can't install any version of Beaker >= 2.8 and the beaker-rspec after 3.0.0 pulls in the latest of Beaker 2.x it back tracks to using beaker-rspec 3.0.0 which was the last version that depended on a version of Beaker that didn't depend on a conflicting version of hocon.", "created": "2015-05-18T22:08:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "I've opened a PR to relax the hocon version Beaker pulls in to anything pre-1.0 here: https://github.com/puppetlabs/beaker/pull/817\n\nI'm sure if you hocon folks got together with the beaker folks ([~accountid:557058:4a426453-1a64-463f-9677-2fbefd23fb9c], [~accountid:623c0cebbef8a60068c7977d]) you can get this sorted out relatively quickly.", "created": "2015-05-18T22:45:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:104b5720-714d-4539-b455-df472251ec89] Thanks for setting this up for us!", "created": "2015-05-20T14:25:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-14T11:08:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2076b973"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyosnj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/May/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_108332_*|*_1_*:*_1_*:*_1297031974_*|*_10007_*:*_2_*:*_1371586610_*|*_3_*:*_1_*:*_5820916_*|*_10009_*:*_1_*:*_1043150291_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1053151929_*|*_10005_*:*_1_*:*_91774"}], "description": "We need to set up Travis and Jenkins CI for the puppetlabs-hocon module before we do a 1.0 release under the puppetlabs namespace.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10611", "fixedVersions": [], "id": "10611", "issueType": "Task", "key": "TK-201", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-06-08T16:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Set up CI for puppetlabs-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-14T10:23:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2bf429b2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xaf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_90847560_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_151193509600"}], "description": "We need to add a simple test for adding a map (and possibly an array as well) into a config file in puppetlabs-hocon's acceptance tests.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10551", "fixedVersions": [], "id": "10551", "issueType": "Task", "key": "TK-200", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Do", "resolutionDate": "2020-01-29T08:49:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add basic hash/map acceptance test to puppetlabs-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-04-14T10:21:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@12d7cafd"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xa7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_90933211_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_151193506644"}], "description": "A number of nodesets were recently remove from the puppetlabs-hocon acceptance tests due to various issues. We should work out these issues and add back a number of nodesets.\n\nThe primary issues are a lack of ruby 1.8 support and the \"gem\" command not being present on a number of the nodes, meaning the HOCON gem can't be installed.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10507", "fixedVersions": [], "id": "10507", "issueType": "Task", "key": "TK-199", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Do", "resolutionDate": "2020-01-29T08:49:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add more nodesets to puppetlabs-hocon acceptance tests", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "body": "I've got the work done on this, just need to push to github.", "created": "2015-04-09T15:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Released to clojars as v1.1.1:\n\nhttps://clojars.org/puppetlabs/trapperkeeper/versions/1.1.1\n\nThanks, [~accountid:70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854]!", "created": "2015-04-15T09:21:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-09T15:38:00.000000", "creator": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72777604"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzbyv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_493460646_*|*_3_*:*_1_*:*_2303479_*|*_5_*:*_1_*:*_0"}], "description": "Update the plumbing and schema library dependencies to the latest stable versions.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10354", "fixedVersions": ["TK 1.1.1"], "id": "10354", "issueType": "Sub-task", "key": "TK-197", "labels": [], "originalEstimate": "PT0S", "parent": "10599", "parentSummary": "Update prismatic schema and plumbing dependencies", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "resolution": "Fixed", "resolutionDate": "2015-04-15T09:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update prismatic dependencies in trapperkeeper", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "body": "I've got the work done on this, just need to push to github.", "created": "2015-04-09T15:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Released to clojars as v0.4.4:\n\nhttps://clojars.org/puppetlabs/http-client/versions/0.4.4\n\nThanks for the contribution, [~accountid:70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854]!", "created": "2015-04-15T09:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-09T15:37:00.000000", "creator": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@43f9ce6c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzbyn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_493466471_*|*_3_*:*_1_*:*_54105_*|*_5_*:*_1_*:*_0"}], "description": "Update the prismatic schema and plumbing dependencies to the latest stable version.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10218", "fixedVersions": ["HTTP-CLIENT 0.4.4"], "id": "10218", "issueType": "Sub-task", "key": "TK-196", "labels": [], "originalEstimate": "PT0S", "parent": "10599", "parentSummary": "Update prismatic schema and plumbing dependencies", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "resolution": "Fixed", "resolutionDate": "2015-04-15T08:42:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update prismatic dependencies in puppetlabs/http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "body": "I've got the work done on this, just need to push to github.", "created": "2015-04-09T15:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Released to clojars as v1.3.1:\n\nhttps://clojars.org/puppetlabs/trapperkeeper-webserver-jetty9/versions/1.3.1\n\nThanks, [~accountid:70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854]!", "created": "2015-04-15T09:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-09T15:36:00.000000", "creator": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@34274548"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzbyf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_493603174_*|*_3_*:*_1_*:*_2426948_*|*_5_*:*_1_*:*_0"}], "description": "The primastic schema and plumbing library dependencies should be updated to the latest stable version.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10305", "fixedVersions": ["TK-JETTY9 1.3.1"], "id": "10305", "issueType": "Sub-task", "key": "TK-195", "labels": [], "originalEstimate": "PT0S", "parent": "10599", "parentSummary": "Update prismatic schema and plumbing dependencies", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "resolution": "Fixed", "resolutionDate": "2015-04-15T09:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update prismatic dependencies in trapperkeeper-webserver-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "body": "Pull-requests have been submitted for each sub-task. Since there are some blocking dependencies between issues, they'll have to be resolved in order, with each subsequent project updating its project.clj dependencies whenever a new build has been cut.\n\nLet me know if there's anything else you'd like me to do. Cheers!", "created": "2015-04-09T16:17:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-09T15:34:00.000000", "creator": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2286c07b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzbqv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Community contribution"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_493535432_*|*_3_*:*_1_*:*_2607727_*|*_5_*:*_1_*:*_0"}], "description": "The versions of the plumbing and schema libraries used throughout the trapperkeeper projects is starting to lag pretty far behind the latest stable versions. As the rest of the clojure ecosystem uses schema more frequently, the versions included by trapperkeeper will increasingly conflict.\n\nThe plumbing and schema project dependencies for all trapperkeeper projects should be updated to the latest stable version (0.4.2 and 0.4.0 respectively, as of 2015-04-09). If the project doesn't use plumbing, it will need to as schema now requires it.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10599", "fixedVersions": [], "id": "10599", "issueType": "Improvement", "key": "TK-194", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:fa9a6291-27fb-4fa7-8ca7-01c04a4c3854", "resolution": "Fixed", "resolutionDate": "2015-04-15T09:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update prismatic schema and plumbing dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "Trying to support 1.8 in ruby-hocon is a nightmare, and it seems that we may not actually need to support ruby 1.8 in the puppetlabs-hocon module (there are other modules in the PL namespace that don't support it), so I'm moving this into \"Needs Information\" for now.", "created": "2015-04-09T12:44:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I've found a couple issues so far.\n\nFirst off is some weird code formatting. Code like the following:\n\n{code}\na.b(foo)\n    .c(bar)\n{code}\n\nIs valid in Ruby 1.9 and above, but not in Ruby 1.8, and we are doing this in a number of places in the code base.\n\nFurthermore, I've found that we'll need to change a number of maps in the tests formatted like the following\n{code}\n{a: 1, b: 2, c: 3}\n{code}\nto\n{code}\n{\"a\" => 1, \"b\" => 2, \"c\" => 3}\n{code}\n\nI've also noticed that a large number of tests (mostly ConfParser tests, but a few others as well) are failing . Some of this definitely seems to be due to failures with Path parsing (seems like a number of multi-element paths are being parsed somehow as single-element paths in Ruby 1.8).", "created": "2015-04-10T10:55:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "FYI for the first issue you mentioned, it should work in ruby 1.8 if we move the \".\" to the end of the previous line", "created": "2015-04-13T08:13:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-09T12:12:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3a99064d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xkv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Discovered this was necessary for the puppetlabs-hocon module"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_5071_*|*_3_*:*_1_*:*_1910515_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_516036061_*|*_10006_*:*_1_*:*_16157953888_*|*_10005_*:*_1_*:*_73357156817"}], "description": "To release the puppetlabs-hocon module under the PL namespace on the forge, we need to have ruby 1.8 support. Unfortunately, there's a myriad of test failures in ruby-hocon under ruby 1.8. These need to be fixed.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10387", "fixedVersions": [], "id": "10387", "issueType": "Bug", "key": "TK-193", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Fix", "resolutionDate": "2018-02-14T12:23:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Fix test failures in ruby-hocon on ruby 1.8", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I moved this out of \"merging\" because the linked PR has been merged.", "created": "2015-04-14T10:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-08T11:05:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1635b3c1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzauv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_25888509_*|*_1_*:*_1_*:*_97506710_*|*_10007_*:*_1_*:*_405109822_*|*_3_*:*_1_*:*_13638053_*|*_5_*:*_1_*:*_0"}], "description": "Puppet's array matching is weird, so right now puppetlabs-hocon does not match arrays when they are passed as the value parameter for a setting. \n\nWe need to look into allowing the value parameter of a setting to take an array. In the worst case, we can have separate parameters for maps, arrays, and simple values, although this would be fairly messy.\n\nWe may also consider, since we're moving towards using the ConfigDocument API, modifying the value parameter on a setting to take a string.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10395", "fixedVersions": [], "id": "10395", "issueType": "Sub-task", "key": "TK-192", "labels": [], "originalEstimate": "PT0S", "parent": "10388", "parentSummary": "Puppetlabs-Hocon module has no way of managing arrays in configurations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-14T17:41:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow for managing arrays in configurations", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I moved this out of \"merging\" because the linked PR has been merged.", "created": "2015-04-14T10:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-04-08T11:00:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@65cc0e4d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyzalz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_25954307_*|*_1_*:*_1_*:*_343279_*|*_10007_*:*_1_*:*_415651623_*|*_3_*:*_1_*:*_100495027_*|*_5_*:*_1_*:*_0"}], "description": "puppetlabs-hocon needs to use the new ConfigDocument API that was recently ported down to ruby-hocon to preserve the original text of configuration files.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10384", "fixedVersions": [], "id": "10384", "issueType": "Sub-task", "key": "TK-191", "labels": [], "originalEstimate": "PT0S", "parent": "10388", "parentSummary": "Puppetlabs-Hocon module has no way of managing arrays in configurations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-14T17:41:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update puppetlabs-hocon to use the new ConfigDocument API", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "Ping [~accountid:62438584f813eb006928dc81] for more information if necessary.", "created": "2015-03-31T13:01:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "This could be done by any of the Clojure teams, not just Puppet Server. We might consider removing Puppet Server Scrum Team from this ticket during triage.", "created": "2015-03-31T13:02:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "The `HttpClientExceptions` should be wrapping the original exceptions already, right?\n\nThe reason this doesn't happen on the clojure side is because clojure doesn't force you to catch checked exceptions, and Java does.  I'm not sure you're going to be able to get a better behavior out of the Java side unless you add a million 'throws' clauses to all of the Java method signatures.  That was the reason we created the HttpClientException originally.\n\nI'm curious to know what you wanted / needed to do that `.getCause` wouldn't have worked for?", "created": "2015-03-31T13:55:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "bq. I'm curious to know what you wanted / needed to do that `.getCause` wouldn't have worked for?\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] and I were thinking there might be use cases where consumers would want to handle specific failures, like any that might occur during the initial connection vs ones that arise during get/put/etc requests.  This wouldn't mean a bunch of specific exceptions, but maybe just adding one more for differentiation of this kind. \n\nMaybe we do some investigation and find this isn't that useful and nothing comes out of this ticket though? That's entirely possible", "created": "2015-03-31T14:13:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "OK but are you saying that calling `getCause` on the `HttpClientException` wouldn't give you access to that sort of difference?", "created": "2015-03-31T14:15:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "bq. OK but are you saying that calling `getCause` on the `HttpClientException` wouldn't give you access to that sort of difference?\n\n{{getCause}} might be fine for a Java-only solution to this, and if the consumers are okay with adding a dependency on the underlying library so they can catch the implementation-specific exception.\n\nI think the assumption with this ticket is that we'd be able to provide the same behavior for both Ruby (MRI + JRuby) and Java if we had our own exceptions+errors for this. Maybe that's not a requirement though...", "created": "2015-03-31T14:21:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Sorry, just trying to understand.\n\nThe consumers already have a transitive dependency on the underlying library, right?  And '.getCause' should work exactly the same way in Ruby as in Java?\n\nI guess maybe if what you're getting at is that there are specific exception types in the lower-level library that we should be creating our own custom version of so that we can document that we throw them instead of letting the underlying low-level exceptions bubble up, then it'd be good to try to enumerate those.  (That doesn't have to happen right this second, but I would probably consider it a pre-req to pulling this ticket into a sprint.)\n\nAlso, I'm confused because your description kind of makes it sound like the behavior in the clojure API is acceptable / desirable as compared to the current Ruby/Java API, and my understanding is that in the current codebase the exceptions you get in Clojure would be exactly the same exceptions you'd get from `.getCause` in the Ruby/Java API.", "created": "2015-03-31T14:30:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}\nThe reason this doesn't happen on the clojure side is because clojure doesn't force you to catch checked exceptions, and Java does. I'm not sure you're going to be able to get a better behavior out of the Java side unless you add a million 'throws' clauses to all of the Java method signatures. That was the reason we created the HttpClientException originally.\n{quote}\n\nOk, that was some context I was missing and makes sense.\n\n{quote}\nmy understanding is that in the current codebase the exceptions you get in Clojure would be exactly the same exceptions you'd get from `.getCause` in the Ruby/Java API.\n{quote}\n\nI think that's true - at least, I haven't ever seen that to not be true.\n\n{quote}\nI guess maybe if what you're getting at is that there are specific exception types in the lower-level library that we should be creating our own custom version of so that we can document that we throw them instead of letting the underlying low-level exceptions bubble up, then it'd be good to try to enumerate those. (That doesn't have to happen right this second, but I would probably consider it a pre-req to pulling this ticket into a sprint.)\n{quote}\n\nI'd been thinking that wherever standard Java JNI exceptions are being thrown that there wouldn't be a lot of value around re-wrapping them into a custom exception type defined by the clj-http-client library.  If there were any custom Apache-derived exceptions for certain types of failures, it might make sense to remap those.  It's true that clients of clj-http-client would already be getting the Apache dependencies transitively, but I think we should avoid having those clients have to reference code directly out of the Apache libraries wherever possible - so it would be more transparent to migrate clj-http-client to another underlying HTTP library at a later time, if needed.\n\nThat said, I don't have a good feel for how many exceptions in the context of setup or request failures that might be delivered up as a custom Apache type anyway.  May not be many at all.  Most of the ones we have tests around are just standard Java ones - ConnectException, SocketTimeoutException, SSLHandshakeException, ...\n\n\n", "created": "2015-03-31T14:47:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "bq. The consumers already have a transitive dependency on the underlying library, right? And '.getCause' should work exactly the same way in Ruby as in Java?\n\n{{getCause}} can't be used from MRI Ruby though, only JRuby.  If we wanted this support to be agnostic we couldn't rely on bubbling up the underlying exceptions.  Or we could, but we'd have different behavior between Java and Ruby, which we might end up finding acceptable.\n\nbq. Also, I'm confused because your description kind of makes it sound like the behavior in the clojure API is acceptable / desirable as compared to the current Ruby/Java API, and my understanding is that in the current codebase the exceptions you get in Clojure would be exactly the same exceptions you'd get from `.getCause` in the Ruby/Java API.\n\nI'm not sure I meant to imply that the Clojure-side is acceptable, just that it's different. It might actually be fine though - I think the more important thing is that we can't support MRI Ruby and JRuby the same way given our current implementation.", "created": "2015-03-31T14:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}\ngetCause can't be used from MRI Ruby though, only JRuby. If we wanted this support to be agnostic we couldn't rely on bubbling up the underlying exceptions. Or we could, but we'd have different behavior between Java and Ruby, which we might end up finding acceptable.\n{quote}\n\nI think the more actionable ticket that we might want to capture from this would be to analyze how exceptions to HTTP client requests in the Puppet Server master via {{Puppet::Network::HttpPool}} in Ruby are presented.  Not sure if they all fall under {{SocketError}} and, even if so, whether the exception messages might give more meaningful context to the receiver about what the actual failure was - failure to connect due to timeout, SSL error, etc.  For that kind of work, though, I think we'd be talking about a Puppet Server ticket rather than a clj-http-client one.  That could lead to new work being done around this: https://github.com/puppetlabs/puppet-server/blob/puppet-server-1.0.8/src/ruby/puppet-server-lib/puppet/server/http_client.rb#L90-L92.   I think clj-http-client would already provide enough info via the nested exception hierarchy to do the Ruby-level exception remapping.", "created": "2015-03-31T15:03:00.000000"}, {"author": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "body": "bq. ...For that kind of work, though, I think we'd be talking about a Puppet Server ticket rather than a clj-http-client one...\n\nYeah, I might be confusing the responsibilities of clj-http-client and puppet-server a bit, unfortunately.\n\nI think the best thing to come from this ticket is the forum for discussion, so I'd be happy if we decided that we didn't yet have enough requirements to warrant making any changes at this time and just closed this ticket.", "created": "2015-03-31T15:22:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}getCause can't be used from MRI Ruby though, only JRuby. If we wanted this support to be agnostic we couldn't rely on bubbling up the underlying exceptions. Or we could, but we'd have different behavior between Java and Ruby, which we might end up finding acceptable.{quote}\n\nOK, now I am starting to see where you're going.  Unfortunately I think that any exception we throw from Java is going to have this same problem where you can't deal with it from MRI Ruby, which brings us to...\n\n{quote}I think the more actionable ticket that we might want to capture from this would be to analyze how exceptions to HTTP client requests in the Puppet Server master via Puppet::Network::HttpPool in Ruby are presented. Not sure if they all fall under SocketError and, even if so, whether the exception messages might give more meaningful context to the receiver about what the actual failure was - failure to connect due to timeout, SSL error, etc. For that kind of work, though, I think we'd be talking about a Puppet Server ticket rather than a clj-http-client one.{quote}\n\nThis I totally agree with.\n\n{quote}If there were any custom Apache-derived exceptions for certain types of failures, it might make sense to remap those. It's true that clients of clj-http-client would already be getting the Apache dependencies transitively, but I think we should avoid having those clients have to reference code directly out of the Apache libraries wherever possible - so it would be more transparent to migrate clj-http-client to another underlying HTTP library at a later time, if needed.{quote}\n\nI'm +1 on this as well, but would probably consider that to be a separate task, and off the cuff, probably lower priority than the MRI compat stuff that you mentioned above.\n\n{quote}I think the best thing to come from this ticket is the forum for discussion, so I'd be happy if we decided that we didn't yet have enough requirements to warrant making any changes at this time and just closed this ticket.{quote}\n\nYep, good discussion, thanks.  Seems like maybe there are two tickets here", "created": "2015-03-31T16:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Yep, good discussion, thanks.{quote}\n\nAgreed, thanks.\n\n{quote}Seems like maybe there are two tickets here", "created": "2015-03-31T17:19:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Filed SERVER-529 to cover the follow-on work in Puppet Server.  Closing this ticket in favor of that one.", "created": "2015-04-01T12:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-31T13:01:00.000000", "creator": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6f21baa2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyz6br:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_84481248_*|*_6_*:*_1_*:*_0"}], "description": "Currently, the Java-side of clj-http-client throws a generic {{HttpClientException}} for any sort of request failure. In an effort to allow for consumers to handle failures more easily, we should throw more specific exceptions, or let the underlying ones bubble up.\n\nThis issue came up during SERVER-517 when the most we could do to pass along the error was to effectively call to-string on the {{HttpClientException}}.\n\nNOTE that the Clojure-side of clj-http-client does not behave this way: it lets the underlying exceptions bubble up.\n ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10217", "fixedVersions": [], "id": "10217", "issueType": "Improvement", "key": "TK-189", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "resolution": "Won't Fix", "resolutionDate": "2015-04-01T12:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client: Throw better exceptions/errors", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-30T16:41:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@47301db8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0rr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_6978_*|*_1_*:*_1_*:*_10604_*|*_10007_*:*_1_*:*_16847961_*|*_3_*:*_1_*:*_68729522_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_687407846"}], "description": "In the upstream library, the parser has been refactored to parse ConfigNodes instead of Tokens. We need to port these changes down into ruby-hocon.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10352", "fixedVersions": [], "id": "10352", "issueType": "Task", "key": "TK-188", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-08T15:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Refactor Parser into ConfigParser", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-30T16:37:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@15c58c11"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0rj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_23519_*|*_1_*:*_1_*:*_26471_*|*_10007_*:*_1_*:*_83363340_*|*_3_*:*_1_*:*_344798346_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_341543609"}], "description": "We need to port the new ConfigDocumentParser that was added to the upstream library, along with the various tests for it and the public-facing ConfigDocument API (which includes the ConfigDocument interface and the ConfigDocumentFactory class, as well as new functions in Parseable).", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10303", "fixedVersions": [], "id": "10303", "issueType": "Task", "key": "TK-187", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-08T14:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port ConfigDocumentParser, ConfigDocument, and corresponding tests", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-30T16:34:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@26cc60e9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0rb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_13762400_*|*_1_*:*_1_*:*_60520_*|*_10007_*:*_1_*:*_331882385_*|*_3_*:*_1_*:*_176421190_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_164494888"}], "description": "Recently, a new set of classes implementing the ConfigNode interface were added to the upstream library. These classes need to be ported down along with the corresponding tests in ConfigNodeTest.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10610", "fixedVersions": [], "id": "10610", "issueType": "Task", "key": "TK-186", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-07T15:18:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port ConfigNode classes and tests", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-30T16:31:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@25265714"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0qn:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Utility and Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6328_*|*_10007_*:*_1_*:*_155016698_*|*_3_*:*_1_*:*_89287023_*|*_5_*:*_1_*:*_0"}], "description": "Currently, a ConfigDocument object allows you to add a new setting that does not exist. However, it currently does a poor job formatting the new setting, as the new setting is inserted without any sort of indentation. We improve the indentation so that the formatting ends up as nice as possible.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10550", "fixedVersions": [], "id": "10550", "issueType": "Improvement", "key": "TK-185", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-02T12:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON: Improve formatting when adding a new setting to a ConfigDocument", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-30T12:41:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@47420e82"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyz5kf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth, and discovered it was required for the puppetlabs-hocon module"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_156181494_*|*_1_*:*_1_*:*_4718_*|*_10007_*:*_1_*:*_7435691_*|*_3_*:*_1_*:*_4127_*|*_5_*:*_1_*:*_0"}], "description": "The upstream HOCON library needs two more public API methods added to ConfigDocument for the puppetlabs-hocon module: hasValue and removeValue.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10392", "fixedVersions": [], "id": "10392", "issueType": "Task", "key": "TK-184", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-01T10:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON: Add hasValue and removeValue methods to ConfigDocument", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "This appears to happen here in {{coerce-body-type}}:\n\nhttps://github.com/puppetlabs/clj-http-client/blob/http-client-0.4.2/src/clj/puppetlabs/http/client/async.clj#L201\n\nShould just need to avoid doing the slurp here because (:body resp) is nil.", "created": "2015-03-26T17:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "A very similar problem occurs when using the Java PersistentSyncClient when an HTTP 204 with no payload is returned.  Here's the top of a stack trace thrown from one reproduction case I tried:\n\n{noformat}\n2015-03-28 18:27:31,868 ERROR [c.p.h.c.i.PersistentSyncHttpClient] Error executing http request\njava.lang.NullPointerException: null\n\tat java.io.Reader.<init>(Reader.java:78) ~[na:1.7.0_71]\n\tat java.io.InputStreamReader.<init>(InputStreamReader.java:113) ~[na:1.7.0_71]\n\tat org.apache.commons.io.IOUtils.copy(IOUtils.java:1906) ~[puppet-server-release.jar:na]\n\tat org.apache.commons.io.IOUtils.toString(IOUtils.java:778) ~[puppet-server-release.jar:na]\n\tat org.apache.commons.io.IOUtils.toString(IOUtils.java:803) ~[puppet-server-release.jar:na]\n\tat com.puppetlabs.http.client.impl.JavaClient.coerceBodyType(JavaClient.java:428) ~[puppet-server-release.jar:na]\n...\n{noformat}", "created": "2015-03-28T21:03:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I put up a PR that I believe fixes the issue. As far as I can tell the issue only crops up in {{async/coerce-body-type}}, is that right? \n\nI chose the behavior to be: if a nil body is trying to be coerced, it just leaves it as nil. Do you think this is a good way to do it? Should it turn the body into an empty string or something else?\n\nI also added a test to make sure {{async/coerce-body-type}} doesn't throw on a nil response body. I'm super new to clojure, so advice of any kind is much appreciate, style advice included.", "created": "2015-04-22T12:33:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "As a user of the library, if I ask for the body `:as :text`, I'm going to assume that I get a string. I'm going to assume I can do things like run regexes on that string or search and replace in that string, both of which blow up if the string is actually nil. If I'm not going to be able to make those assumptions, what's the point of being able to set the `:as :text` option?", "created": "2015-04-23T14:37:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:1381f112-1c4e-4869-ba34-30602d945124] So would you think an empty string would be reasonable to return as the response body to the caller, then?", "created": "2015-04-23T14:41:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "Yes, that sounds reasonable to me.", "created": "2015-04-23T14:43:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Sounds good to me, too.  [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] - you good making that change?", "created": "2015-04-23T14:44:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Yeah, sounds good to me", "created": "2015-04-23T14:49:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "PR has been updated", "created": "2015-04-23T14:58:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-26T17:30:00.000000", "creator": "557058:1381f112-1c4e-4869-ba34-30602d945124", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@504b7d68"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-447"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyz3vz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Did a bad job planning Joe's tasks"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "26/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_9040098_*|*_1_*:*_1_*:*_496694241_*|*_10007_*:*_1_*:*_174791296_*|*_3_*:*_1_*:*_81480090_*|*_5_*:*_1_*:*_15716121334_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1736824340"}], "description": "When the `:as` option to any of http client's http method functions is specified and the remote server replies with a 204 No Content Response, the body of the response is nil, but the http client still attempts to create an IOFactory in order to coerce the body into the format specified by the `:as` option's value. Since the IOFactory protocol's make-reader method isn't extended to nil, it throws an IllegalArgumentException. Removing the `:as` option resolves the issue, but the client should probably just skip the coersion process if the response body is nil.", "epicLinkSummary": "Non PE- Puppet Server tickets to be scoped", "estimate": "PT0S", "externalId": "10594", "fixedVersions": [], "id": "10594", "issueType": "Bug", "key": "TK-182", "labels": [], "originalEstimate": "PT0S", "parent": "16693", "parentSummary": "Non PE- Puppet Server tickets to be scoped", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:1381f112-1c4e-4869-ba34-30602d945124", "resolution": "Fixed", "resolutionDate": "2015-04-24T15:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "IllegalArgumentException in http client when `:as` option specified and 204 response received.", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Note that there are more specific discussions around use-case requirements for load balancers on the original ticket, PE-8269.", "created": "2015-04-15T02:44:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Would it be in scope to have some functionality around the following?\n\nAs a PE admin, I want the ability to configure a back-end service to inform a front end load balancer to stop forwarding new connections, while still handling existing connections so that I can safely drain a service for maintenance.\n\nNB: detecting if a service is up is good, but it's often difficult to safely take a service out of operation if the only way to do so is to disrupt the service itself.  Application functionality around \"draining\" a service is great, above and beyond detecting for availability.  If an application doesn't implement drain feature, there's a \"hack\" convention of configuring iptables to DNAT one port higher than the service port to the service port itself.  e.g. use iptables to listen on 8141 and forward everything to 8140.  Then configure something like haproxy to check 8141 instead of 8140.  The drain operation is then triggered by turning off the DNAT from 8141 to 8140, which fails the status check, but leaves existing communication unaffected.", "created": "2015-04-15T22:54:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623c12b6ee1b5a0070293582] I think that we should strive for something like that but it seems like a pretty big chunk of work that may or may not be possible to do generically.  I think it's out of scope for this first round of changes but we can ticket it or add it to a roadmap for future work.", "created": "2015-04-16T01:15:00.000000"}, {"author": "557058:ba2d08f5-8947-446f-bada-55ecb351d6cc", "body": "can corresponding functionality for PuppetDB (8081) and the report submission endpoint (4435) also be included as part of this work please?  They aren't trapperkeeper apps in PE 3.7 but perhaps this will change in the future?  Either way, it would be useful to have an easy way for end users to monitor these services", "created": "2015-04-20T21:11:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:ba2d08f5-8947-446f-bada-55ecb351d6cc] PuppetDB is a TK app already, but they didn't switch over to ezbake until the upcoming 3.0 release.\n\nThis status service will definitely be something that any of the TK apps can easily opt-in to", "created": "2015-04-21T00:36:00.000000"}, {"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] what PE release is this targeted for? We would really like to build on top of this in SG for a health endpoint in the NC service. ", "created": "2015-04-23T17:48:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "[~accountid:623e7a779b54ec0068b2844b] it will be out in FOSS Puppet-Server 1.1 / 2.1, so Real Soon Now.", "created": "2015-04-24T14:18:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "The re-usable library that other teams can build on will be available well before the Puppet Server 1.1 release.  We plan to send out an announcement e-mail to the dev list very soon", "created": "2015-04-30T05:13:00.000000"}, {"author": "557058:db6ac850-d953-4af6-bda9-9624b14c0912", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]This epic is on the SG page. Does it need to be closed? ", "created": "2015-08-12T19:56:00.000000"}, {"author": "70121:199f31c7-67c7-42b0-b148-18ad3a391ab0", "body": "[TK-219] is still open, so the epic can't be closed - [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] can you either kick that out of the epic or close it ..?", "created": "2015-08-14T11:16:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0] [~accountid:70121:caffdbd6-f73d-4ae9-9c82-c4badf061584] I created epic TK-267 \"Status Service: Future Improvements\" and moved that ticket there for now.  We can shuffle that around as needed but hopefully that will suffice for now in terms of closing this epic out?", "created": "2015-08-17T02:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-24T16:41:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Scrum Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Puppet Server"}, {"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald", "jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2b57ac03"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Color", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-color", "value": "ghx-label-6"}, {"fieldName": "Epic Name", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-label", "value": "Green: TK Status Service"}, {"fieldName": "Epic Status", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-status", "value": "Done"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Issue color", "fieldType": "com.pyxis.greenhopper.jira:jsw-issue-color", "value": "green"}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyorav:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Apr/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_144607930_*|*_6_*:*_1_*:*_0_*|*_10013_*:*_1_*:*_33873984437"}], "description": "As a PE admin, I want to be able to configure a load balancer to detect whether a service is up via a simple network query so that I can have the LB take action automatically if the service is in a bad state. \n\nAs a PE admin, I want the status information to have minimal dependencies so that I avoid false alerts.\n\nAs a PE admin, I want to be able to access a concise overview of a service's health status in human-readable format and JSON so that I can read it myself or export to other tools.\n\nAs a PE service developer I want to be able to expose status information via a uniform, shared service so that it automatically follows a PE-wide standard and I don't have to duplicate effort or figure how each individual service handles exposing status information.\n\nh2. In scope:\n * A trapperkeeper service that exposes a status endpoint. Other services register a callback with this service, which will be called to retrieve the status information. All display and rendering decisions lie with the status service\n * Boolean status per TK service, up or down\n * Health summary per service. This implementation is completely up to the client service (e.g. puppet server wants to implement some simple aggregate metrics, but they would write that logic themselves and simply return it to the status service).\n* determine the semantics of communicating with the service exposing the status information\n* the specific semantics should be documented in the repo or in confluence\n\nh2. Out of scope:\n * General metrics\n* we are not doing end points _ docs not required for this story\n\nh2. Open questions:\n * What are the constraints implied by needing this to be consumed by load balancers?\n * Do we want a separate endpoint per service or just per JVM? (Initially assuming per-JVM.)\n * Can we use SSL? This relates to the LB restrictions.\n * Does \"concise overview\" need to be both human- and machine-readable output?\n\nh3.QA:\nRisk Assessment: N/A; New features; testing organized in SERVER-583", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10350", "fixedVersions": [], "id": "10350", "issueType": "Epic", "key": "TK-198", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2016-04-21T10:17:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "generic status service for tk apps", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "1", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-20T12:43:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@326f2d6c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyyyrr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Had bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_23882806_*|*_1_*:*_1_*:*_275048796_*|*_10007_*:*_1_*:*_321614865_*|*_3_*:*_1_*:*_191071005_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_65827972"}], "description": "As part of our upstream HOCON changes, we'll need to take the current Parser and refactor it so it uses the results of the new ConfigDocumentParser rather than directly parsing Tokens.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10301", "fixedVersions": [], "id": "10301", "issueType": "Task", "key": "TK-180", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-03-30T16:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON: Refactor parser to parse Config Nodes instead of tokens", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:5b61153325ea8f2ca147bd04] - This was discussed as a possibility at one point, but we decided to go a different way.  Check out https://github.com/puppetlabs/puppetlabs-hocon and https://github.com/puppetlabs/ruby-hocon - the latter is currently under active development and the plan is to switch PE over to using the HOCON module ASAP.  We know the templates are terrible.", "created": "2015-03-20T12:04:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:5b61153325ea8f2ca147bd04] we are swarming on this as we speak.  The goal is that within the next few weeks, this module: https://github.com/puppetlabs/puppetlabs-hocon should be in the ballpark of the same quality as the inifile module.", "created": "2015-03-20T15:04:00.000000"}, {"author": "5b61153325ea8f2ca147bd04", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5], [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I'm excited to see puppetlabs-hocon. In practical terms, that should address many of the most critical use cases. I'll make a note in puppet-puppet that we should use it. I have some general concerns about HOCON from a usability perspective as a sysadmin, but this isn't the right place to take that up", "created": "2015-03-21T14:52:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:5b61153325ea8f2ca147bd04] we would still be interested in hearing your concerns, and now would be a really good time to get them captured since we are actively working on improvements around the config file user experience.", "created": "2015-03-23T09:22:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "We won't do this work in favor of maintaining puppetlabs-hocon", "created": "2018-02-14T12:14:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-20T12:00:00.000000", "creator": "5b61153325ea8f2ca147bd04", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@592207f5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3x93:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1034226652_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_90727030092"}], "description": "Managing HOCON configuration files with puppet is quite frustrating; I'm reduced to templating things out and can't make atomic changes. I can't work with hocon files in any of the normal tools I'm used to. As more things move to using hocon files, this makes puppet infrastructure more difficult to manage using puppet. \n\nFor example, this is a significant factor in why the puppet-puppet module ops maintains does not support puppet server.\n\nI'm not sure whether this is the right place to submit this. I like the ideas behind hocon, but it's an extraordinarily difficult config file format to work with. If I have to use it, it should be a first-class citizen with regards the tooling sysadmins depend on.\n\n[~accountid:557058:5f998a8b-08b1-46f5-beb0-60cd1d60b36b] Former user including you since we discussed this in person.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10332", "fixedVersions": [], "id": "10332", "issueType": "New Feature", "key": "TK-190", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "5b61153325ea8f2ca147bd04", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:14:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add hocon lens for augeas", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Merged to clj-http-client#master at [fb39b4|https://github.com/puppetlabs/clj-http-client/commit/fb39b412605b451215a56d6be579af2d33dd0ab3].", "created": "2016-02-16T08:44:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "Unit tests passed at https://jenkins-enterprise.delivery.puppetlabs.net/job/enterprise_clj-http-client_unit-clj_master/14/. I don't think there's anything here really to test - this was just a refactor of some of the code - so I'm thinking I'll just move it to \"Done\".", "created": "2016-02-16T16:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-18T13:17:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@736c863a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynowf:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_28229087_*|*_1_*:*_1_*:*_446596406_*|*_10007_*:*_1_*:*_494158943_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_3427582_*|*_10005_*:*_1_*:*_27986963539"}], "description": "The clj-http-client library has some code that is fairly similar between the Clojure and Java layers around the translation of options into the underlying Apache HttpClient objects.  For example, {{create-default-client}} in async.clj at the Clojure layer and {{createClient}} in JavaClient.java at the Java layer do very similar setup of the underlying Apache HttpClient request objects - although with different forms of parameters as input.\n\nIt might be good to streamline this a bit by putting some of this functionality into public Java methods that can be called from either the backend Clojure layer or the Java layer.  This may involve some argument coercion in the backend Clojure layer to use the common Java methods.\n\nAny refactoring here should be constrained to the internal library implementation and should preserve the existing Java and Clojure APIs for consumers. ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10598", "fixedVersions": [], "id": "10598", "issueType": "Improvement", "key": "TK-179", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2016-02-16T16:33:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider eliminating some Clojure/Java duplication in clj-http-client requests", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "We consider this change high risk, but there is no specific manual testing that will validate the change.  We will use a combination of long term testing (PE-8586) and automated testing in the PE CI pipeline to validate this change.  \n\nWhen this ticket comes to the testing column / reaches the \"Ready for Test\" status, it can be resolved in favor of tracking work in PE-8586.", "created": "2015-03-19T10:40:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "PR was merged and tk-jetty9 unit tests passed in Jenkins - https://jenkins.puppetlabs.com/job/trapperkeeper-webserver-jetty9/60/.  Moving to resolved per QA's recommendation that the work to validate this be done around PE-8586.", "created": "2015-03-20T11:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-17T11:46:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45536dd1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp1wf:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Discovered the Jetty Critical Security release mid-sprint."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_161288288_*|*_1_*:*_1_*:*_38130_*|*_10007_*:*_1_*:*_96122201_*|*_3_*:*_1_*:*_1391232_*|*_5_*:*_1_*:*_0"}], "description": "The trapperkeeper-webserver-jetty9 1.2.0 release uses Jetty version 9.2.8.  Jetty later did a critical security release for 9.2.9 - http://dev.eclipse.org/mhonarc/lists/jetty-announce/msg00074.html.  9.2.10, the most recent release at the time this ticket was filed, apparently has some fixes for some additional memory leak related problems as well, so it probably would be good to just bump up to that.\n\n----\nRisk assessment: High (covered by testing in [PE-8586])\nProbability: High (impacts all users)\nSeverity: High (failure in jetty compromises TK)", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10331", "fixedVersions": ["TK-JETTY9 1.3.0"], "id": "10331", "issueType": "Task", "key": "TK-178", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-03-20T11:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bump tk-jetty9 to Jetty 9.2.10", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-17T10:43:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@346a9e2f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3x8f:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_541988224_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_91483070953"}], "description": "For the {{add-proxy-route}} functionality in trapperkeeper-webserver-jetty9, we have an {{idle-timeout}} that can be configured.  This is mapped to the {{idle-timeout}} setting which is used for the ProxyServlet's HttpClient.  The ProxyServlet, however, also sets a {{timeout}} for the {{HttpRequest}}.  This second timeout appears to be a total time applied for full request/response roundtrip.  Since this latter timeout isn't exposed through the {{add-proxy-route}}, it appears that it would be automatically set to 60 seconds.\n\nI haven't experimented with the request {{timeout}} setting but I fear that if the user is intending to bump the {{idle-timeout}} up but the corresponding request {{timeout}} isn't bumped up that the {{idle-timeout}} would effectively have a hard ceiling of 60 seconds.\n\nAssuming {{add-proxy-route}} users might run into a problem with this, it may be worth investigating this further at some point.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10609", "fixedVersions": [], "id": "10609", "issueType": "Task", "key": "TK-177", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Fix", "resolutionDate": "2018-02-14T12:14:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate request 'timeout' setting for tk-jetty9 ProxyServlet", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "I suspect that they can speak https, they just can't easily be configured to use our CA.", "created": "2015-03-17T11:51:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Right, my bad, thanks for the correction.", "created": "2015-03-17T11:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We discussed this today in preparation for Joe to begin work on it, and I agreed to add a few clarifying comments.\n\n* There should be a new, opt-in service defined in the trapperkeeper-status repo.\n* This service should read some data from a config file that gives it SSL credentials, possibly a URL to mount for the proxying, and possibly a URL that specifies where the requests should be proxied to.\n* The service should add a web handler that proxies the requests.\n\nThat's pretty much all there should be as far as production code.  Some other constraints / considerations:\n* We need to have thorough tests to validate that no requests will be proxied other than requests to the status endpoint (or, more likely, whatever destination is configured in the config file).\n* The implementation might be a custom ring handler that uses a local http client object to proxy the requests, or we might be able to use the {{add-proxy-route}} stuff from tk-j9: \n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/a52e989783ddde5d06a3a4542d1e260a66aad008/README.md#add-proxy-route\n\nThe add-proxy-route stuff *sounds* better on the surface if it works, but, we had a decent amount of weird problems with it in the past (mostly around HTTP redirects and stuff), so I can't remember whether we left off in a state where we really trust it or not.  [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] do you have a gut feel on that?\n\n* Security is super important here.  We need some good test coverage that illustrates that we don't proxy any requests to destinations that are not under the configured destination URL prefix (so, in this case, it'll only be endpoints inside of the status service).\n* Should use webrouting config service so that the configuration for the URL is visible with the other URLs\n* Needs to be able to be run on a different Jetty port than the main HTTPS one that other services will be using, so tests should probably include some coverage of TK configs where there are two different Jetty instances configured, and one is plaintext and includes the proxy service, and the other is HTTPS and includes a \"secure\" service.\n", "created": "2015-06-03T13:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Have we specifically gotten input from product, et al., that we need to have a way to expose the status service endpoint in plaintext on a server otherwise configured to only expose services through an SSL/HTTPS bound port?  The security implications of what we're talking about here are concerning to me - e.g., possibility of defects around accidentally proxying routes that we're not supposed to and the potential for the master to be impersonated in the process of doing so.  Would be really nice to avoid having to do this if it is not absolutely required.\n\n", "created": "2015-06-03T13:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yes.  We've discussed it a lot.\n\nIt's opt-in, we can log a warning about security implications, we should have test coverage validating the proxying only happens to the configured target destinations, etc., etc.  We can also set up the pe installer modules to manage this by creating a one-off cert that is not the master's cert.\n\nSo... [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I'm not really asking about product questions / implications / use-cases, I'm just asking for your opinion on the advisability of using or not using the tk-j9 {{add-proxy-route}} functionality.  Any thoughts on that?", "created": "2015-06-04T04:31:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Yes. We've discussed it a lot.  It's opt-in, we can log a warning about security implications, we should have test coverage validating the proxying only happens to the configured target destinations, etc., etc. We can also set up the pe installer modules to manage this by creating a one-off cert that is not the master's cert.{quote}\n\nI still think this is a dangerous, complicated path to go down, but glad to hear that product has been involved in the discussion and is onboard.\n\n{quote}So... Jeremy Barlow I'm not really asking about product questions / implications / use-cases, I'm just asking for your opinion on the advisability of using or not using the tk-j9 add-proxy-route functionality. Any thoughts on that?{quote}\n\nI think the {{add-proxy-route}} functionality is basically viable at this point.  We have a number of tests in place for it that have all been passing on the latest {{trapperkeeper-webservices-jetty9}} version.  IIRC, the only pieces of work around this that had not been completed were:\n\n- TK-33 - Improvements around how redirects are handled.  Offhand, I don't remember all of the details of what work was remaining.  Not sure that's relevant here, though, if the original target of the proxied status request would not return a redirect?\n\n- TK-152 - ProxyServlet HTTP client threads can starve Jetty thread pool.  This one was actually closed out a while back because the likelihood that we'd run into this problem on the newer Jetty server versions when using the default thread count configurations is much smaller.  I still think we should address this one at some point, but I wouldn't consider it necessarily to be a blocker for additional uses of the proxy functionality.\n\n---\n\nI'm curious what would the configuration look like for the plaintext port that the status service would be bound to.  Would the plaintext port appear in the standard \"webserver\" configuration?  If that were the case, I'm not sure we could effectively hide other non status service endpoints from being exposed through the plaintext port.\n\n{quote}we want the status service to be exposed on the same jetty instance that the rest of the services are running on.{quote}\n\nHow will this work when we're talking about a Trapperkeeper stack which has different services binding to different ports under different Jetty server instances?  Will the status service need to be hosted under a plaintext port on each of those server instances and be able to proxy back to the corresponding port on the server from which it was invoked?", "created": "2015-06-08T11:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nI still think this is a dangerous, complicated path to go down, but glad to hear that product has been involved in the discussion and is onboard.\n{quote}\n\nThe #1 driving force for this work in the beginning was to provide a way for load balancers to check the status of our services, presuming that the load balancer did not have the ability to be configured with custom SSL certificates.  Do you have another idea of how to solve it?\n\n{quote}\nI'm curious what would the configuration look like for the plaintext port that the status service would be bound to. Would the plaintext port appear in the standard \"webserver\" configuration? If that were the case, I'm not sure we could effectively hide other non status service endpoints from being exposed through the plaintext port.\n{quote}\n\nThe \"real\" status service will generally be running on the same SSL-protected port as the other apps.  In the default installation, that'll be the end of the story.\n\nIf users wish to also enable a plain-text proxy for just that one service, we will provide them documentation on how to do so, and it'll involve configuring a separate Jetty instance on a plain text port and configuring it to proxy requests *from* a specific URL prefix (e.g. \"/status\") *to* a specific host/port/url prefix (e.g. localhost:8081/status), given a specific set of SSL credentials.  We will document security considerations.  Users will have all of the following choices:\n\n1. Don't enable the proxy\n2. Run the proxy on a network interface that is not accessible to the outside world\n3. Firewall the interface/port that the proxy is run on\n\nPlus our test coverage to ensure that no proxied requests will be made to URLs that don't begin with the configured prefix (\"/status\").", "created": "2015-06-09T00:41:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nTK-152 - ProxyServlet HTTP client threads can starve Jetty thread pool. This one was actually closed out a while back because the likelihood that we'd run into this problem on the newer Jetty server versions when using the default thread count configurations is much smaller. I still think we should address this one at some point, but I wouldn't consider it necessarily to be a blocker for additional uses of the proxy functionality.\n{quote}\n\nIs this the one that was causing problems for pe-console-services?  I thought that maybe they'd also run into some issue where it wasn't proxying things over SSL correctly.  [~accountid:6304e5bea4f57644346b121f] [~accountid:6304e59555513d8d731063f4] do you guys recall whether or not there was a different ticket about whatever issues you'd run into with the {{add-proxy-handler}} stuff?", "created": "2015-06-09T00:43:00.000000"}, {"author": "6304e59555513d8d731063f4", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] This is the ticket that tracked the problem in tk-proxy: https://bugs.eclipse.org/bugs/show_bug.cgi?id=440729. The problem was not solved completely but when the maximum connections per destination was set to a low number (max. 3) it seemed to work fine. I have no idea if it relates to this ticket (haven't read all the comments here).", "created": "2015-06-09T06:24:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Thanks, [~accountid:6304e59555513d8d731063f4], that's exactly what I was looking for!\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] did you have any run-ins with that one, or opinions on whether it would be a deterrent from using the {{add-proxy-handler stuff}} for new features?  I'm still on the fence about whether I should have added that to tk-j9 in the first place... but at the same time I like the idea (in theory) that their proxy should be more complete and battle-tested than anything we'd cobble together by hand.", "created": "2015-06-09T06:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Does the plaintext port listener need to be running in a java process which is separate from the ones that the services (and real status) service live on or could the plaintext port listener live in the same java process as the other services?  If it can live in the same process, it isn't clear to me that we need to have the http -> https loopback connection be done.  Could we not have the \"true\" status service just register multiple ring handlers for the different servers, have just one of those servers be configured with the plaintext port, and not have any of the other services' ring handlers be registered with the server that has the plaintext port?  The status service, when accessed from either the plaintext port or one of the ports on the other servers, would still be able to callback on any other services which had registered with it to get the status response payload, right?  Maybe to make this easier it would be worthwhile to add some sort of feature to the tk-jetty9 / webrouting service to allow a caller to specify that an added handler be registered with *all* available servers as opposed to just having one be picked?", "created": "2015-06-15T09:42:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Jeremy Barlow did you have any run-ins with that one, or opinions on whether it would be a deterrent from using the add-proxy-handler stuff for new features?{quote}\n\nI'd forgotten all about that one.  No, I haven't ever seen that one myself but maybe that's because in the circumstances where I've used it, there hasn't been a significant amount of concurrency going on.  The unit tests for the proxy servlet feature in tk-jetty9 never have more than 1 request active at a given time, IIRC.  Not sure if we expect a high number of concurrent requests for the status feature?  Maybe if multiple load balancers need to hit the server around the same time to get info?\n\nSounds like the \"fix\" where up to 3 concurrent requests can be handled more robustly won't be available until Jetty 9.3.0?  Not sure how soon we will be able to upgrade to that?  We're still running tk-jetty9 on 9.2.10.\n\nIf we need to go with a proxy solution, though, I tend to agree with you that I'd trust Jetty's to be more robust than something we'd end up cobbling together by hand, so I'd be inclined to try to use it before doing a custom one.  Maybe if the concurrency requirements would be too much for it, we'd need to go with an alternative approach later?", "created": "2015-06-15T09:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}Sounds like the \"fix\" where up to 3 concurrent requests can be handled more robustly won't be available until Jetty 9.3.0? Not sure how soon we will be able to upgrade to that? We're still running tk-jetty9 on 9.2.10.{quote}\n\nNot that we need to jump on this immediately but the Jetty 9.3.0 release just dropped today. ", "created": "2015-06-15T13:33:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nDoes the plaintext port listener need to be running in a java process which is separate from the ones that the services (and real status) service live on\n{quote}\n\nno\n\n{quote}\n or could the plaintext port listener live in the same java process as the other services?\n{quote}\n\nyes\n\n{quote}\n If it can live in the same process, it isn't clear to me that we need to have the http -> https loopback connection be done. Could we not have the \"true\" status service just register multiple ring handlers for the different servers, have just one of those servers be configured with the plaintext port, and not have any of the other services' ring handlers be registered with the server that has the plaintext port? The status service, when accessed from either the plaintext port or one of the ports on the other servers, would still be able to callback on any other services which had registered with it to get the status response payload, right?\n{quote}\n\nWe discussed this in our original conversations.  In that scenario you wouldn't really even need to register the status service twice, just once, on a plaintext port that was separate from the production SSL Jetty instance.  The reason we opted not to go that path is because then you are potentially not validating the most important part of the production stack--the production SSL Jetty instance.  It would be possible to configure the SSL Jetty instance with bad thread counts, or bad SSL creds, or any number of other things, and end up in a state where the plain-text Jetty is humming along while the SSL one is completely down / unresponsive, and I think that in that situation the callback functions for the various TK services might still return 'true', and then we've failed in the task of giving load balancers a meaningful way to determine whether the service is up.\n\nIf a user prefers to configure the status service on a plaintext port and accept the risk described above, there's nothing preventing them from doing that and leaving the proxy disabled, right?\n\nWe could include some information to that effect in the docs...", "created": "2015-06-16T02:26:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nNot sure if we expect a high number of concurrent requests for the status feature? Maybe if multiple load balancers need to hit the server around the same time to get info?\n{quote}\n\nYeah, I wouldn't think so.  I'd be surprised if a user ever had more than a couple of them hitting it, and even if they did, the requests should be fast enough that it's not critical for them to be able to be concurrent.  It's kind of hard to fathom what could possibly explain the behavior they describe, though... it does seem like they are suggesting it's not playing nicely with an Apache server", "created": "2015-06-16T02:36:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}In that scenario you wouldn't really even need to register the status service twice, just once, on a plaintext port that was separate from the production SSL Jetty instance.{quote}\n\nYeah, I was just wondering if there was a desire to be able to hit the status endpoint directly at any available webserver port rather than limiting to a specific one.  Maybe that's not a requirement but, if it were, I'm not sure that the current implementation of the trapperkeeper-status / web-routing-service would accommodate that since it all seems to be oriented at configuring your handler for a specific server.\n\n{quote}It would be possible to configure the SSL Jetty instance with bad thread counts, or bad SSL creds, or any number of other things, and end up in a state where the plain-text Jetty is humming along while the SSL one is completely down / unresponsive, and I think that in that situation the callback functions for the various TK services might still return 'true', and then we've failed in the task of giving load balancers a meaningful way to determine whether the service is up.{quote}\n\nOk, thanks, and sorry -- that's the context I was missing earlier.\n\nFor cases of misconfiguration - insufficient threads to boot or unusable credentials - it seems like the server process would fail to ever start and so status reporting wouldn't even come into the picture.\n\nFor other cases like the port being practically usable due to being too heavily loaded, I actually see some value in having the status service be hit through a different port in the sense that we could have a better chance of delivering a usable response to the client.  For example, if on the server that the SSL port is attached to, the server has exhausted all of its worker threads and the worker queue is hopelessly backed up, a request to the status service via the SSL port would probably just hang indefinitely / maybe time out at some point?  If the status service were hit through a separate port, though, the webserver status info - which I'd hope would include rollup status info for every server/port configured within the Java process - could return negative \"is_running / status info\" (rolled up into a bad status code?) - with more detailed info potentially available and with hopefully a much faster response.\n\nIn any event, you're probably right that there are some cases where the behavior of making the request through the real SSL port vs. just a plaintext one that doesn't proxy back to the real SSL port may obscure some critical difference in behavior that a load balancer may need to have in order to make a decision about the overall health of the server.  Just wish I had a good use case in mind.\n\n{quote}If a user prefers to configure the status service on a plaintext port and accept the risk described above, there's nothing preventing them from doing that and leaving the proxy disabled, right?{quote}\n\nYeah, I think that would work fine.\n\n", "created": "2015-06-16T11:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nYeah, I was just wondering if there was a desire to be able to hit the status endpoint directly at any available webserver port rather than limiting to a specific one. Maybe that's not a requirement but, if it were, I'm not sure that the current implementation of the trapperkeeper-status / web-routing-service would accommodate that since it all seems to be oriented at configuring your handler for a specific server.\n{quote}\n\nLegit.  I think we can skirt that for now but it's a totally reasonable idea to consider for the future.\n\n{quote}\nOk, thanks, and sorry \u2013 that's the context I was missing earlier.\n{quote}\n\nNP, thanks for your diligence in making sure we weren't doing something asinine.  And sorry for not stating that point clearly enough earlier in the conversation.\n\n{quote}\n If the status service were hit through a separate port, though, the webserver status info - which I'd hope would include rollup status info for every server/port configured within the Java process - could return negative \"is_running / status info\" (rolled up into a bad status code?) - with more detailed info potentially available and with hopefully a much faster response.\n{quote}\n\nWe're not going to have a status callback for the webserver service for a while, though.  There will be some quirks around implementing that.  I have some ideas and definitely think we need to make it happen ASAP, but we'll probably (unfortunately) ship a release or two that uses the status service before we have that done.\n\n{quote}\nIn any event, you're probably right that there are some cases where the behavior of making the request through the real SSL port vs. just a plaintext one that doesn't proxy back to the real SSL port may obscure some critical difference in behavior that a load balancer may need to have in order to make a decision about the overall health of the server. Just wish I had a good use case in mind.\n{quote}\n\nYeah, that's fair.  Again, I definitely think we should document this as a sort of last-resort solution, but it does seem like it's worth having for last-resort scenarios :)\n", "created": "2015-06-17T03:53:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "One other thing that occurs to me is that we have some scenarios today where we have multiple Jetty servers defined in the same Trapperkeeper application instance - like for PE Console Services.  Should we design the tk-status proxy such that it is capable of proxying to more than just one port so that the health of the services could be checked through each relevant SSL port that may be in use?  Not sure what that would need to look like from an API perspective if we'd need to support it.  Maybe you'd need to include some sort of parameter on the URL in order to identify the server port that the status proxy would forward onto - constrained for security purposes to be no more than the set that the user had specified as possibilities in the status proxy TK configuration?", "created": "2015-06-18T17:25:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] do you guys have an immediate need for what [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] is describing above?", "created": "2015-06-19T01:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] notes on docs:\n\n* I'm envisioning a new markdown file in the `documentation` directory, and a link to it from the main `README.md`.\n* I'd start it off by describing the use case", "created": "2015-06-19T02:11:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "While we do have multiple jetty servers I think all the \"services\" live on the same instance.", "created": "2015-06-22T14:34:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "This looks like it failed CI : http://kahless.delivery.puppetlabs.net/job/enterprise_trapperkeeper-status_unit-clj_master/JDK=openjdk7,label=unit/25/console", "created": "2015-06-24T11:30:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-16T16:38:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6a895096"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyor4n:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_3086237_*|*_1_*:*_1_*:*_1948246_*|*_10007_*:*_2_*:*_1019222563_*|*_3_*:*_1_*:*_284320633_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_7315838537"}], "description": "In certain cases, the status service needs to be usable over plaintext HTTP because certain load balancers are going to be difficult/impossible to configure to use SSL certs/keys that from Puppet's CA.  However, our services typically talk HTTPS, and we want the status service to be exposed on the same jetty instance that the rest of the services are running on.  To that end, we need a proxy service that is configured with either a base URL or host+port, and a SSL cert, key, and CA cert, which can be exposed over plain HTTP and which will make HTTPS to the normal jetty instance to get the status information and return it to the client.\n\nThis probably also needs to be limited in-scope to only proxying endpoints that are known to be safe to expose over plain HTTP (eg, the status endpoint(s)).\n\nIt probably makes sense for this to be a separate TK service entirely, since I imagine many use-cases of the status service don't want this behavior, and in-fact it's got the potential to be pretty dangerous if things go wrong (i.e., exposing data over HTTP), so it seems desirable to be able to disable it completely.\n\nh3.QA:\nRisk Assessment: N/A; New Feature.  Testing handled in SERVER-583", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10391", "fixedVersions": [], "id": "10391", "issueType": "New Feature", "key": "TK-176", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-06-24T12:19:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HTTP{S} proxy for the status service", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "There was some discussion about issues around error handling in https://github.com/puppetlabs/trapperkeeper-status/pull/10", "created": "2015-05-11T15:17:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "I'm covering three cases:\n\n1) status check returns, but result doesn't conform to callback result schema\n2) status check throws a RuntimeException\n3) status check takes longer than 5 seconds. For now, I'm leaving this timeout unconfigurable.\n\nIn each case, the is-running is set to :unknown and the status field has a description of which of the three error cases happened.", "created": "2015-06-19T16:37:00.000000"}, {"author": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c", "body": "I haven't been able to cause a timeout error, but I have seen this working correctly when the state is actually an error", "created": "2015-07-01T12:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-16T16:30:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7a2e58d0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:8ee7ce10-5b29-49dc-ad32-53903d0d886c"}, {"fieldName": "QA Risk Probability", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "High"}, {"fieldName": "QA Risk Probability Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Brand new feature means that this his a higher probability of having a few issues"}, {"fieldName": "QA Risk Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Low"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbj3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Jun/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2435825_*|*_3_*:*_1_*:*_1916298_*|*_10009_*:*_1_*:*_6676590_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_509632489_*|*_10006_*:*_2_*:*_8717929215"}], "description": "The status service should handle the case when a callback function throws an error or blocks forever.  In the latter case, the status service should eventually time-out the execution of the callback and indicate that the service is unresponsive or down.  Whatever is returned, it should be obvious that the callback never returned - perhaps a status that's unique to this case, or at least an error message that describes clearly what happened.\n\n*Open Questions*\n* What is the timeout for the callback function?\n\nh3.QA:\nRisk Assessment: N/A; New Feature.  Testing handled in SERVER-583.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10216", "fixedVersions": [], "id": "10216", "issueType": "New Feature", "key": "TK-175", "labels": ["documentation", "status-service"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-07-01T14:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "status service callback error handling", "timeSpent": "PT0S", "updated": "2022-02-03T07:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-16T16:27:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@23a09137"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovcn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_490046_*|*_1_*:*_1_*:*_2627894_*|*_10007_*:*_1_*:*_168571681_*|*_3_*:*_1_*:*_345409173_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_771476772_*|*_10006_*:*_2_*:*_2595606590"}], "description": "Add ability to use query param to query the status service based of status level (i.e, critical/info/debug). This should be something like {{http://localhost:8140/status/v1/services/foo?level=debug}}, which should return the output of calling the {{foo}} service's status function with {{:debug}} as an argument. \n\nSee https://docs.google.com/a/puppetlabs.com/document/d/1B6mmg_EwTo7QpKtE5fd2NHyrZEIopsNwRgKeZdZ0z2I/edit for details.\n\nh3. QA\n----\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10668", "fixedVersions": [], "id": "10668", "issueType": "New Feature", "key": "TK-174", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2015-04-30T15:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add support for querying based on status level", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-16T16:25:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@259c14f9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyovcv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_289628_*|*_1_*:*_1_*:*_2745441_*|*_10007_*:*_1_*:*_429269106_*|*_3_*:*_1_*:*_5734259_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_3881102393"}], "description": "Query for only a specific version of a specific service's status e.g. puppet server's v2 status response.\n\nURL might be something like: http://localhost:8140/status/v1/services/puppetserver?service_status_version=2\n\nSee https://docs.google.com/a/puppetlabs.com/document/d/1B6mmg_EwTo7QpKtE5fd2NHyrZEIopsNwRgKeZdZ0z2I/edit for details.\n\n___________________\nRisk Assessment: N/A; New Feature.  QA Testing handled in TK-208 / SERVER-583.", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10329", "fixedVersions": [], "id": "10329", "issueType": "New Feature", "key": "TK-173", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2015-05-05T16:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add support for querying based on status version", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-16T16:23:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5b1fd3c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyowx3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_288150_*|*_1_*:*_1_*:*_2832132_*|*_10007_*:*_1_*:*_344967671_*|*_3_*:*_1_*:*_5216286_*|*_4_*:*_1_*:*_14496_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_771496643_*|*_10006_*:*_2_*:*_2589551438"}], "description": "Add support to query the status service for the status of a single service, by hitting an endpoint {{/status/v1/services/<service name>}}. If a service has registered multiple call back functions, this endpoint will return the latest one (by version).\n\nFor a service {{foo}} which has registered two status call back functions, {{foo-status-v1}} and {{foo-status-v2}}, hitting {{/status/v1/service/foo}} will return the result of calling {{foo-status-v2}}.\n\nIf the service name included in the endpoint does not exist, the endpoint will return a 404.\n\nSee https://docs.google.com/a/puppetlabs.com/document/d/1B6mmg_EwTo7QpKtE5fd2NHyrZEIopsNwRgKeZdZ0z2I/edit for details.\n\nh3.QA:\nRisk Assessment: N/A; new features: Testing organized in SERVER-583.\n", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10215", "fixedVersions": [], "id": "10215", "issueType": "New Feature", "key": "TK-172", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-04-28T16:09:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add ability to query for status on a per-service basis", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-16T16:20:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@62e96dcf"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-198"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyowwv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Urgency & Bandwidth: Finished functional review of other tickets in sprint, this was top priority ticket to pull in."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_251049_*|*_1_*:*_1_*:*_3030430_*|*_10007_*:*_1_*:*_680745260_*|*_3_*:*_1_*:*_512434085_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2159847031"}], "description": "In scope for this ticket:\n* define {{StatusService}} protocol with {{register-status}} function, and implement\n* {{register-status}} needs to simply store the information given to it in the TK context so that it can invoke the callback when handling an HTTP request and construct the response\n* service implementation should add ring handler at startup to handle status requests\n* ability to make an HTTP request to get the entire \"roll-up\" status\n* ability for consuming services to register a callback function which returns the current status for that service.  Each of these callbacks are invoked by the status service when handling an HTTP request.\n\nnot in-scope:\n* ability to request status of individual service\n* filtering of status info by level\n* status versioning\n\nh3.QA:\nRisk Assessment: N/A; New Feature.  Testing handled in SERVER-583", "epicLinkSummary": "generic status service for tk apps", "estimate": "PT0S", "externalId": "10667", "fixedVersions": [], "id": "10667", "issueType": "New Feature", "key": "TK-171", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "10350", "parentSummary": "generic status service for tk apps", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2015-04-24T12:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "implement basic status service functionality", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] Please correct my risk assessment in the Description if needed.\n\n", "created": "2015-03-25T14:41:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] - I don't see any risk assessment in the Description.  Am I blind?\n\nAlso ... this seems like it falls in the \"no risk\" bucket.", "created": "2015-03-25T14:44:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Oh, there it is.", "created": "2015-03-25T14:45:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "I've created https://github.com/puppetlabs/trapperkeeper-status, enabled hipchat notifications for the Puppet Server room, and updated \"prs for green\" for it. There are two PRs to do the rest of the setup: one on trapperkeeper-status adding the initial skeleton and adding Travis, and one on ci-job-configs for getting the appropriate jenkins jobs setup.", "created": "2015-03-27T16:08:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-16T16:09:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45e7718c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-447"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp21r:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_17097095_*|*_1_*:*_1_*:*_3646359_*|*_10007_*:*_1_*:*_236676715_*|*_3_*:*_1_*:*_15707323_*|*_5_*:*_1_*:*_17879842490_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_930838093"}], "description": "Initial project setup for the Trapperkeeper status service:\n* github repo, open-source, under puppetlabs namespace\n* travis to run 'lein test' on PRs\n* jenkins jobs for CI and release\n* hipchat notifications\n___\nRisk assessment: Low (QA will not perform any validation)\nProbability: Low (internal infrastructure with no obvious customer facing interface)\nSeverity: Low (best guess)", "epicLinkSummary": "Non PE- Puppet Server tickets to be scoped", "estimate": "PT0S", "externalId": "10381", "fixedVersions": [], "id": "10381", "issueType": "New Feature", "key": "TK-170", "labels": ["status-service"], "originalEstimate": "PT0S", "parent": "16693", "parentSummary": "Non PE- Puppet Server tickets to be scoped", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-03-30T14:35:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "initial setup for status service project", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Travis build working in the linked PR", "created": "2015-03-13T14:18:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:557058:3a3de6c6-95b1-47b3-a52a-6a6865ff9241] [Jenkins PR|https://github.com/puppetlabs/ci-job-configs/pull/174] up if you want to take a look at it", "created": "2015-03-13T14:21:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Jankins job is working: http://kahless.delivery.puppetlabs.net/job/enterprise_ruby-hocon_unit-ruby_master/", "created": "2015-03-17T11:22:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "PRs have been merged.  [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] - can you please make sure that Travis actually runs correctly on one of the PRs on ruby-hocon and then close this?", "created": "2015-03-18T09:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-11T17:27:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@653a36bf"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyya6n:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Missed in scoping"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_9043980_*|*_1_*:*_1_*:*_147678324_*|*_10007_*:*_1_*:*_167355010_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_261749337"}], "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10327", "fixedVersions": [], "id": "10327", "issueType": "Task", "key": "TK-169", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-03-18T12:11:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "set up Jankins jobs and Travis CI on ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Whoever does this work should also send an e-mail to the dev list, explicitly listing the settings that we've removed hard-coded defaults for, outlining what Jetty's implicit defaults are for each setting, and elaborating on the delta between that implicit default and what we had been doing with our override (if any).", "created": "2015-03-05T17:04:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I was just chatting with [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] and I think we decided that this ticket needs to happen before TK-148, and that we want to get both of them in in time for the Puppet Server 1.1 release.  For this ticket, we'll probably leave the hard-coded defaults for the thread count setting alone, and unwind them as part of the work for TK-148 instead, since there will be some overlap in that part of the work.\n\nHopefully when this ticket is done we'll have a clear pattern that can be followed for the TK-148 fixes.", "created": "2015-03-06T09:58:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This ticket appears to have skipped the functional review process.  If there is a reason why, it just needs to be stated somewhere in the comments.  If not, QA needs to assess risk etc...", "created": "2015-03-25T15:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] All that this ticket did was to change the code around how we surfaced default values for some (largely esoteric) Jetty settings.  I don't believe there is anything here that is worth spending any of your time trying to review.", "created": "2015-03-26T09:03:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Thank you.\nClosing, see above.  It doesn't seem worthy of formal risk review, but if that is needed probability = low because the jetty defaults will only change when the jetty version is bumped.  Additionally there is other testing that covers these settings.", "created": "2015-03-30T15:16:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-05T16:58:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1fdc8e6f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp20n:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Urgency and late consensus "}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_29528486_*|*_1_*:*_1_*:*_343778794_*|*_10007_*:*_1_*:*_488276073_*|*_3_*:*_1_*:*_80388333_*|*_5_*:*_2_*:*_515798095_*|*_10011_*:*_1_*:*_430775311_*|*_10006_*:*_1_*:*_261692955"}], "description": "Representatives from several clojure dev teams met recently to discuss something that we've been inconsistent about in our tk-j9 code base: what to do for default values for settings that we expose to our end users.\n\nIn some cases, we've wired up the settings such that if the user doesn't provide an explicit override value, we forcefully set the value of the setting to some other default that we've determined.  This default is usually (always?) set to what we determined that Jetty was using for it's implicit default (for the particular version of Jetty that we were shipping at the time).  In other cases, we only set the setting in our code *if* the user has explicitly provide a value.  Otherwise we just let Jetty do whatever it does implicitly to configure the setting.\n\nAfter spirited debate I think we achieved some level of consensus that the latter approach is better than the former, but that we weren't going to take on all of the work of unwinding all of those changes right away.  This ticket is to capture that work.\n\nSo, step 1 is to go through the existing tk-j9 configuration code and remove any places where we're hard-coding a default if the user doesn't specify one.\n\nThere are a couple of concerns that people had with this approach, though:\n\n1. Our docs often describe what the default value of a setting is, and we would no longer know for sure that they were correct across Jetty upgrades.\n2. It would probably be wise for us to be forced to be aware if Jetty changed a default, so we could at least consider the repercussions.\n\nTherefore, some additional work that should be done for this ticket is to add a new test namespace called 'jetty_defaults_test' or something similar.  It should contain a test/tests that spin up a Jetty instance without passing in any of our overrideable configuration options, and just call the 'get' method on the various Jetty objects that relate to each setting, with an assertion that the value matches a hard-coded representation of our expected default value for the setting.\n\nThis test namespace should contain a big obnoxious warning comment at the top, which lets users know that if any of these tests start failing on a Jetty upgrade, the fix will need to be made in both the test *and the docs*.", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10593", "fixedVersions": ["TK-JETTY9 1.3.0"], "id": "10593", "issueType": "Improvement", "key": "TK-168", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-03-30T15:16:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Remove hard-coded defaults in tk-j9, add tests to catch upstream default changes", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:254cdefb-9532-46cb-b4ac-84c3df97d6af] we just talked through this with [~accountid:557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4]", "created": "2015-03-09T17:27:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "Puppet would ideally have a cleaner way of doing this, but see https://github.com/reidmv/puppet-module-yamlfile/blob/master/lib/puppet/type/yaml_setting.rb#L84-L122 for a rough example of one way to work around the issue. It's been long enough that I don't remember the particulars, but it might be useful as a research start if there isn't a good way of accomplishing real variable typing.\n\nI think the crux of the workaround is basically this: https://github.com/reidmv/puppet-module-yamlfile/blob/master/lib/puppet/type/yaml_setting.rb#L105. It's ugly and has caveats, but works for most cases with the notable exception of a 1-element array (in which case the user must explicitly specify a type argument).", "created": "2015-03-09T17:28:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We should bump to the latest hocon gem before tackling this work.  ping [~accountid:623e7507866b810069e57527] [~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0]", "created": "2015-04-01T12:36:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I'm thinking the implementation for this is going to be pretty similar to what [~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49] did in the yamlfile module. That implementation seems best to me from a user-facing perspective, as the user only has to worry about one parameter as opposed to 3 or 4, and the type will only need to be specified when there's a single-element array being passed in.\n\nI'm thinking we'll also want to support a user passing in the exact text they want placed into the file for a setting (which the new ConfigDocument API allows). I think we'll probably allow another type, 'exact_text' or some such, to be specified. In that case, the exact string the user passed will be parsed and placed into the ConfigDocument, which will allow users to add things like commented maps/arrays into their config file if they so choose. ", "created": "2015-04-08T17:45:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I'm pretty sure that all PRs associated with this have been merged and released in 0.9.0, so I'm going to close this issue.", "created": "2015-04-14T17:41:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T16:58:00.000000", "creator": "557058:254cdefb-9532-46cb-b4ac-84c3df97d6af", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3ee1ad1d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0rz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1034478344_*|*_10007_*:*_1_*:*_430990520_*|*_3_*:*_1_*:*_13630842_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2062266943"}], "description": "When attempting to manage a value in a configuration file that is an array the puppetlabs-hocon module will pop the first value of the array off and convert the value to a string.\n\nReproduction manifest:\n{noformat}\nhocon_setting { 'some setting':\n    path => '/tmp/test.conf',\n    setting => 'somesetting',\n    value => [\"1\", \"2\", \"3\"],\n}\n{noformat}\n\nThis produces a config file that looks like this:\n{noformat}\nsomesetting=\"1\"\n{noformat}\n\nIf i'm not mistaken this is a limitation with Puppet as if you add the `array_matching` argument to `newproperty(:value)` if casts everything into an array. That being said the module should have some way to manage configurations that are suppose to be arrays.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10388", "fixedVersions": [], "id": "10388", "issueType": "Bug", "key": "TK-167", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:254cdefb-9532-46cb-b4ac-84c3df97d6af", "resolution": "Fixed", "resolutionDate": "2015-04-14T17:41:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Puppetlabs-Hocon module has no way of managing arrays in configurations", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "passed CI in http://kahless.delivery.puppetlabs.net/job/enterprise_ruby-hocon_unit-ruby_master/4/", "created": "2015-03-17T14:55:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T12:24:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2e720350"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyygmv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Community"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_285699_*|*_1_*:*_1_*:*_446259737_*|*_10007_*:*_1_*:*_83709525_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_598442021"}], "description": "As of [this PR|https://github.com/typesafehub/config/pull/271], the upstream HOCON library now has lossless tokens as the first part of a new public API that will be useful for our use cases. These changes need to be ported down to ruby-hocon.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10453", "fixedVersions": [], "id": "10453", "issueType": "Task", "key": "TK-166", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Done", "resolutionDate": "2015-03-17T14:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port lossless tokens to ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-04T11:52:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ac947ef"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hz3xjj:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_448228729_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_92692816113"}], "description": "While adding a test to another project using clj-http-client to ensure that all requests have a Connection: Keep-Alive header, I discovered that by default the HttpAsyncClientBuilder we're using in clj-http-client defaults to providing this header (as well as a couple others) in all requests made with the built client.\n\nWe should add a test to clj-http-client to verify that all requests are made using a Connection: Keep-Alive header, and document this and the other included headers as defaults.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10666", "fixedVersions": [], "id": "10666", "issueType": "Task", "key": "TK-165", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Do", "resolutionDate": "2018-02-14T12:23:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add Connection: Keep-Alive test to clj-http-client, and document default headers", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-04T11:40:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@669c99eb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp21b:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_535340350_*|*_1_*:*_1_*:*_448888295_*|*_10007_*:*_1_*:*_342035696_*|*_3_*:*_1_*:*_770083294_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_163682521"}], "description": "As part of the changes we're making to the upstream HOCON library, we're going to need to write a new parser. This parser will take Tokens and parse them into a tree of ConfigNodes. We will also need to write tests for this Parser.\n\nThis is probably going to need to be done type-by-type. However, since we don't entirely know yet what ConfigNode is going to have as subclasses, this ticket probably can't be broken up any further at this point in time.\n\nThe implementation discussion is [here|https://github.com/typesafehub/config/issues/272].\n\n___\nRisk assessment: N/A  (Tickets/PRs in the HOCON epic will be evaluated by QA later)", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10385", "fixedVersions": [], "id": "10385", "issueType": "Task", "key": "TK-164", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-03-30T16:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON: Create new Parser to parse Tokens into ConfigNodes", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-04T11:35:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1d48dca1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp20f:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_535338317_*|*_1_*:*_1_*:*_10198843_*|*_10007_*:*_1_*:*_1119350054_*|*_3_*:*_1_*:*_595442165_*|*_5_*:*_1_*:*_0"}], "description": "As part of the changes we're making to the upstream HOCON library, we're going to need to add a new class, ConfigNode, representing a node in the new ConfigDocument AST. This will end up having subclasses representing various different node types, and will contain relevant tokens.\n\nThe implementation discussion is [here|https://github.com/typesafehub/config/issues/272].\n\n___\nRisk assessment: N/A  (Tickets/PRs in the HOCON epic will be evaluated by QA later)", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10379", "fixedVersions": [], "id": "10379", "issueType": "Task", "key": "TK-163", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-03-30T16:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON: Create ConfigNode and write tests", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I started working on this and found a rabbit hole.\n\n{{ConcatenationTest}} exercises both concatenation and substitution, neither of which are currently implemented in ruby-hocon.  I'm giving up on this for now - https://github.com/KevinCorcoran/ruby-hocon/commit/7e0cf85b18fc5d439d4b4b5193a92d922607d5cf is what I did.\n\n[~accountid:623e7507866b810069e57527] talked about this, and decided that when we get around to this, it's probably best to just ignore the test cases in {{ConcatenationTest}} which deal with substitution, and then come back around of those as part of TK-161.", "created": "2015-03-12T18:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T11:12:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@43eeacfa"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0qv:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_82394201_*|*_1_*:*_1_*:*_450599148_*|*_10007_*:*_1_*:*_75524365_*|*_3_*:*_2_*:*_1309648001_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_672032596"}], "description": "The tests in the ConcatenationTest file in the upstream HOCON library need to be ported down to ruby-hocon and made to pass.\n\n___\nRisk assessment: N/A  (Tickets/PRs in the HOCON epic will be evaluated by QA later)", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10214", "fixedVersions": [], "id": "10214", "issueType": "Task", "key": "TK-162", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-04-03T11:42:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port ConcatenationTest tests down to ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "See note on TK-162 about {{ConcatenationTest}} and test cases which exercise substitution. ", "created": "2015-03-12T18:08:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "this is blocked, more-or-less, until concatenation is implemented.", "created": "2015-03-18T11:15:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We met and discussed the list of tests that we haven't ported down yet, and decided there was probably more value in porting the PublicAPI tests than the ConfigSubstitution tests, so I've updated this ticket accordingly.  Besides the PublicAPI tests and the tests that we'll need to bring down from upstream related to the ConfigDocument changes that [~accountid:623e7507866b810069e57527] has been making there, we've decided that the remaining tests are probably not a good ROI for now.  We'll add more later if bugs surface.", "created": "2015-03-30T16:28:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T11:11:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7d385f54"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp0r3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_766113_*|*_1_*:*_1_*:*_450649488_*|*_3_*:*_1_*:*_620313288_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_1056530367_*|*_10006_*:*_2_*:*_907318951"}], "description": "The tests in the PublicAPITest file need to be ported down to ruby-hocon and made to pass.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10299", "fixedVersions": [], "id": "10299", "issueType": "Task", "key": "TK-161", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Done", "resolutionDate": "2015-04-08T15:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port PublicAPI tests down into ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "I'm going to need to look through these tests and ensure my upstream changes won't cause them to change in a significant manner before anyone starts working on porting them over.", "created": "2015-03-11T16:26:00.000000"}, {"author": "623e7507866b810069e57527", "body": "Just took a look at these tests, and it looks like all the ConfParserTests are using either Parseable.parse() or ConfigFactory.parse(), which uses Parseable.parse(), to parse test configurations. The internal implementation details of these are going to change once my changes go into the upstream library, but the public facing API should not change, so these test can be ported whenever.", "created": "2015-03-18T11:20:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Actually, I just looked at this test, and it relies on substitutions.  So we should probably wait on this until after TK-161 lands.", "created": "2015-03-18T11:21:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm going to start porting these tests down now", "created": "2015-03-19T12:53:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T11:09:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1898d69c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp21z:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_20132_*|*_1_*:*_1_*:*_450723773_*|*_10007_*:*_1_*:*_18110477_*|*_3_*:*_1_*:*_940062239_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_91191041_*|*_10006_*:*_1_*:*_755977811"}], "description": "The tests in the ConfParserTest file in the upstream HOCON library need to be ported down to ruby-hocon and made to pass.\n___\nRisk assessment: N/A  (Tickets/PRs in the HOCON epic will be evaluated by QA later)", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10597", "fixedVersions": [], "id": "10597", "issueType": "Task", "key": "TK-160", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-03-30T14:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port ConfParserTest tests to ruby-hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Passing CI", "created": "2015-03-30T16:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T11:09:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@24b4388d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp21j:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_450720709_*|*_3_*:*_1_*:*_1642864916_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_169676362"}], "description": "To support upstream additions to the java library that will eventually be ported back to ruby hocon, it would be nice to flesh out test coverage for ruby hocon\n___\nRisk assessment: N/A  (Tickets/PRs in the HOCON epic will be evaluated by QA later)", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10665", "fixedVersions": [], "id": "10665", "issueType": "Task", "key": "TK-159", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Done", "resolutionDate": "2015-03-30T16:50:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port config value tests to ruby hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] - can you please add a link to your PR to this ticket?", "created": "2015-03-13T16:36:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Passing in CI", "created": "2015-03-17T12:08:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T11:07:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6d387981"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3n3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_83250604_*|*_1_*:*_1_*:*_441247097_*|*_10007_*:*_1_*:*_419490504_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_179269169"}], "description": "To support upstream additions to the java library that will eventually be ported back to ruby hocon, it would be nice to flesh out test coverage for ruby hocon", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10592", "fixedVersions": [], "id": "10592", "issueType": "Task", "key": "TK-158", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Fixed", "resolutionDate": "2015-03-17T12:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port path tests to ruby hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0] - why is this in 'ready for CI'?  If this was done already, can you add a link to the PR in which it landed?", "created": "2015-03-17T11:24:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] PR added, marking it as resolved since the Jenkins job is up and running, and passing", "created": "2015-03-17T12:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-03-04T10:59:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5a79b07b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3mv:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_533229661_*|*_1_*:*_1_*:*_169100468_*|*_10007_*:*_1_*:*_416955252_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_4422468"}], "description": "To support upstream additions to the java library that will eventually be ported back to ruby hocon, it would be nice to flesh out test coverage for ruby hocon", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10591", "fixedVersions": [], "id": "10591", "issueType": "Task", "key": "TK-157", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Fixed", "resolutionDate": "2015-03-17T12:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port token tests to ruby hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-03-04T10:51:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Scrum Team/s", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "value": "Puppet Server"}, {"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3835c741"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Color", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-color", "value": "ghx-label-6"}, {"fieldName": "Epic Name", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-label", "value": "Green: HOCON and ruby-hocon improvements"}, {"fieldName": "Epic Status", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-status", "value": "Done"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Issue color", "fieldType": "com.pyxis.greenhopper.jira:jsw-issue-color", "value": "green"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyorb3:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_77840_*|*_6_*:*_1_*:*_0_*|*_10010_*:*_1_*:*_19787545290"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10452", "fixedVersions": [], "id": "10452", "issueType": "Epic", "key": "TK-156", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-10-19T12:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HOCON and ruby-hocon improvements", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Do we have jenkins coverage of these tests?  If not, we probably need to set that up before closing this ticket out.", "created": "2015-03-05T20:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-26T10:34:00.000000", "creator": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@693904a5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3lz:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Reprioritized HOCON work"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "06/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1006696139_*|*_1_*:*_1_*:*_57037_*|*_10007_*:*_1_*:*_268154680_*|*_3_*:*_1_*:*_365993858_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_16724"}], "description": "We don't have any test coverage of the tokenizer in ruby HOCON. However, we're making some upstream changes to the tokenizer that we'll need to port down to ruby HOCON. Before that happens we need to get good test coverage of the tokenizer to ensure it's working, and the best way to do this is to port the tests and get them passing.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10382", "fixedVersions": [], "id": "10382", "issueType": "Task", "key": "TK-155", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "resolution": "Done", "resolutionDate": "2015-03-17T11:23:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port tokenizer tests to ruby hocon", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "[~accountid:623c0b72bef8a60068c796ce] Your work on TK-158 covers this ticket, right? I believe I saw tests in the PathTest file that explicitly tested this functionality.", "created": "2015-03-11T16:31:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "[~accountid:623e7507866b810069e57527] Yes, it has that specific scenario, this ticket should be covered by TK-158", "created": "2015-03-16T11:18:00.000000"}, {"author": "557058:cedccc1b-f1a9-45c9-a3e5-6b5e96ad99f0", "body": "Closing as duplicate. The functionality is covered in TK-158", "created": "2015-03-17T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-25T17:58:00.000000", "creator": "557058:254cdefb-9532-46cb-b4ac-84c3df97d6af", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@47639c72"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3nb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_428957563_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_83464156_*|*_10006_*:*_1_*:*_1184773155"}], "description": "The puppetlabs-hocon module does not manage configurations with quotes in the setting parameter.\n\nReproduction steps:\n\ntest.pp\n{noformat}\npe_hocon_setting { 'test':\n  path    => '/tmp/ticket.conf',\n  setting => 'some.\"value.setting\"',\n  value   => 'foo bar',\n}\n{noformat}", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10451", "fixedVersions": [], "id": "10451", "issueType": "Bug", "key": "TK-154", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:254cdefb-9532-46cb-b4ac-84c3df97d6af", "resolution": "Duplicate", "resolutionDate": "2015-03-17T10:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Hocon module does not manage configs with quotes in the setting parameter", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:623e7507866b810069e57527] - Should this still be in \"ready for CI\"?", "created": "2015-03-17T11:22:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] We left it in Ready for CI as we're not sure how CI works for the HOCON project. I'd say it's probably safe to move this out of Ready for CI at this point, though, since it's been two weeks since the PR was merged and everything seems fine.", "created": "2015-03-17T11:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-25T12:16:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7ad5e635"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3l3:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Found"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Reprioritized HOCON work."}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1116991637_*|*_1_*:*_1_*:*_8695_*|*_10007_*:*_1_*:*_163750957_*|*_3_*:*_1_*:*_440788133_*|*_5_*:*_1_*:*_0"}], "description": "As part of some upcoming changes we're planning to submit upstream to the Java HOCON library, we need to improve the Token system in HOCON to be lossless. This will likely involve adding a field to the Token class that is a string representing the exact Token. We will also need to add a render method, which takes a list of tokens and turns them into a string.\n\nThe exact steps will likely to be to add the render method that turns a list of tokens into a string, update the tokenizer tests to ensure that rendering the list of tokens returns the original string, and then extending the tokenizer, tokens, and parser to get the tests passing.", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10590", "fixedVersions": [], "id": "10590", "issueType": "Task", "key": "TK-153", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Done", "resolutionDate": "2015-03-17T11:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improve Tokens in the the Java HOCON library to be lossless", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] [~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c] this is probably something that you guys want to address for PE3.8.  Hopefully it's not too difficult and we are happy to provide guidance, but TK-proxy in console services is the only place where we are currently using the ProxyServlet.", "created": "2015-02-23T17:31:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] thanks for the ping. Our 3.8 backlog is already over-committed so we're collecting work in an \"aspirational\" backlog in case we can accomplish more. I'll assign this issue to that backlog. [~accountid:557058:db3c8c5c-5825-4424-a788-64c2fa922e24] once we have the NC migration tooling work scoped, can you prioritize this in the plan? ", "created": "2015-02-24T10:40:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Your team, your call", "created": "2015-02-24T11:40:00.000000"}, {"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "[~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c] let's get this pointed by the team and go from there.", "created": "2015-02-24T12:25:00.000000"}, {"author": "557058:da659199-c749-426a-b5d9-6563e2c1710a", "body": "I would point this at a 5 since while the scope of work doesn't seem that big it's dealing with Java / low level stuff that at least I would take a minute to get good context on", "created": "2015-03-03T15:23:00.000000"}, {"author": "557058:49fa80d1-d814-4a31-b9be-550fdd9b8cd4", "body": "General FYI for anyone reading the thread. This seems to have migrated in the source a little compared to the original ticket:\n\nhttps://github.com/eclipse/jetty.project/blob/jetty-9.3.0.M2/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AbstractProxyServlet.java#L244-L259", "created": "2015-03-23T11:38:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "After talking with [~accountid:557058:5c808afb-dce6-44a1-922d-296dc2c81fe8], I think this TK issue is interfering with our board. I've created a new PE clone of this issue, which we'll use to track any node management services work for this issue.", "created": "2015-03-27T16:43:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "nope, never mind, that wasn't it. we'll keep this one.", "created": "2015-03-27T16:44:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "Closing as part of a mass close won't-fix. If this is inaccurate and this ticket is important to fix in the next release(s), please re-open and request prioritization.", "created": "2015-05-12T11:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-19T15:40:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6ccc29e1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypbqn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Node Management Services"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_414070394_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_6027728892_*|*_10005_*:*_1_*:*_624067087"}], "description": "The ProxyServlet that Jetty uses for the {{add-proxy-route}} feature creates an HTTPClient.  This client allocates a ClientSelectorManager and spins up several associated selector threads.  By default, these threads are allocated from the thread pool which is held by the Server under which the ProxyServlet is registered.\n\nSee https://github.com/eclipse/jetty.project/blob/jetty-9.1.0.v20131115/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/ProxyServlet.java#L261-L278\n\nJetty has some logic which throws a fatal exception if an attempt is made to start the Server and a sufficient number of selectors and acceptors cannot be allocated from its thread pool.  This calculation, however, does not take the ProxyServlet's HTTPClient into account and could, therefore, lead to situations in which the Server is started without error but the thread pool is depleted, leaving incoming HTTP requests to the Jetty server to be dropped into the worker queue but then never read / processed.  This can result in dangling HTTP connections on the server in TCP CLOSE_WAIT state with unconsumed data in the connection's receive queue.\n\nPer the code mentioned above in ProxyServlet, it is possible for the ProxyServlet to be configured to create and use its own separate thread pool - by passing a \"maxThreads\" init parameter into the servlet.  It might be better to use this approach so that Jetty's Server thread pool doesn't have to account for the ProxyServlet upfront - and, therefore, doesn't run the risk of starving the Server thread pool of threads needed to process incoming HTTP requests.  Also, it might be good to expose the ProxyServlet \"maxThreads\" as a separate optional user-configurable setting for a proxy route.\n\nAlternatively, the ProxyServlet could continue to draw threads from its hosting Server but the {{create-server}} function in trapperkeeper-webservices-jetty9 could throw an exception if the explicitly-configured max-threads value is not large enough to handle any default connector selectors + connector acceptors + ProxyServlet selectors.  This would only work, however, if all proxy routes were registered at Server start time.  For the case that the webservices-jetty9 service would auto-adjust the number of threads up to a needed minimum for booting, it may be possible to also auto-bump the maximum size of the QueuedThreadPool up on discovery of each proxy route.\n\nIf we do anything to address this situation at all, I'd be inclined to go with a separate configurable thread pool for each ProxyServlet route as it just seems cleaner to have the pools separated for client vs. server purposes.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10297", "fixedVersions": [], "id": "10297", "issueType": "Task", "key": "TK-152", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Fix", "resolutionDate": "2015-05-12T11:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "ProxyServlet HTTP client threads can starve Jetty thread pool", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "[~accountid:557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4] is this something we could consider for PE 3.8?", "created": "2015-02-19T22:28:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:db3c8c5c-5825-4424-a788-64c2fa922e24] everything in this epic is stuff that my team believes needs to go in.", "created": "2015-02-20T07:15:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "I consider the probability that a customer will encounter issues with this change to be low based on the manual and automated unit testing in the PR and because we provide a sensible default, and finally because this should only affect operations when things are under a large load or slow for some reason.\n\nI consider the severity of issues that a customer may encounter around this issue to be medium.  This is hard to measure because there are many possible scenarios.  One extremely visible scenario is that parts of the PE console wouldn't work right under load.  Some agent runs might not complete if an endpoint times out because a large catalog is being complied.\n\nQA views this as a medium risk change, and plans to perform functional review, but not to provide automated testing.  We will check that the setting actually takes effect, and that the jetty session stays open as long as we expect.\n\nI would appreciate comments and corrections on my above notes from [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] ...", "created": "2015-03-20T12:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] That all sounds sane to me, thanks.", "created": "2015-03-20T12:35:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Tested in ubuntu 14 with foss build 1.0.4.SNAPSHOT.2015.03.24T0146\n\nset idle-teimout-milliseconds = 100000 in /etc/puppetserver/conf.d/webserver.conf (misspelling on purpose)\npuppetserver failed to start and generated an applicable error message.\n\nset idle-timeout-milliseconds = 100000 in /etc/puppetserver/conf.d/webserver.conf\ntelnet localhost 8140\nTakes a long time to timeout.\n\nset idle-timeout-milliseconds = 1   restarted\ntelnet localhost 8140\nTimes out very quickly.\n\nset idle-timeout-milliseconds = 3000    restarted\ntelnet localhost 8140\nTimeout takes about 3 seconds.\n\nResolving.", "created": "2015-03-24T14:06:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-18T14:13:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@12523ee5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp1vj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_327115729_*|*_1_*:*_1_*:*_442571595_*|*_10007_*:*_1_*:*_376325293_*|*_3_*:*_1_*:*_90356587_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_1296643366_*|*_10006_*:*_1_*:*_400722877"}], "description": "Jetty has a setting called 'idle timeout' that can be used to cause the server to forcefully disconnect clients if their connection is idle for longer than a specified amount of time.  We should make this setting accessible through our config files.\n___\nRisk assessment: Medium (QA will perform FR, but no automated testing.)\nProbability: Low (internal infrastructure with no obvious customer facing interface)\nSeverity: Medium", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10326", "fixedVersions": ["TK-JETTY9 1.2.0"], "id": "10326", "issueType": "New Feature", "key": "TK-151", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-03-24T14:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Expose 'idle timeout' as a first-class config setting in tk-j9", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Jenkins job passed after this was integrated - https://jenkins.puppetlabs.com/job/trapperkeeper-webserver-jetty9/70/.  Moving to \"testing\".", "created": "2015-03-25T10:03:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Tested 1.0.8 Puppet Server candidate package on CentOS 7 VM.  This package included tk-jetty 1.3.0, which included a fix for this ticket.\n\n\u2014\n\nAdded the following to the \"webserver\" section in {{/etc/puppetserver/conf.d/webserver.conf}} and restarted puppetserver service:\n\n{noformat}\nssl-selector-threads = 100\nssl-acceptor-threads = 99\n{noformat}\n\nRan the following to determine the number of selector threads started by the process:\n\n{noformat}\nsudo -u puppet jstack `ps -ef | grep java | grep puppetserver | awk '{print $2}'` | grep \"\\-selector\\-\"\n{noformat}\n\nOutput from the command was 100.\n\nRan the following to determine the number of acceptor threads started by the process:\n\n{noformat}\nsudo -u puppet jstack `ps -ef | grep java | grep puppetserver | awk '{print $2}'` | grep \"\\-acceptor\\-\"\n{noformat}\n\nThe result was 99.", "created": "2015-03-29T01:01:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "/opt/puppet/lib/jvm/pe-java/bin/jstack\n", "created": "2015-03-30T16:45:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Tested manually on RHEL7 with 3.8.0-rc0-422-g7f182c9, using the steps described by Jeremy above.\nedit /etc/puppetlabs/puppetserver/conf.d/webserver.conf\nset ssl-selector-threads & ssl-acceptor-threads\ncd  /opt/puppet/lib/jvm/pe-java/bin/jstack\n\nsudo -u pe-puppet ./jstack $(ps -ef | grep java | grep puppetserver | awk '{print $2}') | grep -c selector\n\nsudo -u pe-puppet ./jstack $(ps -ef | grep java | grep puppetserver | awk '{print $2}') | grep -c acceptor\n\n\n\nCreation of automated test de-prioritized in favor of other tasks.", "created": "2015-03-31T19:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-17T16:47:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5881fce2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Minor"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp1xj:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Scope change around PE 3.8"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_141264031_*|*_1_*:*_1_*:*_5447313_*|*_10007_*:*_1_*:*_287921841_*|*_3_*:*_1_*:*_250559310_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_554233369_*|*_10006_*:*_1_*:*_2397246538"}], "description": "Jetty's algorithm for configuring selectors (dedicated threads for detecting when data is available to read from an open connection) and acceptors (dedicated threads for detecting when a new connection is being made) is significantly different between 9.1.0 and 9.2.7.  The work done for porting the tk-jetty9 service to 9.2.7 in TK-141 follows the defaults that Jetty uses for selectors and acceptors.  As these ultimately can have some significant performance implications, it might be good to just make selectors and acceptors externally configurable so that users have the ability to adjust these as needed for the specific needs of their webserver.\n\n----\nRisk assessment: High (automated test needed)\nProbability: Medium (effects users needing to adjust timeout)\nSeverity: High (No work around available)", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10664", "fixedVersions": ["TK-JETTY9 1.3.0"], "id": "10664", "issueType": "New Feature", "key": "TK-148", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-03-31T19:58:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider making Jetty acceptors and selectors configurable in tk-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-02-13T15:05:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@61903c71"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyye2v:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_72909049_*|*_1_*:*_1_*:*_6351_*|*_10007_*:*_1_*:*_342298377_*|*_3_*:*_1_*:*_6945264_*|*_5_*:*_1_*:*_0"}], "description": "A lot of projects have been running into problems wherein SSL configuration is optional, but if it is configured, certain options are required. Each of these projects is extracting the SSL options and doing error handling in a slightly different way. We should add a function to jvm-ssl-utils that will take a map of options, extract the SSL options, perform error handling, and configure an SSLContext.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10296", "fixedVersions": ["JVM-SSL-UTILS 0.8.0"], "id": "10296", "issueType": "New Feature", "key": "TK-146", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-02-18T12:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add function to jvm-ssl-utils that extracts SSL options from a map and configures an SSLContext", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-02-12T17:41:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@215c4b7d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "PUP-3639"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyydnr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_11444192_*|*_1_*:*_1_*:*_918706_*|*_10007_*:*_1_*:*_3257755_*|*_10009_*:*_1_*:*_66869977_*|*_5_*:*_1_*:*_0"}], "description": "clj-http-client will, in certain cases, add an incorrect {{charset}} to a request's {{content-type}} header.\n\nIn particular, this affects use-cases in which the body is *not* a string, and the caller specifies a mime-type but no charset.  For example, sending a binary data - passing a byte stream as the request body, and specifying {{application/octet-stream}} as the {{content-type}} will result in a request with a {{content-type}} of {{application/octet-stream; charset=UTF-8}}, which does not make any sense.", "epicLinkSummary": "Green: Puppet 4.0 Changes/Deprecations", "estimate": "PT0S", "externalId": "10505", "fixedVersions": ["HTTP-CLIENT 0.4.2"], "id": "10505", "issueType": "Bug", "key": "TK-145", "labels": [], "originalEstimate": "PT0S", "parent": "28947", "parentSummary": "Green: Puppet 4.0 Changes/Deprecations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-02-13T16:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client sometimes adds a bogus charset", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "attachments": [], "comments": [{"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "If this were to translate to something like allowing users to create a standard format jetty.xml file and have it be used to configure the jetty server, this would be useful. If our users are required to programmatically manipulate the jetty server by writing java or clojure, this is less useful. Our users are systems administrators who can figure out how to use a standard-format configuration file (like a jetty.xml), but not so much java/clojure programming.\n\n+1 for accepting a jetty.xml for custom configuration. That would be very enabling.", "created": "2015-02-19T17:03:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49] the thing is: we don't really want to allow them to configure everything that a jetty.xml would allow.  We don't want to support that, and we don't want to end up in a situation like we did with apache before where people were co-opting it for things that we didn't intend, and then we had to deal with concerns about us taking functionality away from them when we switched out the webserver. \n\nI consider this feature to be something that a customer would basically never use by themselves", "created": "2015-02-19T17:27:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] those are valid points. I'm onboard with exposing raw or nearly raw Jetty configuration in order to enable a powerful debugging utility, and I'm also in agreement that it needs to be limited somehow to debugging use cases only. In that light I was overly broad in my prior comment describing who it would be useful to.\n\nI do see this as being useful for debugging prior to a support escalation. The difference between implementing something configuration-file based (jetty.xml) and something code-based (Janino) is who it enables. If a standard jetty.xml config could be used to adjust the server object, that enables anyone in the Customer Success organization at Puppet Labs - support engineers, technical solutions engineers, and professional services engineers - to access and adjust attributes that we either didn't think to expose at a trapperkeeper/app level, or attributes that we intentionally don't expose there but which may be useful for debugging. If a code-based implementation is built instead, that will cut off access to the tool to the majority of Customer Success. It will introduce a language barrier and a reference barrier. Customer Success engineers typically aren't comfortable with java/clojure and even if they are familiar with Jetty, they will have a harder time finding references for how to translate what they would know how to do in a jetty.xml kind of config to what to do programatically. Such a tool will in practice be useful only to a subset of the Engineering organization.\n\nI read through the linked pull request and saw that Kevin Corcoran had an initial thought similar to mine about implementing a standard means of Jetty configuration rather than a new programatic one. This suggests to me that a configuration-based approach is the most intuitive means of achieving the desired end, and if we're choosing another path it should be because it's significantly easier for us or because it brings something valuable to the table which is worth the complexity cost. No matter what we implement, using it won't be a supported production configuration.\n\nI understand the motivation to prevent end users from relying on a post-configuration hook in production, but if that is the primary motivation for making the tool obfuscated to relevant parts of our own company, I believe we should reconsider. We should make the best tool for the purpose, easiest to use and most accessible to everyone who may have a need to use it for its intended purpose. If we feel we need to lock it down there are better ways to do it than making the tool itself sharp around the edges or harder to carry.\n\nI can imagine that there might be other motivations for providing programatic access over a standard configuration file, though I may not be aware of them yet. We may also feel as time goes on that the need to perform post-configuration on the Jetty server object diminishes as the number of configuration parameters we expose in our pass-through goes up. Until then, I feel that resources outside of Engineering have the same debugging needs Engineering does around these products, and would benefit in a similar way from having access to this level of debugging configuration, if it were accessible to them. That human enablement utility should be weighed alongside whatever technical benefit we gain from programatic manipulation over standardized jetty.xml configuration.", "created": "2015-02-20T09:53:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}\nI do see this as being useful for debugging prior to a support escalation. The difference between implementing something configuration-file based (jetty.xml) and something code-based (Janino) is who it enables. If a standard jetty.xml config could be used to adjust the server object, that enables anyone in the Customer Success organization at Puppet Labs - support engineers, technical solutions engineers, and professional services engineers - to access and adjust attributes that we either didn't think to expose at a trapperkeeper/app level, or attributes that we intentionally don't expose there but which may be useful for debugging.\n{quote}\n\nSo we are 90% on the same page here", "created": "2015-02-20T10:54:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Also, to be clear, I don't mean to be confrontational about this", "created": "2015-02-20T11:01:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] your tone is great, nothing to worry about. Thanks for taking the time to walk through it all! To test any argument you have to build it up and see how it holds. I appreciate you taking the time to address this one, and all the thought you've put into the problem overall.\n\nWe don't actually have to agree to disagree. My primary concern was as to whether or not the points had been appropriately considered, and you've presented enough reasoning here to give me that assurance. In this light I'm personally happy to jump onboard with the planned implementation. +1 :)", "created": "2015-02-20T12:53:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Awesome, thanks [~accountid:557058:97578a32-3955-4c5c-939e-58a878437b49].", "created": "2015-02-20T13:03:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-12T16:15:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1dfffa37"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Critical"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyycv3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_172034939_*|*_1_*:*_1_*:*_97898_*|*_10007_*:*_2_*:*_574325395_*|*_3_*:*_2_*:*_457157651_*|*_5_*:*_1_*:*_0"}], "description": "A problem that we have had a few times with Jetty is that, in order to try to make it easy for our users to manage the application without having to be Jetty experts, we run Jetty embedded and only surface a subset of its configuration options that we believe the users might care about.\n\nThis provides a pretty nice UX in cases where we've plumbed the appropriate settings through into our config before shipping a build, but, it can be problematic when we are trying to debug a customer issue and we discover a potentially-relevant Jetty setting that we haven't wired through to our configuration files... it means that we can't toggle the Jetty config setting without shipping them a new build.\n\nAfter discovering how logback supports some basic Java scripting in their EvaluatorFilters (via a library called Janino), it occurred to me that we might be able to support something similar for our Jetty configuration.\n\nThis would allow us to expose a setting (for advanced use cases only) where a user could provide some code to manipulate a Jetty `Server` object programatically.  This should theoretically allow us to cobble together some sample configuration to ship to users who already have a build installed that can modify basically any setting that is available in Jetty.\n\nUse cases for this setting would hopefully be temporary, and when we find new Jetty settings that we determine would be valuable to users, we can just plumb them through to our normal configuration for the next release, but this would give users a workaround that doesn't require us to ship them a whole new build in the interim.", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10294", "fixedVersions": ["TK-JETTY9 1.2.0"], "id": "10294", "issueType": "New Feature", "key": "TK-144", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-02-26T14:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow script-based configuration of Jetty for advanced use cases", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "On reassessing the current acceptance tests, we decided that the coverage they were providing wasn't worth the effort to keep the suite running.  So the associated PR filed for this removes the acceptance tests and associated infrastructure.\n\nThe acceptance suite basically covered the following:\n\n1) Generate SSL CA certificate and certificates for a client and server.\n2) Boot up a Jetty web server with a port to use with the SSL server and CA certificates.\n3) Use Ruby Puppet's {{Puppet::Network::HttpPool}} to make an SSL client request to the Jetty server and confirm success.\n\nThe basic functionality around generating CA and associated certificates and validating the content is already much more comprehensively covered in other unit tests in the jvm-ssl-util suite.\n\nThe trapperkeeper-webservices-jetty9 test suite - https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/trapperkeeper-webserver-jetty9-1.1.1/test/clj/puppetlabs/trapperkeeper/services/webserver/jetty9_service_test.clj - already has much broader coverage around SSL and certificate configuration for the Jetty web server.\n\nThe puppet-server test suite - https://github.com/puppetlabs/puppet-server/blob/puppet-server-1.0.3/test/unit/puppetlabs/puppetserver/ruby/http_client_test.clj - already has much broader coverage around making SSL requests through the HTTP client layer in Ruby, {{Puppet::Server::HttpClient}}, that the puppetserver master would use.  Note that these are lower-level tests than the ones in the jvm-ssl-utils suite in that the {{Puppet::Network::HttpPool}} calls down into {{Puppet::Server::HttpClient}}.  This fact alone wouldn't seem to warrant keeping the jvm-ssl-utils acceptance suite in place.  Arguably, tests at this level could be created in the Puppet Server unit/integration test suite, but I don't think it's worth the effort.  Ultimately, this would all be covered much better at a system level in PE tests and any Puppet Server -> PuppetDB testing.", "created": "2015-02-25T15:10:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-12T16:11:00.000000", "creator": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@69190679"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyyd93:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_899999_*|*_1_*:*_1_*:*_35106_*|*_10007_*:*_1_*:*_74624988_*|*_3_*:*_1_*:*_3774281_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1041845538"}], "description": "This library is failing on Jenkins for what appears to be issues related to old versions of rspec/beaker/rvm that we're pinning to in the job config and pre-suite.\n\nIf this is correct, the course of action is probably just to bring this job up to speed with the new way of configuring them, and get rid of any unnecessary pre-suite installations.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10589", "fixedVersions": ["JVM-SSL-UTILS 0.y"], "id": "10589", "issueType": "Bug", "key": "TK-147", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0f255f44-5dce-4849-80f5-c0db60d9b049", "resolution": "Fixed", "resolutionDate": "2015-02-25T15:37:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jvm-ssl-utils acceptance failure", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2015-02-12T09:31:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3c740d3f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp533:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_457410620_*|*_1_*:*_1_*:*_27819059_*|*_10007_*:*_1_*:*_60192082_*|*_3_*:*_1_*:*_3784745_*|*_5_*:*_1_*:*_0"}], "description": "The most recent Jenkins runs of the clj-http-client unit tests encountered some test failures.  See:\n\nhttps://jenkins.puppetlabs.com/job/http-client/27/\n\nThese may be related to similar SSLv3-related test failures that we recently started experiencing with newer JDK versions being used in Puppet Server Jenkins CI jobs - documented in SERVER-332.  We should look into applying a similar change in clj-http-client so that the SSLv3-related tests can continue to be run successfully.\n\nFrom SERVER-332:\n\nWe're getting unit test failures in Jenkins resulting from Java 1.7.0 Update 75.  In the release notes \\[1\\], and CVE-2014-3566 \\[2\\] they mention the following:\n\n{quote}\nStarting with the January 20, 2015 Critical Patch Update releases (JDK 8u31, JDK 7u75, JDK 6u91 and above) the Java Runtime Environment has SSLv3 disabled by default.\n{quote}\n\nAnd\n\n{quote}\nSSLv3 is disabled by default\nStarting with JDK 7u75 release, the SSLv3 protocol (Secure Socket Layer) has been deactivated and is not available by default. See the java.security.Security property jdk.tls.disabledAlgorithms in <JRE_HOME>/lib/security/java.security file.\n\nIf SSLv3 is absolutely required, the protocol can be reactivated by removing \"SSLv3\" from the jdk.tls.disabledAlgorithms property in the java.security file or by dynamically setting this Security property to \"true\" before JSSE is initialized.\n{quote}\n\n\\[1\\]: http://www.oracle.com/technetwork/java/javase/7u75-relnotes-2389086.html\n\\[2\\]: http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html\n\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10504", "fixedVersions": [], "id": "10504", "issueType": "Task", "key": "TK-143", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-02-18T18:04:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client SSLv3 unit test failures", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Ping [~accountid:557058:6fc1f430-f771-4686-a97e-21c5e35f9100] [~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] I mentioned this in the support document the other day, so in case you are interested.", "created": "2015-02-11T16:51:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "Merged into master as bed722d9a75ffca4ccb89dd33808e5f12084f772", "created": "2015-02-13T13:21:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Was the new library submitted to RE (if that needs to be done)?", "created": "2015-02-17T16:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] ooooh good call, thanks.  I did not.  And haven't even looked at the license.  Will need to do that.", "created": "2015-02-17T16:21:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] thanks for catching that.  Filed RE-4011.", "created": "2015-02-17T16:40:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This ticket is blocked by RE-4011.", "created": "2015-02-24T16:20:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This ticket is blocked for testing by RE-4011.  I know the library is already in available snapshots, but given that we are targeting a PE release, I want to test this in a full PE build.  I'm operating on the assumption the RE will update RE-4011 when the library is available in a full PE build.", "created": "2015-03-03T12:07:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "RE has approved the Janino library.", "created": "2015-03-06T14:50:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Considering medium probability, medium severity, medium risk.\n\nFunctional review performed against 1.0.7.SNAPSHOT.2015.03.12T1550 on 3.8.0-rc0-185-ge19f44d\n", "created": "2015-03-13T16:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-11T16:49:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@90acc9f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Minor"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3mn:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_428351050_*|*_1_*:*_1_*:*_72906_*|*_10007_*:*_1_*:*_154891265_*|*_3_*:*_1_*:*_5323593_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_2_*:*_1729918887_*|*_10004_*:*_1_*:*_269092498"}], "description": "During a recent support escalation, we had an issue where the customer needed to temporarily filter a particularly noisy exception from the log files to prevent them from growing to tens of gigabytes.  Logback has some really nice support for this using their `EvaluatorFilter` and related filters:\n\nhttp://logback.qos.ch/manual/filters.html#evalutatorFilter\n\nHowever, these filters require a dependency on a library called `janino` that we are not currently shipping.\n\nWe should add support for this as it can be extremely useful for support issues.", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10378", "fixedVersions": ["TK 1.1.0"], "id": "10378", "issueType": "New Feature", "key": "TK-142", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-03-13T16:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add support for logback EvaluatorFilters", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This belongs in the PE3.8 epic...", "created": "2015-03-09T10:19:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Resolving this in favor of tracking the validation work in PE-8586", "created": "2015-03-12T17:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-10T12:33:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4ace6960"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3fz:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "09/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_167072176_*|*_1_*:*_1_*:*_21011661_*|*_10007_*:*_1_*:*_447080831_*|*_3_*:*_1_*:*_839070302_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_1131772392"}], "description": "This ticket would cover attempting to upgrade the tk-jetty9 dependency on Jetty to the latest published version, 9.2.7.v20150116.", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10450", "fixedVersions": ["TK-JETTY9 1.2.0"], "id": "10450", "issueType": "Task", "key": "TK-141", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-03-12T17:26:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Attempt to upgrade tk-jetty9 Jetty dependency to latest - 9.2.7.v20150116", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] This appears to be low risk.  We are just exposing an existing setting in Jetty to our WebConnect method, right?", "created": "2015-03-05T16:15:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Yeah, I think it's low risk.\n\nAlso would be a pain to try to do anything but a manual test for this at the \"system\" level.  I've had to resort to performing network traces and inspecting the content to see that it lines up with my expectations per the {{so-linger-seconds}} time I had set in the Trapperkeeper configuration.\n\nIf you are as well, I'd be comfortable letting this go with no additional QA above the automated tests we integrated with the feature work.", "created": "2015-03-05T16:19:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Resolving.  Considered low risk, see above.", "created": "2015-03-06T09:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-02-10T11:54:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6345501a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp3fr:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "05/Mar/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_676721279_*|*_1_*:*_1_*:*_3076660_*|*_10007_*:*_1_*:*_777598787_*|*_3_*:*_1_*:*_19161154_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_588764673"}], "description": "The Trapperkeeper-Jetty9 service should support a way to configure a way to explicitly set the soLingerTime onto the ServerConnectors that it configures with Jetty.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10375", "fixedVersions": ["TK-JETTY9 1.2.0"], "id": "10375", "issueType": "Task", "key": "TK-140", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-03-06T09:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Expose way to set soLingerTime for ServerConnectors in tk-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924] thanks for the feedback!  We'll put some thought into this.\n\nIn the mean time, what I might suggest is that you write a small 'wrapper' service around the built-in config service.  You could define a protocol called something like 'EnvironmentAwareConfigService', and copy the relevant function signatures from the 'ConfigService' protocol.  Then you could provide your own implementation of `get-config` that wraps the function from the built-in ConfigService and adds in your environment variable checking logic.\n\nAt that point you could simply have your other services express a dependency on `:EnvironmentAwareConfigService`, rather than on the built-in `:ConfigService`.\n\nDoes that seem like a reasonable workaround for now?", "created": "2015-01-20T09:49:00.000000"}, {"author": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "body": "I made a gist of what you suggested:\n\nhttps://gist.github.com/taylorSando/4bbbe8217ddb2863ae8c\n\nI don't really have that many services, so it wasn't that much work to switch it.  It would still be nice to have the config service automatically transforming the necessary environmental variables.  ", "created": "2015-01-20T12:50:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Cool, that looks very much like what I was imagining.  I'll keep this ticket open and make sure we consider it next time we're doing API/design work related to the config service.\n\nThanks!", "created": "2015-01-20T14:04:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-01-19T13:23:00.000000", "creator": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7368271d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyxxm7:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Jan/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_88899009_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_224970418242"}], "description": "Maybe this has already been implemented, but it would be nice if the configuration files could specify an environmental variable, like \"ENV_MY_VARIABLE\"  At the moment I'm saving my config file into a git repo, and I don't feel like this is a good idea long term.\n\nI think you could make the change at puppetlabs/trapperkeeper/config.clj in the load-config function right at the end after the merge.\n\nYou could run this function:\n\n(clojure.walk/postwalk\n   (fn [x]\n     (if (string? x)\n       (if-let [[_ env] (re-find #\"ENV_(.*+)\" x)]\n         (System/getenv env)\n         x)       \n       x)))\n\nIt goes through and changes any string value with a prefix of ENV_ into its environmental variable.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10596", "fixedVersions": [], "id": "10596", "issueType": "New Feature", "key": "TK-138", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:9ea9eb4e-1f01-42e1-8052-8d6d8e8ac924", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Have the config service read environmental variables", "timeSpent": "PT0S", "updated": "2022-03-08T09:51:00.000000", "votes": "2", "watchers": []}, {"affectedVersions": [], "assignee": "623cfdfb8d8b9c0068b93e3c", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "There are three different timeouts that the underlying Apache http-client library exposes on a per request basis:\n\n* connectionRequestTimeout - appears to control the amount of time that a client will wait for a connection in the Apache client's internal connection pool to free up.\n\n* connectTimeout - appears to control the amount of time that a client will wait for a socket connection to be made with the server.\n\n* socketTimeout - appears to control the amount of idle time that the client wait for between data segments when reading a response back from a server.  Presumably, expiration of the timeout would cause the connection to be closed by the client.  This may also control the amount of time that the Apache library will allow a connection to remain idle -- with no requests started by the client -- before the connection is aborted.\n\nMore information on these options are here:\n\nhttps://github.com/apache/httpclient/blob/4.3.5/httpclient/src/main/java/org/apache/http/client/config/RequestConfig.java#L225-L264\n\nThe {{connectTimeout}} and {{socketTimeout}} values sound like they'd both be good to expose for external client configuration.  {{connectionRequestTimeout}} sounds more like an internal detail of how the Apache client pooling works but it may still be useful to expose.\n\nI'd suggest exposing all three settings as part of this work.\n\n", "created": "2015-03-02T17:01:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Also, the defaults for {{connectTimeout}}, {{socketTimeout}}, and {{connectionRequestTimeout}} are here:\n\nhttps://github.com/apache/httpclient/blob/4.3.5/httpclient/src/main/java/org/apache/http/client/config/RequestConfig.java#L341-L343\n\nThe values of -1 for each indicate that the effective values used as the default are \"undefined\" - system default.", "created": "2015-03-13T10:39:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "PR was merged and unit test job passed in Jenkins - https://jenkins.puppetlabs.com/job/http-client/32/.  Moving to \"Testing\".", "created": "2015-03-20T11:38:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Note that in the PR we ultimately went with exposing just the {{connectTimeout}} and {{socketTimeout}} since {{connectionRequestTimeout}} seemed like more of an internal Apache client handling detail that, if ever needed, we'd probably want to expose along with some other settings around the connection pool configuration.", "created": "2015-03-20T12:15:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "This has been extensively tested already.  Resolving.", "created": "2015-03-20T12:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-01-13T16:01:00.000000", "creator": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3cabfaed"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Major"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp1vb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Rescoped SERVER-1.0.4 and this was above the cut line"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_82710972_*|*_1_*:*_1_*:*_587865820_*|*_10007_*:*_1_*:*_257561148_*|*_3_*:*_2_*:*_261505015_*|*_6_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_4394511_*|*_10006_*:*_2_*:*_4493375923"}], "description": "Earlier today I found myself wanting to increase the timeout on the proxy the classifier UI uses, because the classifier API was taking too long to respond. However, the proxying is done by ring-middleware which simply uses clj-http-client to make requests, and after talking with [~accountid:623e7507866b810069e57527] I learned that that's not currently configurable.\n\nThe ability to configure this timeout would be extremely useful for support situations where slow responses are an issue.\n\n---\n\nThe work for this issue ultimately involved exposing two new client configuration settings:\n\n{{connect-timeout-milliseconds}} - maximum number of milliseconds that the  client will wait for a connection to be established.\n\n{{socket-timeout-milliseconds}} - maximum number of milliseconds that the client will allow for no data to be available on the socket before closing the underlying connection, 'SO_TIMEOUT' in socket terms.\n\n----\nRisk assessment: High (automated test needed)\nProbability: Medium (effects users needing to adjust timeout)\nSeverity: High (No work around available)", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10588", "fixedVersions": ["HTTP-CLIENT 0.4.3"], "id": "10588", "issueType": "Improvement", "key": "TK-134", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:6e79b811-3a3e-4713-9f4e-ef17b127b24f", "resolution": "Fixed", "resolutionDate": "2015-03-20T12:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Make timeout on clj-http-client configurable", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:bab073e0-f060-421e-9465-366c4060cc31", "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd], [~accountid:557058:252602f6-56c9-47a2-a176-2c9c57106330] - fyi.  Maybe a companion ticket should also be filed under PuppetDB to track this change?", "created": "2015-01-09T09:45:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] [~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd] did you guys ever decide whether you were going to HOCON for 3.0?", "created": "2015-02-02T16:46:00.000000"}, {"author": "557058:dc666788-5651-476c-a211-ec5b44a7b0dd", "body": "Based on a March 11th delivery date and the console db rewrite requirements, definitely not. We've talked about it, but not gone beyond that.", "created": "2015-02-02T17:05:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "The referenced PR was merged into master, therefore I'm moving this ticket into Green : Puppet 4.0 changes.  Please let me know if this is incorrect.\n", "created": "2015-03-09T10:24:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "It was merged into tk-j9 master branch, but there are no plans to include that version in Puppet Server 2.0.", "created": "2015-03-09T10:48:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "I got the wrong repo.  As Chris mentions above, there are no plans to include this in Puppet Server 2.0.  This needs to be in the PE 3.8 / PuppetServer 1.1 epic.\n", "created": "2015-03-09T12:15:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Test by setting up a config file and make sure there are commas inbetween each value, and ensure that the puppetdb service comes up?  I need to discuss with Russell Mull.", "created": "2015-03-20T12:57:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Using 3.8.0-rc0-311-gecd98f3 on RHEL7l, validated that pe-puppetdb can read a jetty.ini file from /etc/puppetlabs/puppetdb/conf.d that contains these entries:\ncipher-suites = TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\nssl-protocols = TLSv1, TLSv1.1, TLSv1.2, SSLv3\n\nLog output supplies:\n2015-03-24 15:25:14,662 DEBUG [o.e.j.u.s.SslContextFactory] Enabled Protocols [SSLv3, TLSv1, TLSv1.1, TLSv1.2] of [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2]\n2015-03-24 15:25:14,668 DEBUG [o.e.j.u.s.SslContextFactory] Enabled Ciphers   [TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256] of [TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_DH_anon_WITH_AES_128_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_NULL_SHA256, SSL_RSA_WITH_NULL_SHA, SSL_RSA_WITH_NULL_MD5, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_DH_anon_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA, TLS_KRB5_WITH_RC4_128_SHA, TLS_KRB5_WITH_RC4_128_MD5, TLS_KRB5_WITH_3DES_EDE_CBC_SHA, TLS_KRB5_WITH_3DES_EDE_CBC_MD5, TLS_KRB5_WITH_DES_CBC_SHA, TLS_KRB5_WITH_DES_CBC_MD5, TLS_KRB5_EXPORT_WITH_RC4_40_SHA, TLS_KRB5_EXPORT_WITH_RC4_40_MD5, TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5]\n", "created": "2015-03-24T16:26:00.000000"}], "components": ["TrapperKeeper"], "created": "2015-01-09T09:43:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@643d5107"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "SERVER-355"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp1vr:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "PDB work"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "02/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_77763375_*|*_1_*:*_1_*:*_955263534_*|*_3_*:*_1_*:*_14073502_*|*_5_*:*_1_*:*_0_*|*_10011_*:*_1_*:*_2077614325_*|*_10006_*:*_1_*:*_3289533739"}], "description": "In the 0.5.2 release of tk-jetty9, validation of the configuration was moved to Prismatic schema.  During this process, support for specifying the values for the {{ssl-protocols}} and {{cipher-suites}} webserver settings as a comma-delimited string was lost.  Note from these links -- https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/doc/jetty-config.md#cipher-suites and https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/doc/jetty-config.md#ssl-protocols -- that support for delimiting the values with commas is still implied to be supported.  The only way to specify these values in 0.5.2 later is via a configuration format like HOCON which allows for the value to be expressed within an array.\n\nSee this commit from the Prismatic schema PR for what this looked like prior to the change:\n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/25/files#diff-1fc7ef9acd5fbc52947b0a4ba167e727L252\n\nBecause of this change, it is no longer possible to specify {{ssl-protocols}} or {{cipher-suites}} via the INI configuration file format.  Latest PuppetDB packaging still supports specification of its configuration via INI files.  PuppetDB's master branch has been updated to depend upon a tk-jetty9 version later than 0.5.2 and, therefore, no longer supports user specification of the {{ssl-protocols}} and {{cipher-suite}} settings.  Fortunately, the latest PuppetDB release, 2.2.2, is referencing a pre-0.5.2 release of tk-jetty9 and, therefore, is not susceptible to this problem.\n\nUntil such time as support for INI configuration of tk-jetty9 settings can go away completely, we should look to restore the ability for tk-jetty9 to handle specification of the {{ssl-protocols}} and {{cipher-suites}} values as comma-delimited strings.  PuppetDB would then need to be updated to reference a newer tk-jetty9 which would have this change.\n\n----\nRisk assessment: Medium (manual validation needed)\nProbability: Medium (impacts users needing to specify cipher-suite)\nSeverity: Medium (work around available)", "epicLinkSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "estimate": "PT0S", "externalId": "10663", "fixedVersions": ["TK-JETTY9 1.2.0"], "id": "10663", "issueType": "Bug", "key": "TK-133", "labels": [], "originalEstimate": "PT0S", "parent": "15250", "parentSummary": "SERVER 1.0.8 / PE 3.8: Improvements based on debugging support escalations", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-03-24T16:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Restore comma-delimited string for ssl-protocols and cipher-suites in tk-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623a46a7a95758006959fe31] thanks for opening the ticket!  Sorry for the delayed response, schedule has been a bit crazy with the holidays.\n\nWithout having had a chance to dive into it, your analysis sounds totally reasonable... would you be interested in submitting a PR with your proposed changes to the precond?", "created": "2014-12-31T12:29:00.000000"}, {"author": "623a46a7a95758006959fe31", "body": "No worries, thanks for replying.\n\nI just submitted a pull request for this. Frankly, it does what I'd like in the near term, but I'd be curious about the intent of the built-in logging configuration in TK. I'm actually not using the \"outer layers\" of the TK Config service with the .cfg file, etc.\n\nLogback presents an example case where I think the common case is for the logback.xml to be on the classpath, and it mostly likely gets there by being a resource packaged in the jar file. It would be nice to just point to that from the TK config file, but unfortunately, there's no standardized \"classpath:\" url protocol for indicating a classpath resource and passing that in in place of the file path.\n\nThis gets into a whole subject of managing configuration in dependencies, which I'm not trying to open up, but this Logback case provides an example of how the way TK Config is structured now limits its ability to control the config of those dependencies. That's the main reason I'm unfortunately not leveraging the outer aspect of the TK Config service.\n\nAnyway just an observation from a user. Thanks for open sourcing TK. It's the core that I appreciate, which is why I'm using it!", "created": "2015-01-06T18:43:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{quote}I just submitted a pull request for this.{quote}\n\nThanks!  It looks like it broke some tests, and I think we might want to add another test to validate that it solves the problem you were aiming for.  We can tackle that on our end when we get a chance, or if you end up with bandwidth and want to update it we'd be happy to help answer any questions if anything's not clear.  In any case, the PR is helpful in understanding exactly what behavior you were after.\n\n{quote}Frankly, it does what I'd like in the near term, but I'd be curious about the intent of the built-in logging configuration in TK. I'm actually not using the \"outer layers\" of the TK Config service with the .cfg file, etc.\n\nLogback presents an example case where I think the common case is for the logback.xml to be on the classpath, and it mostly likely gets there by being a resource packaged in the jar file. It would be nice to just point to that from the TK config file, but unfortunately, there's no standardized \"classpath:\" url protocol for indicating a classpath resource and passing that in in place of the file path.{quote}\n\nYeah.  Honestly, if you don't specify a value in the configuration for a path to a logging config file, we *should* just default to letting logback initialize the way it normally would (which, as you said, would include searching the classpath).  If that's not how things work today, I'd almost consider that a bug... and we should be able to fix it easily.  I don't know for sure off of the top of my head if that's how things currently work or not, since we always use a logback config file on disk for our own apps.\n\n{quote}\nThis gets into a whole subject of managing configuration in dependencies, which I'm not trying to open up, but this Logback case provides an example of how the way TK Config is structured now limits its ability to control the config of those dependencies. That's the main reason I'm unfortunately not leveraging the outer aspect of the TK Config service.\n{quote}\n\nFair point.  We have some very specific use cases that we needed to address for our apps and users, which is how the config evolved to what it currently is.  That said, I think that for cases like you're describing where a dependency can provide its own configuration mechanisms, we shouldn't be doing things in TK that preclude that.  We might do things in TK that *supplement* that in order to provide a simplified config interface for our end users (who definitely are exposed to the config files and who may not want/need to learn the full details of configuring the dependency directly), but we shouldn't preclude the upstream config patterns.  If you see other cases where we're doing this we'd love to hear about them.\n\n{quote}Anyway just an observation from a user. Thanks for open sourcing TK. It's the core that I appreciate, which is why I'm using it!{quote}\n\nThe feedback is greatly appreciated.  We're excited about the core too, but we do recognize that there are still some rough edges around booting, config, etc., and we'd love to simplify and polish those, so getting input from users on where the pain points are is very helpful.  In fact, I'd be really interested at some point in seeing a snippet of code that illustrates how you're booting, since you're not using the .cfg file--if you're willing / able to share.  I think it might be informative for us in terms of how we can make that better.  We'd like to do a 2.0 at some point and improving the boot and config APIs is near the top of the wish list.\n\nThat's probably a topic for another Jira though :)  Thanks again for the feedback and the PR.", "created": "2015-01-07T07:57:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-24T03:38:00.000000", "creator": "623a46a7a95758006959fe31", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@577d52f3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypi27:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Dec/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1690209115_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_225651142512"}], "description": "puppetlabs.trapperkeeper.logging/configure-logger-via-file! has a precondition on its logging-conf-file argument to be a string. Unless, I'm missing a context/intended use, this is unnecessarily restrictive. The underlying constructor is able to handle more types.\n\nIn particular, I think it would be desirable to be able to pass in a resource, not just a file path string.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10376", "fixedVersions": ["TK 1.1.1"], "id": "10376", "issueType": "Improvement", "key": "TK-131", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623a46a7a95758006959fe31", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:00:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "configure-logger-via-file! function preconditions are too restrictive", "timeSpent": "PT0S", "updated": "2022-03-08T10:00:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "So the general operation in pseudocode would look like this:\n\n{code}\nIF max-threads.is_set? THEN\n    USE max-threads\nELSE\n    new-max-threads = calc_max_threads()\n    IF new-max-threads > DEFAULT-MAX-THREADS\n        USE new-max-threads\n        LOG warning\n    ELSE\n        USE DEFAULT-MAX-THREADS\n    END\nEND\n{code}", "created": "2014-12-18T14:13:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The above pseudocode sounds correct to me.  Wanted to add some information here on what would need to be considered for the implementation of `calc_max_threads`.\n\nThe consistent piece of the algorithm that I've seen across the Jetty versions I've looked at (although this may not hold true for future releases, hard to say) is:\n\n* For each connector (port/host combination), add up the number of selectors and acceptors.\n* Add 1 to the total.\n\nFor the version of Jetty that all of the latest services are based on, v9.1.0.v20131115, the algorithm appears to include:\n\n* Selectors - Number of cores: https://github.com/eclipse/jetty.project/blob/jetty-9.1.1.v20140108/jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java#L211\n* Acceptors - Maximum of 1 or the number of cores / 2: https://github.com/eclipse/jetty.project/blob/jetty-9.1.0.v20131115/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java#L193", "created": "2014-12-19T09:41:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The fact that the algorithm Jetty is using to calculate the number of selectors and acceptors per connector has been changing from one Jetty version to the next is a little disturbing.  For users that have been setting {{max-threads}} explicitly, this could lead to insufficient thread failures on an upgrade to a newer Jetty dependency in the future.  In order to head off this potential problem as well as to reduce the potential turmoil over time that the {{calc_max_threads}} would need to be adapted to, I think we'd be better off having the tk-jetty9 service explicitly set the number of selectors and acceptors that each connector uses.\n\nIn tk-jetty9's {{ssl-connector}} function (jetty9_core.clj) today, the implementation constructs the {{ServerConnector}} as follows:\n\n{code}\n(ServerConnector. server ssl-ctxt-factory (connection-factory))\n{code}\n\nThere's an alternate constructor for {{ServerConnector}} that takes in number of acceptors, number of selectors, and an sslContextFactory as parameters.  For the work on this ticket, I think it would be good to use this alternate constructor and hard-code the acceptors and selectors to the number configured for Jetty as of the v9.1.0.v20131115 release.\n\nIt may make sense at some point to expose acceptor and selector counts through the connector-level Trapperkeeper webserver configuration.  This could give users more control for tuning these on a per connector basis.  Where these are very Jetty-centric, though, and the webserver configuration has been intended to be fairly webserver-agnostic, though, it may be best to postpone a discussion about exposing these values to a later time.", "created": "2014-12-19T10:38:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "Awesome, thanks for the info, [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]. This all sounds sane to me so I'll take this path. \n\nHere's the requisite psuedocode\n{code}\nn_selectors = NUM-CORES\nn_acceptors = max(1, floor(NUM-CORES/2))\nthreads_per_connector = n_selectors + n_acceptors + 1\n{code}\n\nSound good?", "created": "2014-12-19T11:50:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Yep, and then add 1 to the sum of all of the {{threads_per_connector}}.  Sounds good.", "created": "2014-12-19T11:53:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "All right, it's amended. ", "created": "2014-12-19T12:15:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Accepted for QA in PE 3.72.\nPing [~accountid:557058:a2383cac-f799-49a4-8b30-0d737d991e23].  This is the ticket driving my request to have a VM with many cores.", "created": "2015-01-06T12:40:00.000000"}, {"author": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31], do you know where we're at with testing this ticket?", "created": "2015-01-20T12:26:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] It hasn't been tested yet.  I'm throwing a QE ticket requesting a vm with 40 cores.\n", "created": "2015-01-22T15:17:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "We are unable to come up with a VM with 40 cores.  Our VMware environment is limited to 32 cores, as is AWS.  Justin and Jeremy are confident in the fix.  I'm setting this to Resolved.", "created": "2015-01-23T15:59:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-18T14:01:00.000000", "creator": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7a2bf8c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp8z3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Dec/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_760186451_*|*_1_*:*_1_*:*_63246_*|*_10007_*:*_1_*:*_1559992848_*|*_3_*:*_1_*:*_95669393_*|*_10009_*:*_1_*:*_701592003_*|*_5_*:*_1_*:*_0"}], "description": "If the number of cores on a box and the number of connectors attached to Jetty is sufficiently large then Jetty will attempt to allocate more threads than its default maximum threads. To alleviate this problem the Trapperkeeper Jetty  9 service needs to dynamically calculate the maximum number of threads needed start up. This \"dynamically calculated default\" will not override the \"max-threads\" setting if a user has specified it, and if the calculated number of threads is less than the default of 100, then the setting will remain unchanged.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10449", "fixedVersions": ["TK-JETTY9 1.1.0"], "id": "10449", "issueType": "Improvement", "key": "TK-130", "labels": ["3.7.2"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "resolution": "Fixed", "resolutionDate": "2015-01-23T16:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Create a dynamic default for max-threads", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] did we get in a fix for this?", "created": "2015-01-21T17:01:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] No, we haven't gotten a chance to address this yet", "created": "2015-01-21T17:03:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ok, np.  just wanted to make sure this ticket should still be open.", "created": "2015-01-21T17:23:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I've confirmed that Typesafe Config tolerates IP addresses as values (just treats them as strings), and that they don't work properly in ruby-hocon.", "created": "2015-03-13T12:49:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-12T16:30:00.000000", "creator": "557058:808c35de-34a9-46bd-a472-c5ecf2deee86", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@44036eb4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "Epic Link", "fieldType": "com.pyxis.greenhopper.jira:gh-epic-link", "value": "TK-156"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:bab073e0-f060-421e-9465-366c4060cc31"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyya6f:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scope Change Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Urgency & Bandwidth"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Jan/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_87336821_*|*_1_*:*_1_*:*_2681884466_*|*_10007_*:*_1_*:*_249625421_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_5167256010"}], "description": "The hocon gem used for the conffile module lacks double/float support and has a bug in which it will parse an ip as a float. (which is how we found it lacks float support). This makes it difficult to use the module, since most of our services require ips in the config (listen_addresses at 0.0.0.0).\n\nA test exposing the issue is below.\n\n{code}\nit \"should be able to handle settings with ip addresses\" do\n    resource = Puppet::Type::Conf_setting.new(common_params.merge(\n      :setting => 'test_key_2.listen_address', :value => '0.0.0.0'))\n    provider = described_class.new(resource)\n    provider.exists?.should be true\n    provider.value.should == '0.0.0.0'\n    provider.value=('0.0.0.0')\n\n    validate_file(<<-EOS\n         # This is a comment\n         \"test_key_1\" {\n             # This is also a comment\n             foo=foovalue\n             bar=barvalue\n             master=true\n         }\n        \"test_key_2\" {\n             foo=foovalue2\n             baz=bazvalue\n             url=\"http://192.168.0.1:8080\"\n             listen_address=0.0.0.0\n        }\n       \"test_key:3\" {\n             foo=bar\n       }\n      # another comment\n      # yet another comment\n      foo=bar\n      EOS\n      )\nend\n{code}\n", "epicLinkSummary": "HOCON and ruby-hocon improvements", "estimate": "PT0S", "externalId": "10292", "fixedVersions": [], "id": "10292", "issueType": "Bug", "key": "TK-128", "labels": [], "originalEstimate": "PT0S", "parent": "10452", "parentSummary": "HOCON and ruby-hocon improvements", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:808c35de-34a9-46bd-a472-c5ecf2deee86", "resolution": "Fixed", "resolutionDate": "2015-03-17T11:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "hocon-gem lacks float/double and ip address support", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "PR was merged.  Leaving in functional review for now since wasn't sure if there was more related work needing to be done, e.g., rename the github repo, (re)publish the module to the forge, ...", "created": "2014-12-23T09:44:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I just renamed the github repo to \"puppetlabs-hocon\". ", "created": "2015-01-05T15:46:00.000000"}, {"author": "557058:5f73e620-a5f5-44a8-a863-f1e0061b987a", "body": "Appears to be no fallout from the renaming. Closing.", "created": "2015-01-13T15:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-05T14:43:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@15c8a8f8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypc87:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Dec/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_9319430_*|*_10007_*:*_1_*:*_1290277073_*|*_3_*:*_1_*:*_237523926_*|*_10009_*:*_1_*:*_1833597586_*|*_5_*:*_1_*:*_0"}], "description": "Rename the puppetlabs-conffile module to puppetlabs-hocon, and rename the confsetting type to hoconsetting.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10213", "fixedVersions": [], "id": "10213", "issueType": "Improvement", "key": "TK-127", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-01-13T15:02:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Rename puppetlabs-conffile", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-12-02T11:51:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7814680d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypq5r:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_16495505_*|*_6_*:*_1_*:*_0"}], "description": "When follow-redirects is set to false in clj-http-client, the SSL Context is stripped out of the request. This is likely due to the getRedirect function returning nil on [this line|https://github.com/puppetlabs/clj-http-client/blob/master/src/clj/puppetlabs/http/client/async.clj#L286].", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10595", "fixedVersions": [], "id": "10595", "issueType": "Bug", "key": "TK-126", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Cannot Reproduce", "resolutionDate": "2014-12-02T16:26:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Setting follow-redirects to false in clj-http-client strips out SSL Context", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "[~accountid:557058:71582ab7-ed41-48f8-a53e-545356d7dee4] does this relate at all to the work you were doing around preventing session renegotiation? Do you have thoughts on this feature request?", "created": "2018-02-14T11:47:00.000000"}, {"author": "557058:71582ab7-ed41-48f8-a53e-545356d7dee4", "body": "Not exactly or directly as we wanted to prevent any rogue clients from abusing session renegotiation against any of our TK based services as it can cause a DoS on server side or can allow an MiTM attacker to have access to legit client's session using splicing if server's TLS impl does not implement rfc 5746 provisions.\n\nThe later concern seems applicable to our (Puppet) clients connecting to arbitrary/external services as indicated above but am not sure/clear if there are scenarios where Puppet Server initiates connections to servers outside of same deployment/environment that\u00a0may not have been secured adequately (report processor may be?).\u00a0 However the other possibility of accessing servers having different certificates sitting behind a load balancer seems\u00a0more plausible\u00a0where session reuse can cause functionality problems (than security concerns). And as described in -SERVER-207-, addressing it by allowing unsafe server certificate change is not desirable which then requires disabling session reuse on client side.\u00a0\n\nAll in all, providing with the ability to disable session reuse on client side should be useful.\u00a0\u00a0\n\n\u00a0", "created": "2018-02-14T18:39:00.000000"}, {"author": "557058:71582ab7-ed41-48f8-a53e-545356d7dee4", "body": "To add to above that I missed above, this does not look like a high enough security issue and there is another workaround for the cases where different servers using different certificates to have them use same certificate as was mentioned in SERVER-207. So I would not treat this as a must\u00a0have but desirable as far as prioritization wrt other things goes.\u00a0", "created": "2018-02-15T06:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-02T10:18:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3273da73"}, {"fieldName": "CS Business Value", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "4 - $$$$$"}, {"fieldName": "CS Frequency", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "1 - 1-5% of Customers"}, {"fieldName": "CS Impact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "CS Triage looked into this issue in relation to wanting to load balance PuppetDBs which requires a shared certificate across PDB instances. Sharing a cert across PDB is frustrating to setup and it would be nice to avoid\n\nHowever our intention for future large scale architectures is to co-locate PDB on each compile master which should reduce or remove the need for this. The triage scoring reflects this."}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Normal"}, {"fieldName": "CS Severity", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "3 - Serious"}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyxd3z:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Feb/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1148550933_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_61324111276_*|*_10005_*:*_1_*:*_38791816568"}], "description": "By default, any SSL handshake completed by an clj-http-client request where the server returns an SSL session id results in the client attempting to resume the SSL session for a request made on a new connection.  In some scenarios it may be desirable to not have the client try to resume SSL sessions, e.g., to protect the client from an SSL renegotation attack until a proper remediation path can be found or when multiple servers having different certificates are hidden behind a load balanced virtual ip address and session reuse is not desirable / practical. See SERVER-207 for some discussion on the issues session caching presents around load-balanced virtual ip addresses.\n\nIn order to disable session caching, a new \"allow session creation\" option could be exposed as a \"client option\" alongside the other SSL-related options. For compatibility, it would probably be best to allow SSL sessions to be created/resumed by default so that clients can take advantage of the performance benefits of renegotiation.\n\nI'm not sure of the best way to do this.  In async.clj, there is some code which sets up desired protocols and ciphers via an {{SSLIOSessionStrategy}}.  If clj-http-client were to derive a class from {{SSLIOSessionStrategy}} which provides an implementation for the protected {{initializeEngine}} method, {{setEnableSessionCreation}} could be called with {{true}} or {{false}}, as desired, on the {{SSLEngine}} parameter supplied to the method.  I haven't tried doing this yet, so not sure if this would actually work.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10373", "fixedVersions": [], "id": "10373", "issueType": "New Feature", "key": "TK-125", "labels": ["ssl"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Fix", "resolutionDate": "2018-02-16T11:19:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Provide option for disabling SSL session reuse in clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "attachments": [], "comments": [{"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] Does this need acceptance level testing?  Do you consider this a high risk feature change/add?", "created": "2016-03-31T12:45:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] Having an acceptance-level test for this seems like it would be a very good thing.  Ideally, it would be nice to have a more \"real-world\" kind of test that involved having a client make a request through a load-balancer that routes requests made to the same URI to different servers.  You might take a look at the comments on SERVER-216 with some discussion we had on how this might be done with Puppet Server talking to PuppetDB via HAProxy.  I'd definitely want to get a sense of how much effort we'd need to put into this to make it all work before getting too far into it.  I wouldn't want to see the infrastructure setup for that test taking multiple weeks away from other things we could be working on instead.\n\nNot sure if this is something that qualifiies as \"high risk\" per the way you assess these.  It involves changes in our SSL negotiation, though, and the current behavior has been problematic for some users - see discussion in SERVER-207.  So maybe?", "created": "2016-03-31T13:10:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Resolving this, we will track uptake of this for puppet-server in a SERVER ticket.", "created": "2016-04-06T15:07:00.000000"}, {"author": "557058:2249d8e6-5f8c-489f-942b-1c2739792d34", "body": "SERVER-1256 is the ticket in question.", "created": "2016-04-06T15:14:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5], [~accountid:623e7507866b810069e57527] - I did some adhoc testing of the changes from the PR locally.  It doesn't appear to me that the new feature actually does what we want.\n\nI tried setting {{cache-session-id}} both to {{true}} and to {{false}} for a webserver configuration.  In both cases, I used a persistent sync client (from the puppetlabs/http-client repo) and saw the following behavior:\n\n1) For the SSL negotiation on the first connection made before the first request, an SSL session id was returned from the server.\n\n2) For the SSL negotiation on the second connection made before the second request, the client provided the SSL session id returned from the first request.  The server roundtripped the same SSL session id and no client / server certificates were exchanged.  It appeared from this, then, that the SSL session was being resumed - rather than renegotiated - for the second request.\n\nI'm not exactly sure what additionally would need to be done in order to cause the SSL session id to not be reused across connections.  I also tried calling the {{setRenegotiationAllowed}} method on the {{SSLContext}} with a value of {{false}}.  In this case, however, the behavior was the same as above.\n\nI think this one will probably involve some more research into Jetty (and maybe the underlying JSSE integration) to figure out how to avoid SSL sessions being reused.  May make most sense at this point to reopen this ticket.  [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] - what do you think?", "created": "2016-04-13T10:58:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Agreed.  That sounds like something that could have been caught by a Clojure integration test.", "created": "2016-04-13T15:59:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "In some investigation, I discovered that it is impossible to disable session caching in the version of jetty we use (and beyond).\n\nI've opened https://github.com/eclipse/jetty.project/issues/519 for the ssl caching being permanently enabled. Unfortunately, I think that means this ticket will be blocked on that being fixed and released by jetty, and us moving onto a fixed version of jetty.", "created": "2016-04-18T15:50:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Agreed, it seems like this blocked until the Jetty bug gets fixed.\n\nThe immediate question we should answer is if we want to merge [this pull request|https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/142] to revert the code changes we merged which don't actually work as intended.", "created": "2016-04-18T17:08:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "{quote}The immediate question we should answer is if we want to merge this pull request to revert the code changes we merged which don't actually work as intended.{quote}\n\nI'd vote \"yes\".  If the Jetty team comes back and tells us we need to do it another way, the implementation we merged already wouldn't work anyway.  Seems better to have something merged / documented in a tk-jetty9 only when we have confirmation that it works.", "created": "2016-04-18T17:10:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "agreed", "created": "2016-04-18T17:13:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "The jetty ticket got closed with \"I cannot find a way to do this in JSSE, so unfortunately we cannot support it.\nClosing for now.\" so this either needs to be closed or not fixed in jetty.", "created": "2016-08-24T11:10:00.000000"}, {"author": "557058:97578a32-3955-4c5c-939e-58a878437b49", "body": "I was rooting around this and added a comment to the Jetty ticket. See https://github.com/eclipse/jetty.project/issues/519#issuecomment-305882931. I'm no JSSE guru so somebody else would need to validate my comment but it sounds to me like there may in fact be a way to achieve the desired goal in JSSE.", "created": "2017-06-02T13:08:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-12-02T10:06:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["jade"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@67551c44"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hynoxb:"}, {"fieldName": "Scope Change Category", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Adopted"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "31/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_84453067_*|*_1_*:*_1_*:*_1149275605_*|*_10007_*:*_1_*:*_97540942_*|*_3_*:*_3_*:*_707103918_*|*_4_*:*_1_*:*_155701422_*|*_5_*:*_1_*:*_607857562_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_57546630758_*|*_10006_*:*_2_*:*_1043853282_*|*_10005_*:*_1_*:*_39635464619"}], "description": "By default, any SSL handshake negotiated in Jetty by trapperkeeper-webservices-jetty9 results in Jetty caching the SSL session and returning an SSL session id to the client for the client to use in resuming the session on a later connection.  In some scenarios it may be desirable to not have the server cache SSL sessions, e.g., to protect the server from an SSL renegotation attack until a proper remediation path can be found or when multiple servers having different certificates are hidden behind a load balanced virtual ip address and session reuse is not desirable / practical.  See SERVER-207 for some discussion on the issues session caching presents around load-balanced virtual ip addresses.\n\nIn order to disable session caching, a new \"caching\" option could be exposed in the trapperkeeper-webservices-jetty9 configuration.  For compatibility, it would probably be best to allow SSL sessions to be cached by default so that clients can take advantage of the performance benefits of renegotiation.\n\nI believe the lower-level work in Jetty would just involve calling the {{setSessionCachingEnabled}} method on the {{SslContextFactory}} with a value of {{true}} or {{false}}, as desired.  The setup with the factory is done from {{ssl-context-factory}} in jetty9_core.clj.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10325", "fixedVersions": [], "id": "10325", "issueType": "New Feature", "key": "TK-124", "labels": ["ssl"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Fix", "resolutionDate": "2018-02-13T17:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Provide option for disabling TLS/SSL session caching in Jetty webserver", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Would you be able to share your project file?\n\nDo you have a custom service that is trying to define a 'get-config' function?  Does it have a protocol?  That's what the error sounds like to me, though I'm not sure how the reloaded workflow would be working for you in the REPL if that were the problem.", "created": "2014-12-01T14:04:00.000000"}, {"author": "623a46a7a95758006959fe31", "body": "I managed to cure the problem eventually by altering my main function to look something similar to the TK-provided main and just AOT compiling that.  I don't have any other service that defines a get-config function.\n\nThe difference is that in the repl my entry point into the app is not through main.\n\nI ran across another open ticket here suggesting publishing a wiki page regarding AOT.  This is sorely needed please!\n\nI would consider this closed.  Thanks for the quick response!", "created": "2014-12-02T22:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Ahhhh... AOT.  Yeah, we have historically had a lot of trouble with AOT (dating back to well before we started Trapperkeeper), so we generally try to avoid it, and I always forget about it when reading bug reports :)\n\nI'll bump that AOT wiki ticket up so that it surfaces at our next triage meeting.  Closing this one for now but please feel free to re-open if you have additional issues/questions.", "created": "2014-12-03T09:04:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-29T23:55:00.000000", "creator": "623a46a7a95758006959fe31", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@45efaccf"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyxc33:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "01/Dec/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_292125887_*|*_6_*:*_1_*:*_0"}], "description": "I am unable to get an uberjar built. I have my own main defined which calls TK's build-app. I have tried various flavors of AOT to see if the problem is resolved that way but to no avail.\n\nI am able to run my app from the repl using a reloaded workflow which calls build-app.\n\nAside, I've also tried setting up my application using puppetlabs.trapperkeeper.main per the wiki. I am able to uberjar, but I'm unable to call `java -jar my-uberjar.jar` because it does not find a main.\n\nAll that said, I do need to be able to do an uberjar build and call TK from my own main.\n\n---\n\nCompiling longitude.main\njava.lang.IllegalArgumentException: Service attempts to define function 'get-config', but does not provide protocol, compiling:(puppetlabs/trapperkeeper/config.clj:93:3)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6651)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6406)\n\tat clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782)\n\tat clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217)\n\tat clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.access$100(Compiler.java:38)\n\tat clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:538)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6406)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7221)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:619)\n\tat puppetlabs.trapperkeeper.bootstrap$loading__4958__auto__.invoke(bootstrap.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:703)\n\tat puppetlabs.trapperkeeper.core$loading__4958__auto__.invoke(core.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:619)\n\tat longitude.system$loading__4958__auto__.invoke(system.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat longitude.main$loading__4958__auto__.invoke(main.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$compile$fn__5071.invoke(core.clj:5652)\n\tat clojure.core$compile.invoke(core.clj:5651)\n\tat user$eval19$fn__26.invoke(form-init9068046988380725616.clj:1)\n\tat user$eval19.invoke(form-init9068046988380725616.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6703)\n\tat clojure.lang.Compiler.eval(Compiler.java:6693)\n\tat clojure.lang.Compiler.load(Compiler.java:7130)\n\tat clojure.lang.Compiler.loadFile(Compiler.java:7086)\n\tat clojure.main$load_script.invoke(main.clj:274)\n\tat clojure.main$init_opt.invoke(main.clj:279)\n\tat clojure.main$initialize.invoke(main.clj:307)\n\tat clojure.main$null_opt.invoke(main.clj:342)\n\tat clojure.main$main.doInvoke(main.clj:420)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat clojure.lang.Var.invoke(Var.java:383)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:156)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.main.main(main.java:37)\nCaused by: java.lang.IllegalArgumentException: Service attempts to define function 'get-config', but does not provide protocol\n\tat puppetlabs.trapperkeeper.services_internal$validate_provided_fns_BANG_.invoke(services_internal.clj:168)\n\tat puppetlabs.trapperkeeper.services_internal$build_fns_map_BANG_.invoke(services_internal.clj:313)\n\tat puppetlabs.trapperkeeper.services_internal$parse_service_forms_BANG_.invoke(services_internal.clj:372)\n\tat puppetlabs.trapperkeeper.services$service.doInvoke(services.clj:60)\n\tat clojure.lang.RestFn.invoke(RestFn.java:566)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:186)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.lang.Compiler.macroexpand1(Compiler.java:6552)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6630)\n\t... 133 more\nException in thread \"main\" java.lang.IllegalArgumentException: Service attempts to define function 'get-config', but does not provide protocol, compiling:(puppetlabs/trapperkeeper/config.clj:93:3)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6651)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6406)\n\tat clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782)\n\tat clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217)\n\tat clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.access$100(Compiler.java:38)\n\tat clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:538)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6445)\n\tat clojure.lang.Compiler.analyze(Compiler.java:6406)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7221)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:619)\n\tat puppetlabs.trapperkeeper.bootstrap$loading__4958__auto__.invoke(bootstrap.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:703)\n\tat puppetlabs.trapperkeeper.core$loading__4958__auto__.invoke(core.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:619)\n\tat longitude.system$loading__4958__auto__.invoke(system.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n\tat clojure.core$load_lib.doInvoke(core.clj:5485)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:142)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$load_libs.doInvoke(core.clj:5524)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat clojure.core$apply.invoke(core.clj:626)\n\tat clojure.core$require.doInvoke(core.clj:5607)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat longitude.main$loading__4958__auto__.invoke(main.clj:1)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:152)\n\tat clojure.lang.AFn.applyTo(AFn.java:144)\n\tat clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3553)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7226)\n\tat clojure.lang.Compiler.compile1(Compiler.java:7216)\n\tat clojure.lang.Compiler.compile(Compiler.java:7292)\n\tat clojure.lang.RT.compile(RT.java:398)\n\tat clojure.lang.RT.load(RT.java:438)\n\tat clojure.lang.RT.load(RT.java:411)\n\tat clojure.core$load$fn__5066.invoke(core.clj:5641)\n\tat clojure.core$load.doInvoke(core.clj:5640)\n\tat clojure.lang.RestFn.invoke(RestFn.java:408)\n\tat clojure.core$load_one.invoke(core.clj:5446)\n\tat clojure.core$compile$fn__5071.invoke(core.clj:5652)\n\tat clojure.core$compile.invoke(core.clj:5651)\n\tat user$eval19$fn__26.invoke(form-init9068046988380725616.clj:1)\n\tat user$eval19.invoke(form-init9068046988380725616.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6703)\n\tat clojure.lang.Compiler.eval(Compiler.java:6693)\n\tat clojure.lang.Compiler.load(Compiler.java:7130)\n\tat clojure.lang.Compiler.loadFile(Compiler.java:7086)\n\tat clojure.main$load_script.invoke(main.clj:274)\n\tat clojure.main$init_opt.invoke(main.clj:279)\n\tat clojure.main$initialize.invoke(main.clj:307)\n\tat clojure.main$null_opt.invoke(main.clj:342)\n\tat clojure.main$main.doInvoke(main.clj:420)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat clojure.lang.Var.invoke(Var.java:383)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:156)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.main.main(main.java:37)\nCaused by: java.lang.IllegalArgumentException: Service attempts to define function 'get-config', but does not provide protocol\n\tat puppetlabs.trapperkeeper.services_internal$validate_provided_fns_BANG_.invoke(services_internal.clj:168)\n\tat puppetlabs.trapperkeeper.services_internal$build_fns_map_BANG_.invoke(services_internal.clj:313)\n\tat puppetlabs.trapperkeeper.services_internal$parse_service_forms_BANG_.invoke(services_internal.clj:372)\n\tat puppetlabs.trapperkeeper.services$service.doInvoke(services.clj:60)\n\tat clojure.lang.RestFn.invoke(RestFn.java:566)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:186)\n\tat clojure.lang.Var.applyTo(Var.java:700)\n\tat clojure.lang.Compiler.macroexpand1(Compiler.java:6552)\n\tat clojure.lang.Compiler.analyzeSeq(Compiler.java:6630)\n\t... 133 more\nCompilation failed: Subprocess failed", "environment": "OS X 10.9, Java Hotspot 1.7", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10662", "fixedVersions": [], "id": "10662", "issueType": "Bug", "key": "TK-123", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623a46a7a95758006959fe31", "resolution": "Fixed", "resolutionDate": "2014-12-03T09:04:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Cannot build uberjar", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-26T14:17:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@453a15ff"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyncx3:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_543409688_*|*_3_*:*_1_*:*_19939475691_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_39918724665_*|*_10005_*:*_1_*:*_41128930692"}], "description": "The work in TK-121 provides the ability to create an SSLContext which considers CRLs.  clj-http-client could use this functionality to expose a way for clients to specify CRLs to be utilized for SSL requests.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10212", "fixedVersions": [], "id": "10212", "issueType": "New Feature", "key": "TK-122", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-13T17:12:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add ability to configure CRL for SSL requests to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-25T18:17:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1e355955"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypdm7:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1122057919_*|*_1_*:*_1_*:*_45318_*|*_10007_*:*_1_*:*_1819121106_*|*_3_*:*_1_*:*_60108425_*|*_5_*:*_1_*:*_0"}], "description": "The {{CertificateAuthority.pemsToSSLContext}} Java method and {{pems->ssl-context}} function could be enhanced to include CRLs in the creation of the context.  This would allow CRLs to be used by the context as needed, e.g., when an HTTP client is using the context to create a connection.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10448", "fixedVersions": ["JVM-CA 0.6.1"], "id": "10448", "issueType": "New Feature", "key": "TK-121", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2014-12-30T11:59:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add CRL to SSLContext Creation", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-20T14:34:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@567e8cc5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywupj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_6347_*|*_1_*:*_1_*:*_1205217_*|*_10007_*:*_1_*:*_81880199_*|*_3_*:*_1_*:*_3179_*|*_5_*:*_1_*:*_0"}], "description": "The tests in the {{graceful-shutdown-test}} test block occasionally fail because the connection for the web request hasn't been fully established before server shutdown is initiated.  Some synchronization could be done in the tests to ensure that the servlet handler has at least been invoked before server shutdown is initiated.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10374", "fixedVersions": [], "id": "10374", "issueType": "Improvement", "key": "TK-119", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-11-21T13:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Replace one sleep in the graceful shutdown tk-jetty9 graceful shutdown tests", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Functional review of this looks like it should be covered by [~accountid:70121:199f31c7-67c7-42b0-b148-18ad3a391ab0]'s review of SERVER-141.", "created": "2014-12-15T13:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-19T16:09:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@192a60fc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypgc7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "15/Dec/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_416873768_*|*_1_*:*_1_*:*_173022_*|*_10007_*:*_1_*:*_16420768_*|*_3_*:*_1_*:*_69738553_*|*_10009_*:*_1_*:*_1731941968_*|*_5_*:*_1_*:*_0"}], "description": "When the --debug flag in Trapperkeeper is set, TK should log to the console and raise the logging level to debug. As it stands now, however, the flag successfully raises the logging level, but it fails to log to the console unless the TK project is configured to do so normally in the logback.xml file.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10211", "fixedVersions": ["TK 1.0.1"], "id": "10211", "issueType": "Bug", "key": "TK-118", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-12-15T13:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Trapperkeeper does not log to the console when the --debug flag is set", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-13T17:37:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3027baa1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypdnb:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_346402301_*|*_10007_*:*_1_*:*_1816810366_*|*_3_*:*_1_*:*_74410461_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_2412811785"}], "description": "The clj-http-client library has some documentation for the supported client and request options embedded in code.  To make this a little easier to consume, though, and to avoid repeating documentation for the options across all of the discrete request function calls, it might be better to cover this in a consolidated markdown doc.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10371", "fixedVersions": ["HTTP-CLIENT 0.4.1"], "id": "10371", "issueType": "Improvement", "key": "TK-117", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2015-01-06T13:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add some external API docs for clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-11T10:31:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4d3666e3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypq53:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_542238144_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_163023528"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10290", "fixedVersions": [], "id": "10290", "issueType": "Task", "key": "TK-116", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2014-11-19T14:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK and TK-J9 1.0 releases", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "There are a few questions on Stack sites that might help:\n\nhttp://serverfault.com/questions/112795/how-can-i-run-a-server-on-linux-on-port-80-as-a-normal-user\nhttp://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-1024-on-l#414258\n", "created": "2014-11-07T04:50:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "Another consideration that came off a conversation with [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]:\n\nWe're using Apache (or maybe nginx) for reverse proxying and SSL termination. We could use haproxy to do TCP-layer proxying, which might be a better option.\n", "created": "2014-11-07T04:53:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "I'd summarize our options as:\n# Run as root then drop privileges as quick as possible (Kevin's code snippet)\n# authbind (not always available but a good soln if it is)\n# sudo setcap (works well provided you don't need to use LD_LIBRARY_PATH)\n# iptables\n# Apache/nginx to SSL terminate and reverse proxy\n# haproxy to reverse proxy at the TCP layer", "created": "2014-11-07T05:00:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "FWIW, when this originally came up, I discussed it with [~accountid:63d40635a05386069cdb69d6], [~accountid:557058:e484fb55-2ddc-43a0-968e-11d70ae3153c], [~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] and a few others, and it sounded like the general consensus from their end was probably going to be to go with one of the nginx/haproxy options.\n\nProbably no great reason to prioritize this, though, until the work to get rid of passenger is completed.", "created": "2014-11-07T08:01:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-06T15:54:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@30ed8a33"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyx3fj:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "07/Nov/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_956756245_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_230489061740"}], "description": "One option is to simply run the java process as root, let it bind to 443, and then change the owner of the process to be a non-root user.  I've hacked together an example of that here: https://github.com/KevinCorcoran/setuid-jetty-test\n\nThe underlying madness is this lil' gem:\n{code}\nimport com.sun.jna.Native;\n\npublic class LibC {\n\n    static {\n       Native.register(\"c\");\n    }\n\n    public static native int setuid(int uid);\n\n}\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10653", "fixedVersions": [], "id": "10653", "issueType": "Improvement", "key": "TK-115", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "options for exposing TK apps on port 443", "timeSpent": "PT0S", "updated": "2022-03-08T10:24:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:63d4062f69c7ae3958d276ed] [~accountid:557058:808c35de-34a9-46bd-a472-c5ecf2deee86] [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] [~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] [~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] [~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd] ping!  I've had conversations with most of you on and off about this behavior, so just wanted to let you know I finally got around to capturing it in a ticket for visibility.", "created": "2014-11-05T15:56:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-05T15:55:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4ab64a29"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyx2zb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Mar/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1042649561_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_230487538157"}], "description": "A while back, we had some weird bug reports come in that turned out to be an artifact of the fact that, when using a conf.d-style directory containing multiple config files, it was possible to define the same setting in two different files, and the last one would win.  Users were trying to change the setting in one file and were confused why their changes weren't being respected.\n\nWe introduced some error-checking so that we'd detect this kind of conflict and raise an error.\n\nHowever, we seem to have only caught the case where a *setting* was defined in multiple files, and we actually still tolerate a *section* being defined in multiple files as it stands today.\n\nI consider this a bug as I believe it could cause the same sort of confusion for users, so we should add checks for this and fail fast in this kind of situation as well.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10652", "fixedVersions": [], "id": "10652", "issueType": "Bug", "key": "TK-114", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "config service should throw an error if a section is defined in multiple files", "timeSpent": "PT0S", "updated": "2022-03-08T09:51:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "5ac3e8393f5ae0700bed9c63", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Just so there's a bread crumb trail:  we chatted about this offline, and I think we're all in agreement that an error should still be raised if we find a single setting defined in two different files, so there won't really be any \"precedence\" between the files passed to the -c argument.", "created": "2014-11-05T15:58:00.000000"}, {"author": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] sorry, didn't see your comment. Just edited the ticket to reflect that.", "created": "2014-11-05T16:37:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "cool, thanks!", "created": "2014-11-05T16:40:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-05T14:57:00.000000", "creator": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d1ee7e0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyx2xj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "05/Nov/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_587577606_*|*_5_*:*_1_*:*_0"}], "description": "Trapperkeeper should be able to accept a comma separated list of config files/directories, to allow for additional configs to be merged with that provided by the user.\n\nFor example,\n\nlein run services -c postgres.ini,secret-config.ini\n\nConflicts between the two configs will be handled the same way they currently are between conflicting files in a single directory.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10372", "fixedVersions": [], "id": "10372", "issueType": "New Feature", "key": "TK-113", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:22d0f8be-5a48-45ef-8078-6e91e5c34720", "resolution": "Fixed", "resolutionDate": "2014-11-12T10:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "allow for multiple config files separated by comma", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] just a heads up that I am creating a few tickets for this, in case you're interested in watching them.", "created": "2014-11-05T09:59:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] I don't suppose this is something that you've already been tackling in your PuppetDB ezbake work?", "created": "2014-11-05T09:59:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "I've been using the following as {{puppetserver/cli/apps/foreground}}:\n\n{code}\n#!/usr/bin/env bash\n\n${JAVA_BIN} -cp \"${INSTALL_DIR}/puppet-server-release.jar\" \\\n    clojure.main -m puppetlabs.trapperkeeper.main \\\n    --debug --config ${CONFIG} --bootstrap-config ${BOOTSTRAP_CONFIG} \\\n    -- \"$@\"\n{code}\n\nHowever, in the case of puppetserver, the {{--debug}} flag does not seem to trigger the addition of a console logger set to DEBUG level. Logging appears to be entirely controlled by {{logback.xml}}.\n\n[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14]: Any suggestions on how the above might be improved?", "created": "2014-11-05T15:50:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Hmmm... no, I would expect trapperkeeper itself to pick up that debug flag and add the extra logging.  Will look into it ASAP.", "created": "2014-11-05T16:39:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "I've noticed that the {{--debug}} flag does appear to bump the log level to debug for file output defined in {{logback.xml}}. What appears to be missing is the creation of a console output.", "created": "2014-11-07T17:05:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] [~accountid:557058:aa277a93-6688-4f34-ad9d-e53477acf74b] I've confirmed that trapperkeeper does not log to the console when the --debug flag is set, even though it has code to set that up. I'm going to create a new ticket for that issue.", "created": "2014-11-19T16:04:00.000000"}, {"author": "623c12b6ee1b5a0070293582", "body": "[~accountid:557058:1fdc76f4-b360-4f3a-a4b5-990542a56609] You might be interested in this based on our conversation about running puppet-server in the foreground to get access to a pry debugger session.", "created": "2014-12-12T17:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-05T09:58:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1e89d689"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypgb3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "05/Nov/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_586190826_*|*_1_*:*_1_*:*_1063916565_*|*_10007_*:*_1_*:*_1553216226_*|*_3_*:*_1_*:*_175891130_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_80927233"}], "description": "The existing PuppetDB packages include a 'foreground' subcommand, which can be used to launch PuppetDB in the foreground with an elevated logging level.\n\nThis would be a very useful feature for all TK-based apps, and seems like something we could build directly in to ezbake.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10414", "fixedVersions": [], "id": "10414", "issueType": "New Feature", "key": "TK-112", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-12-15T11:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add built-in 'foreground' subcommand to packaging", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-11-04T17:30:00.000000", "creator": "623a4ac7a1d81f0069d81194", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1a5be068"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyx1zr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1122956206_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_228961121654"}], "description": "When there is a problem with the inifile, the error is fairly ugly:\n\n<pre>\n2013-02-18 12:19:15,474 ERROR [puppetlabs.utils] Uncaught exception\norg.ini4j.InvalidFileFormatException: parse error (at line: 6): host 0.0.0.0\n        at org.ini4j.spi.AbstractParser.parseError(AbstractParser.java:53)\n        at org.ini4j.spi.AbstractParser.parseOptionLine(AbstractParser.java:85)\n        at org.ini4j.spi.IniParser.parse(IniParser.java:101)\n        at org.ini4j.spi.IniParser.parse(IniParser.java:62)\n        at org.ini4j.Ini.load(Ini.java:109)\n        at org.ini4j.Ini.<init>(Ini.java:50)\n        at com.puppetlabs.utils$ini_to_map.invoke(utils.clj:238)\n        at clojure.core$map$fn__4087.invoke(core.clj:2434)\n        at clojure.lang.LazySeq.sval(LazySeq.java:42)\n        at clojure.lang.LazySeq.seq(LazySeq.java:60)\n        at clojure.lang.Cons.next(Cons.java:39)\n        at clojure.lang.RT.next(RT.java:587)\n        at clojure.core$next.invoke(core.clj:64)\n        at clojure.core$reduce1.invoke(core.clj:880)\n        at clojure.core$reduce1.invoke(core.clj:871)\n        at clojure.core$merge.doInvoke(core.clj:2631)\n        at clojure.lang.RestFn.applyTo(RestFn.java:137)\n        at clojure.core$apply.invoke(core.clj:601)\n        at com.puppetlabs.utils$inis_to_map.invoke(utils.clj:265)\n        at com.puppetlabs.utils$inis_to_map.invoke(utils.clj:256)\n        at com.puppetlabs.puppetdb.cli.services$parse_config_BANG_.invoke(services.clj:293)\n        at com.puppetlabs.puppetdb.cli.services$_main.doInvoke(services.clj:311)\n        at clojure.lang.RestFn.invoke(RestFn.java:421)\n        at clojure.lang.Var.invoke(Var.java:419)\n        at clojure.lang.AFn.applyToHelper(AFn.java:163)\n        at clojure.lang.Var.applyTo(Var.java:532)\n        at clojure.core$apply.invoke(core.clj:601)\n        at com.puppetlabs.puppetdb.core$_main.doInvoke(core.clj:79)\n        at clojure.lang.RestFn.applyTo(RestFn.java:137)\n        at com.puppetlabs.puppetdb.core.main(Unknown Source)\n</pre>", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10370", "fixedVersions": [], "id": "10370", "issueType": "Improvement", "key": "TK-111", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623a4ac7a1d81f0069d81194", "resolution": "Won't Fix", "resolutionDate": "2022-02-18T17:45:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ini parse errors return a non-obvious error", "timeSpent": "PT0S", "updated": "2022-02-18T17:45:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12] FYI we just did our sprint planning this morning, so, as things currently stand, this would likely come into the following sprint for us.  That said, if it's urgent and blocking things, we'll bring it in to the current sprint, so let us know!", "created": "2014-11-04T16:54:00.000000"}, {"author": "557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] That timing sounds fine to me - thanks!", "created": "2014-11-04T17:23:00.000000"}, {"author": "557058:362bc1c3-742f-4428-a556-fa2b03887e0f", "body": "Just a note, I'm not aware of the sprint scheduling, but I'd like to get PE-6601 fixed for PE 3.7.1, if possible.", "created": "2014-11-13T14:51:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:362bc1c3-742f-4428-a556-fa2b03887e0f] next sprint starts on wednesday of next week, we should be able to pull it in for that one.", "created": "2014-11-13T15:33:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Looks like the associated ticket, PE-6601, was bumped out to PE.Next yesterday.  Does that mean we won't need this for PE 3.7.1?  And maybe that having this done in the SERVER 1.0.0 \"timeframe\" isn't critical?  To my knowledge, we don't have a direct need for this in Puppet Server anyway, so SERVER 1.0.0 might have been the wrong version to tag for this anyway.  [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] and [~accountid:557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4], what do you think?", "created": "2014-11-19T10:00:00.000000"}, {"author": "557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] I agree with moving it out of scope for PE 3.7.1.  I believe it would be good to get into Puppet Server \"soon\", but don't have a preference for which version.  This should be something we are able to deliver in the Q1 PE release.", "created": "2014-11-19T10:18:00.000000"}, {"author": "557058:362bc1c3-742f-4428-a556-fa2b03887e0f", "body": "Checking with sales engineering. I would hate for folks in the field to say \"oh yeah, we scale\" and then have this bite them in the rollout.", "created": "2014-11-19T10:22:00.000000"}, {"author": "557058:0a7f5dde-2148-4d2c-8224-6d6f86ebc9c4", "body": "[~accountid:557058:362bc1c3-742f-4428-a556-fa2b03887e0f] - we will also need confirmation from [~accountid:557058:1d244b27-1afc-481c-a463-e4c0cefad02f] and [~accountid:623e7ac51c7f6a00704b2aab] that we have the testing bandwidth for this issue, if you want to include it in PE 3.7.1", "created": "2014-11-19T10:26:00.000000"}, {"author": "557058:1d244b27-1afc-481c-a463-e4c0cefad02f", "body": "QA reviewed and suggest it for PE.Next. No PE 3.7.1 please.", "created": "2014-11-19T14:32:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I could have sworn that when [~accountid:557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12] and others initially raised this, it had been deemed a blocker for PE 3.7.1...", "created": "2014-11-19T14:39:00.000000"}, {"author": "557058:362bc1c3-742f-4428-a556-fa2b03887e0f", "body": "I would prefer to get this fixed in 3.7.1 but after gathering opinions in #SolutionsEngineers in HipChat, it doesn't sound like they concur.", "created": "2014-11-19T14:45:00.000000"}, {"author": "557058:1d244b27-1afc-481c-a463-e4c0cefad02f", "body": "I took my previous comment back. Based on Doug's latest update, let's leave it for PE.Next.", "created": "2014-11-19T14:56:00.000000"}, {"author": "557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12", "body": "To be clear, the lack of this setting being configurable in 3.7.0 is a regression and it's my understanding that many customers have a desire to be able to change this value.", "created": "2014-11-19T15:22:00.000000"}, {"author": "557058:1d244b27-1afc-481c-a463-e4c0cefad02f", "body": "QA reviewed with Aaron, Kevin, Jeremy, and Erik, let's get it in PE 3.7.1.", "created": "2014-11-20T14:13:00.000000"}, {"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "+1", "created": "2014-11-20T15:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-11-04T15:59:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@32a40b25"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyphbj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Nov/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_4297505_*|*_1_*:*_1_*:*_1125462681_*|*_10007_*:*_1_*:*_173665101_*|*_3_*:*_1_*:*_157000622_*|*_5_*:*_1_*:*_0"}], "description": "Add a new option which can be specified when calling {{add-proxy-route}} that configures the 'idle timeout' setting on the {{ProxyServlet}} instance.\n\nh4. Implementation notes:\n\nImplement this by calling {{setIdleTimeout}} on the instance of {{HttpClient}} constructed in {{proxy-servlet}}.  This will need to happen in the implementation of {{createHttpClient}}, and after the call to {{(proxy-super createHttpClient)}}, as the implementation in the superclass always calls {{.setIdleTimeout}} on the {{HttpClient}}, using either a servlet init param (which doesn't exist in our use-case) or the default value of 30 seconds.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10339", "fixedVersions": ["TK-JETTY9 1.0.1"], "id": "10339", "issueType": "Improvement", "key": "TK-110", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2014-11-21T13:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add configuration for jetty ProxyServlet's 'idle timeout' ", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm not a huge fan of this idea because of the divergent code paths that it would introduce.  That said, if we ever reach a point where we're in hard-core optimization mode, and we've already done SERVER-116, and the http client is actually proving to be a bottleneck, then we could look into this... but I'd be pretty surprised if we reach that point since there are so many other parts of our systems that are so much more expensive than the mechanics of the underlying HTTP requests.", "created": "2014-10-28T09:54:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I definitely understand the concerns about the divergent code paths that this would entail.  I agree it would be best to do TK-108 and SERVER-116 before considering this.  Only threw this one in as something to consider if other performance options have been already been exhausted, as you suggested.", "created": "2014-10-28T10:25:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "Hasn't been a priority so far so we're gonna close this out.", "created": "2018-02-20T16:58:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-28T09:43:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7fc7bc0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywx67:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_551232409_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_104108867939"}], "description": "The {{clj-http-client}} library currently layers both the Sync and Async request APIs on top of the HttpAsyncClient API in Apache.  I believe the Sync API would be more performant if it were layered on top of the synchronous HttpClient API in Apache.  For example, I've seen comments in the Apache project documentation and elsewhere like this (from http://hc.apache.org/):\n\n{quote}\nAsynch HttpClient is a HTTP/1.1 compliant HTTP agent implementation based on HttpCore NIO and HttpClient components. It is a complementary module to Apache HttpClient intended for special cases where ability to handle a great number of concurrent connections is more important than performance in terms of a raw data throughput.\n{quote}\n\nIf performance becomes a significant bottleneck, it could be worth researching into having the Sync Clojure and Java APIs in {{clj-http-client}} use the synchronous HttpClient API in Apache.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10651", "fixedVersions": [], "id": "10651", "issueType": "Improvement", "key": "TK-109", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-20T16:58:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider layering Sync http client APIs on synchronous Apache HttpClient", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-28T09:23:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@49e18871"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypjgn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_176379667_*|*_1_*:*_1_*:*_552082438_*|*_10007_*:*_1_*:*_427522847_*|*_3_*:*_1_*:*_104693284_*|*_10009_*:*_1_*:*_8333_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_237528899"}], "description": "The clj-http-client library provides an API in Clojure which allows a wrapped {{CloseableHttpAsyncClient}} to be created and returned and methods for making individual requests on that client instance -- {{create-client}} in {{async.clj}}:\n\nhttps://github.com/puppetlabs/clj-http-client/blob/master/src/clj/puppetlabs/http/client/async.clj#L401-421\n\nA similar API should be created at the Java layer so that Java API clients would have the option to reuse the same client for multiple requests.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10502", "fixedVersions": ["HTTP-CLIENT 0.4.0"], "id": "10502", "issueType": "Improvement", "key": "TK-108", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-11-14T16:33:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add Java-layer request-with-client capability to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "Gonna close this, Steve if you still have a use case and think this is important, feel free to reopen.", "created": "2022-02-18T17:44:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-24T13:58:00.000000", "creator": "557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@155fc6e9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyww6v:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Feb/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_880876225_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_230169867322"}], "description": "Would be nice if there was an easy way to add mime-types for assets being served.\n\nFor web fonts for instance:\n\n{code}\n.eot   application/vnd.ms-fontobject\n.otf   application/font-sfnt\n.svg   image/svg+xml\n.ttf   application/font-sfnt\n.woff  application/font-woff\n{code}\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10288", "fixedVersions": [], "id": "10288", "issueType": "Improvement", "key": "TK-107", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:8db25e7a-4bdb-4fe2-af6b-f0a9bc714e12", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:44:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add mime-type configuration options", "timeSpent": "PT0S", "updated": "2022-02-18T17:44:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I thought that this should already be working as desired ... (TK catches SIGTERM, shuts down services, and exits with 0) ... apparently it's still exiting with 143?  Weird.", "created": "2014-10-22T10:55:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-21T18:28:00.000000", "creator": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@d0a3d11"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywvt3:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1122797412_*|*_6_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_231700511085"}], "description": "For the purposes of systemd, it considers 143, which is what java exits with by default when handed a TERM signal, to be a failure in stopping a service. Trapperkeeper should probably catch and handle that signal by gracefully stopping all services and exiting with 0. There is a workaround in place for ezbake, but fixing this at the trapperkeeper level would be ideal.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10587", "fixedVersions": [], "id": "10587", "issueType": "Task", "key": "TK-106", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add signal handling to trapperkeeper (TERM at least)", "timeSpent": "PT0S", "updated": "2022-03-08T10:37:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] this is the ticket that I mentioned in standup this morning.  Lower priority than all the stuff on the PE3.7 board but pretty high priority after that.", "created": "2014-10-22T12:10:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] when you are ready to work on this ping me and I can add more details about what I think the fix should be.  I want to confirm my proposal with some folks from the Puppet Core team first though.", "created": "2014-10-22T15:31:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] what we're going to want to do on this is to create a puppet 'feature', and use it to guard the 'require' statement.  I will find you some examples of how we use this for, e.g., windows.", "created": "2014-10-22T16:45:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] what we're going to want to do on this is to create a puppet 'feature', and use it to guard the 'require' statement.  I will find you some examples of how we use this for, e.g., windows.", "created": "2014-10-22T16:48:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Here's an example of what I am talking about:\n\nhttps://github.com/puppetlabs/puppet/blob/master/lib/puppet/provider/file/windows.rb#L9\n\nThe goal here should be that, if you have a clean install of puppetserver, you've installed the hocon gem on the MRI ruby, but NOT on the puppetserver ruby, and you are still able to use the module in a catalog as part of an agent run.  Guarding the 'require' statement in an 'if' block based on the 'feature' will prevent the server from trying to load the gem, which it really doesn't need to have available.", "created": "2014-10-22T16:59:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Thanks! I'll get to work on this.", "created": "2014-10-22T17:06:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] did you push a new version to the forge that has this fix in it?", "created": "2014-10-31T06:37:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Yup, version 0.1.1 should have this fix in it.", "created": "2014-10-31T10:35:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-21T16:28:00.000000", "creator": "557058:ddaa4b87-3b61-49bb-98f9-56fd02cdbb6b", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2d27d46e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypngv:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "22/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_558514741_*|*_1_*:*_1_*:*_82015104_*|*_10007_*:*_1_*:*_90969248_*|*_3_*:*_2_*:*_92209748_*|*_5_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_15236935_*|*_10006_*:*_1_*:*_4822299"}], "description": "The https://github.com/puppetlabs/puppetlabs-conffile provider is used to manage the new Hocon style configuration files. This depends on Chris' {{hocon}} gem. Unfortunately, this has to be installed into jruby or compilation fails with this error:\n\n{quote}\nError: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not autoload puppet/type/conf_setting: Could not autoload puppet/provider/conf_setting/ruby: no such file to load -- hocon/config_factory on node master.puppetlabs.vm\n{quote}\n\nThe problem is that if we use the {{pe_puppetserver_gem}} provider to install the gem, we cannot *also* use the {{pe_gem}} provider to install it so the agent can use it to actually enforce configuration changes.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10324", "fixedVersions": [], "id": "10324", "issueType": "Bug", "key": "TK-105", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:ddaa4b87-3b61-49bb-98f9-56fd02cdbb6b", "resolution": "Fixed", "resolutionDate": "2014-10-31T10:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "puppetlabs-conffile fails catalog compilation if hocon isn't installed into jruby", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Actually, I think we should do this one *before* TK-103, as my preferred solution for TK-103 probably relies on a good understanding of the behavior of the streams.", "created": "2014-10-21T08:49:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I'm convinced from having looked at the Apache Http libraries that puppetlabs/clj-http-client is layered on top of that the \"response stream\" made available to a client will not be closed when a close call is made on the {{CloseableHttpAsyncClient}} -- at least for the way clj-http-client is currently implemented.\n\nBoth the Clojure and Java clj-http-client request APIs use a form of the {{execute}} method on the {{CloseableHttpAsyncClient}} API which does not provide an {{HttpAsyncResponseConsumer<T>}}.  This results in a {{BasicAsyncResponseConsumer}} being created to manage the asynchronous receipt of i/o for a request:\n\nhttps://github.com/apache/httpasyncclient/blob/conn-mgmt-redesign/httpasyncclient/src/main/java/org/apache/http/nio/client/methods/HttpAsyncMethods.java#L208\n\nThe use of an {{BasicAsyncResponseConsumer}}, in conjunction with some other Apache classes like {{LengthDelimitedDecoder}}, ensures that the entire response is read back from a {{SocketChannel}} for a request and copied into an in-memory {{HeapByteBuffer}}.  A {{ContentInputStream}} is wrapped around the {{HeapByteBuffer}}.  This is the {{InputStream}} which is ultimately made available for clients of the Clojure and Java clj-http-client request APIs.\n\nWhen {{close}} is called on the {{CloseableHttpAsyncClient}}, a {{close}} call is made on any SocketChannels that were opened by the client.  As users of the Clojure and Java clj-http-client request APIs are only given access to the {{InputStream}} whose contents were copied from the {{SocketChannel}} rather than the {{SocketChannel}} itself, however, the closing of the SocketChannels does not affect the clj-http-client request APIs.\n\nI've seen that even without any code in place which calls {{close}} on the {{ContentInputStream}} for the response, no file descriptors are leaked.  For good form it may be good for a client to make a {{close}} call this stream when finished consuming -- including the clj-http-client library code itself when coercing the stream response into a {{String}} and not returning the stream to the caller.\n \n--- \n\nThe in-memory copy of the response data imposes performance and memory limitations which could be overcome by using a different form of the {{execute}} method on {{CloseableHttpAsyncClient}} to perform the request, one which accepts an {{HttpAsyncResponseConsumer<T>}} as an argument.  See the following example of how this could be used:\n\nhttps://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/examples/org/apache/http/examples/nio/client/AsyncClientHttpExchangeStreaming.java\n\nIf this were exposed through the client API (e.g., as a callback), the client would have the ability to get the data from the {{SocketChannel}} without an intermediate buffering in memory.  A close method call made on the {{CloseableHttpAsyncClient}} while streaming is still in process during a response would likely tear down the {{SocketChannel}} before the client would have a chance to consume the response completely, although it is likely an implementation would just forego making such a call until the stream were to have been fully consumed, e.g., a response for the full expected length per the Http {{Content-Length}} header were received.", "created": "2014-10-27T16:00:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-20T16:10:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7f73e21b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywtcf:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6936503_*|*_3_*:*_1_*:*_273213013_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_324156365"}], "description": "Pending the outcome of work done for TK-103, we should reassess how the response streams for HTTP client requests should be closed out - to avoid leaks.\n\nI believe that closing the {{CloseableHttpAsyncClient}} that the response stream came from may close the response stream itself, even if the response stream is never explicitly closed by the client.\n\nFor example, the {{JavaClient.request}} implementation will coerce the response body stream into a String, if requested.  The implementation does not return the stream to the caller, though, and does not appear to explicitly call close on the stream object, only on the {{CloseableHttpAsyncClient}} itself.  I don't see any evidence of a file descriptor leak when this code is exercised but I have seen code in the {{CloseableHttpAsyncClient}} close that appears to close out response streams, although I haven't traced the code down far enough to know for sure that the latter is accurate.\n\nIf the outcome of TK-103 involves moving to an implementation that avoids making close calls on the {{CloseableHttpAsyncClient}} for requests that don't require the caller to manage the client instances directly, clients may need to do more work to ensure that response streams are specifically closed out.  Also, it may make sense for any cases in which the stream is never returned to the caller, e.g., for stream to string coercion, for the {{JavaClient}} class to do its own closing of the response stream when finished consuming.\n\nThis ticket may result in a combination of code changes as well as documentation around best practices for clients to avoid creating any resource leaks.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10287", "fixedVersions": [], "id": "10287", "issueType": "Improvement", "key": "TK-104", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Done", "resolutionDate": "2014-10-27T16:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate response stream closing behavior in clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "See TK-104 for more info on response {{InputStream}} behavior that informs the possible implementation path for this ticket...\n\nHere is one possible implementation path which would keep the current APIs fairly close to their current definition but provide a more elegant solution to the file descriptor leak problem first found and addressed for TK-101...\n\n1) Eliminate the {{AsyncClose}} class and related work from TK-101.  Also eliminate the passing around of the {{CloseableHttpAsyncClient}} objects through the {{FutureCallback}} passed into the client {{execute}} method call for a request -- both from the Clojure and Java API perspective.\n\n2) Augment the {{Promise<Response>}} class with a mechanism for passing a {{CloseableHttpAsyncClient}} into the constructor and add code to the implementation of the class' {{deref}} method to call {{close}} on the {{CloseableHttpAsyncClient}} after the call to {{await}} and before the response value is returned.\n\nTo allow the {{Promise<T>}} class to remain more generic for future purposes, the custom functionality could be implemented in a new concrete class which implements {{Promise<Response>}}. \n\nThis approach would allow for the Java-level async and sync APIs to have {{close}} called on the {{CloseableHttpAsyncClient}} outside of the thread context of an Apache i/o reactor thread.  The {{deref}} call is presumably made by the API user from the same thread on which the request was initiated.\n\n3) Change the {{request}} and {{request-with-client}} Clojure APIs in sync.clj to return a composite object which has both the {{CloseableHttpAsyncClient}} instance on which the request is initiated and the promise which the {{future-callback}} delivers when the request has completed.\n\n4) Create a {{get-response}} function in async.clj which takes in the composite object returned by the Clojure {{request}} function, does a wait on the object\u2019s embedded promise to be delivered, does a close on the object\u2019s embedded {{CloseableHttpAsyncClient}}, and returns a response object as delivered back to the request.\n\n\u2014\n\nOne feature that the above changes would not account for is the ability for a client to create a request via the Async API but forego waiting for a response but not leak resources (i.e., still having {{close}} called on a {{CloseableHttpAsyncClient}} to prevent such leakage).  To continue to support this use case, the above work could be augmented with {{cancel-request}} functions on the Clojure and Java APIs which would take in the object returned from the corresponding {{request}} functions and, at a minimum, call close on the {{CloseableHttpAsyncClient}}.  Even better, however, would be for these functions to invoke {{cancel}} on the {{Future}} returned from the request {{execute}} call.  This would allow for a client to force an in-progress request to be cancelled, which is not possible with the current clj-http-client APIs.\n\nIt may also be worth trying to unify the response object from the {{request}} call from the Java and Clojure Async APIs such that a fair amount of the code can be reused across implementations.", "created": "2014-10-27T17:39:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I've been thinking about this a bit more, and am actually now wondering if it might make sense to simply remove the \"simple\" async API entirely.\n\nIn other words, if you just want to do a one-off get/post/put without having to manage a client connection object, the odds are very, very high that you want a synchronous response anyway.  I'm almost positive that none of our apps are using the \"simple\" async API yet.  This would forego the entire issue about how to handle the 'close' calls for async requests.\n\nKeeping the surface area of this library as small as humanly possible seems like a big win to me.", "created": "2014-10-28T09:49:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "bq. I've been thinking about this a bit more, and am actually now wondering if it might make sense to simply remove the \"simple\" async API entirely.\n\nI'd be good with that, assuming there aren't any users we would negatively affect.  Your reasoning about it being an unlikely use case seems sound to me.\n\nEven if we do that, I still think that turning the simple \"promise\" return object from the request into more capable \"control\" object that could expose the full capabilities of the Java {{Future<T>}} returned from the client request, notably with the additional ability to do a \"cancel\", could be a nice addition.  That work could certainly be done separately from the work to properly close client objects, though, which was the point of this ticket.", "created": "2014-10-28T10:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-20T15:59:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@51e05015"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypjbz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_96241423_*|*_1_*:*_1_*:*_7626001_*|*_10007_*:*_2_*:*_440122638_*|*_3_*:*_2_*:*_509574410_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1454373977"}], "description": "In the context of HTTP requests that don't return an HttpClient object for callers to manage, the work done for TK-101, hopefully very temporarily, moved the close call on a {{CloseableAsyncHttpClient}} from the thread on which the client request callback was invoked over to a separate thread pool.  This was done to avoid a deadlock due to the Apache AsyncHttpClient library implementation.\n\nA much better approach would involve having the close call be made on the originating client thread -- or possibly not at all.  One option  [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] and I talked about was having the clj-http-client library cache a {{CloseableAsyncHttpClient}} instance internally for use with the non-client based API request calls and just reuse that for subsequent requests.  If we do that, it may no longer be necessary to even call close on the {{CloseableAsyncHttpClient}} object, assuming callers would be responsible for closing any streams returned in a response.  We'd need to look into threading / context re-use implications of such an approach, e.g, whether or not requests against the same client object can safely be made from different threads concurrently and whether or not any state is inappropriately transferred between requests.  ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10650", "fixedVersions": ["HTTP-CLIENT 0.4.0"], "id": "10650", "issueType": "Improvement", "key": "TK-103", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-11-18T15:38:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate options for replacing http-client AsyncClose with Close from Originating Client Thread", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-20T15:10:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@42513d04"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuqf:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_10592590_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_255769448_*|*_10005_*:*_1_*:*_231125623575"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10210", "fixedVersions": [], "id": "10210", "issueType": "Improvement", "key": "TK-102", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:43:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "stop hard-coding ports in HTTP-related tests", "timeSpent": "PT0S", "updated": "2022-02-18T17:43:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "passed CI in https://jenkins.puppetlabs.com/view/Clojure%20Projects/job/http-client/18/", "created": "2014-10-23T12:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-16T12:14:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@155b2f31"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypnhb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_10407489_*|*_1_*:*_2_*:*_101173804_*|*_10007_*:*_1_*:*_239029225_*|*_3_*:*_2_*:*_256618501_*|*_5_*:*_1_*:*_0"}], "description": "In doing some load testing that exercises the puppetlabs clj-http-client code to make HTTP requests, we've noticed cases where an exceptionally high number of file descriptors have been accrued.  This has happened when the client connections have been failing to connect to the server - because the server was not listening.  We're suspecting - but have not proven - that the clj-http-client library might be leaking file descriptors in connection failure scenarios.\n\nWould be good to try some repeated requests through the JavaClient API where the connections repeatedly fail and measure open file descriptors with lsof to see if they keep climbing.  If there is a leak, there may need to be work done in clj-http-client to close the client objects properly.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10447", "fixedVersions": ["HTTP-CLIENT 0.3.1"], "id": "10447", "issueType": "Bug", "key": "TK-101", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-10-23T12:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client may leak file descriptors for connection failures", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "ping [~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd] [~accountid:557058:22d0f8be-5a48-45ef-8078-6e91e5c34720] ... just FYI, this is a ticket that I mentioned yesterday.", "created": "2014-11-05T15:45:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:58:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-16T08:47:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1a12ee30"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywisv:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Mar/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_379380617_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_255534659_*|*_10005_*:*_1_*:*_232652903621"}], "description": "With the current implementation, tk-j9 requires you to pass in an array for the value of 'ssl-protocol'.  This means that you can't use this setting from an ini or properties config file.  We should look into adding support for either a comma-delimited string or an array (and this won't be the only time this issue comes up, so we might want to consider trying to come up with a general solution for this).\n\nIn general we might want to try to start adopting some of the patterns that [~accountid:557058:dc666788-5651-476c-a211-ec5b44a7b0dd] has established in PuppetDB, e.g.:\n\nhttps://github.com/puppetlabs/puppetdb/blob/master/src/puppetlabs/puppetdb/schema.clj#L107", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10585", "fixedVersions": [], "id": "10585", "issueType": "Task", "key": "TK-100", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:58:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add support for comma-delimited string in TK-j9 ssl-protocols config setting", "timeSpent": "PT0S", "updated": "2022-03-08T09:58:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-16T07:24:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6d774f50"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywitb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_384564942_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_255373953_*|*_10005_*:*_1_*:*_231125598866"}], "description": "[~accountid:557058:38b78272-04e8-470c-a36e-3d8a864889cc] just finished up a first pass at a lein plugin that will take the current git sha of your project and put it into the pom and the jar manifest when building a project.  We should start using this in our apps and start looking into how it will interact with ezbake when we do an uberjar build.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10322", "fixedVersions": [], "id": "10322", "issueType": "Task", "key": "TK-99", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:43:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "try out scott's new \"shard\" lein plugin", "timeSpent": "PT0S", "updated": "2022-02-18T17:43:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "passed CI in https://jenkins.puppetlabs.com/view/Clojure%20Projects/job/http-client/18/", "created": "2014-10-23T12:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-15T12:41:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7f051141"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypnhz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_169438227_*|*_1_*:*_1_*:*_188395281_*|*_10007_*:*_1_*:*_108942960_*|*_3_*:*_1_*:*_223117306_*|*_5_*:*_1_*:*_0"}], "description": "There is currently no way to configure our HTTP client to allow or disallow specific SSL protocols.  There should be a setting that controls this.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10583", "fixedVersions": ["HTTP-CLIENT 0.3.0"], "id": "10583", "issueType": "Improvement", "key": "TK-97", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2014-10-23T12:19:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add ability to configure ssl protocols on clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-13T17:37:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@8faa699"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypncv:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2988416_*|*_10007_*:*_1_*:*_11248914_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_58624840"}], "description": "Graceful shutdown support was recently added to TK Jetty9, with a default graceful stop timeout of 60 seconds. However, in my testing of the functionality added to address SERVER-35, I found that the default timeout isn't actually 60 seconds, as evidenced by the fact that my 45 second http request would be dropped unless I explicitly set the timeout to 60 seconds in the configuration. This needs to be fixed so that the default timeout is 60 seconds as intended and documented.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10661", "fixedVersions": ["TK-JETTY9 0.8.1"], "id": "10661", "issueType": "Bug", "key": "TK-95", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-10-14T13:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Default Graceful shutdown timeout in TK Jetty9 is not 60 seconds", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-08T16:01:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6a73d805"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywitj:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1044808985_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_255277303_*|*_10005_*:*_1_*:*_231125776367"}], "description": ":(", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10500", "fixedVersions": [], "id": "10500", "issueType": "Improvement", "key": "TK-94", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Trivial", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Fix", "resolutionDate": "2022-02-18T17:46:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "the lein template still uses test-resources instead of dev-resources", "timeSpent": "PT0S", "updated": "2022-02-18T17:46:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-07T18:49:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1011a6a4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuqn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_63897790_*|*_3_*:*_1_*:*_13083395_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1299451940_*|*_10005_*:*_1_*:*_105065051744"}], "description": "It would be nice to have a little API for defining user/password on a request when using HTTP basic auth, instead of having to manually construct the 'Authorization' header.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10337", "fixedVersions": [], "id": "10337", "issueType": "New Feature", "key": "TK-93", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Trivial", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2018-02-20T16:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add API for HTTP basic authentication to clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "With respect to the configurability of the new feature, [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] suggested we might be able to use a single setting.  Maybe we could call it *graceful-shutdown-timeout-in-seconds* (or something less wordy if others have a good suggestion) where a value of 0 means shutdown immediately -- no timeout.   I think this should be an optional setting for backward compatibility of the configuration but [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] and I were thinking that having a graceful shutdown be done by default would be a *good* thing.  The absence of the setting from the configuration could mean to do a graceful shutdown with a timeout of 30 seconds (seemingly good default since that's what Jetty has been using).", "created": "2014-10-07T13:22:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-06T11:36:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@8fe5cc7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypnfr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1080444_*|*_1_*:*_1_*:*_92270146_*|*_10007_*:*_1_*:*_90413353_*|*_3_*:*_1_*:*_171981569_*|*_5_*:*_1_*:*_0"}], "description": "The Jetty web server has the capability to support gracefully shutting itself down when it is stopped.  For a graceful shutdown, request acceptors are shut down to prevent new requests from getting in during the shutdown process while any currently open requests would be held open for a configurable period of time to allow for them to complete.\n\nThe way the Jetty9 service is currently configured by tk-webservices-jetty9, however, none of the graceful shutdown logic is being exercised.  Any currently open requests at Jetty shutdown time are immediately severed.\n\nIn order to enable this capability, I believe we would have to do what is suggested in the following Jetty bug:\n\n  https://bugs.eclipse.org/bugs/show_bug.cgi?id=420142\n\nI modified `create-webserver` in jetty9_core.clj to create a StatisticsHandler, wrap it around the handler currently set as the top-level handler on the Server object, and pass the StatisticsHandler in as the top-level handler to the Server object.  Running with that configuration, I found that an open request at SIGTERM time for the running Java process was held open until 30 seconds had elapsed or the response was successfully provided.\n\nI think it would make sense to provide this at least as an option that could be configured on the webserver service.  Additionally, it may make sense to expose a way to configure the wait timeout for requests to complete.  I believe this would be done by a call to `setStopTimeout` on the Server instance.  The default value is currently 30 seconds but making this configurable would add extra flexibility for scenarios where the types of requests being performed might predictably take much less or much greater time to complete, depending upon the web services configured on the stack. \n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10285", "fixedVersions": ["TK-JETTY9 0.8.0"], "id": "10285", "issueType": "New Feature", "key": "TK-92", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-10-10T14:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support for gracefully shutting down web requests in TK-Jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [{"attacher": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "created": "2014-10-15T20:00:00.000000", "name": "replicate_tk-91.patch", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10066"}], "comments": [{"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "This has been a stretch goal for PuppetDB for quite some time: PDB-587. So I'm +1 to this as well.\n\nAlthough [~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a] I'm not sure I agree with an escape hatch for providing a jetty.xml as that goes against the grain of what we've done before, plus XML is a horrid interface to force onto our users and I'd prefer to minimize that. I'm not ruling it out, but I'd rather a first class set of configuration items in the [webserver] block, so that users can provide a list of allowed hosts and actions etc.", "created": "2014-10-04T06:21:00.000000"}, {"author": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "body": "Agree, a new webserver config option is preferable to dealing with xml. What I mean is whether there is a workaround that which we can use *now* as this is a critical issue for us. From what we're seeing, jetty seems to impose a number of its own behaviors (302 redirects, managing CORS) which we'd rather manage using Ring middleware.", "created": "2014-10-04T06:46:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a] We'd definitely be open to getting in a fix that solves the CORS issue you're having, but as Ken said, it'd probably be something we'd want to expose via our config.  Wedging a jetty XML config file into the mix would be pretty challenging.\n\nThat said, if you can let me know what the relevant part of your `web.xml` would look like in this case, that'll make it much quicker for us to get in a fix for it.  Is it just that snippet of XML in the Cross Origin Filter page that you linked?  Which of the configuration parameters would you need?\n\nThis should be a fairly simple change to TK-Jetty9.  We can probably squeeze it in sometime in the next few weeks, or, if you are interested in submitting a pull request we can help you with that, and we can do a clojars release as soon as it gets merged in.", "created": "2014-10-06T09:47:00.000000"}, {"author": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "body": "My apologies for the confusing last sentence, it is meant as a separate question rather than a suggestion. The lack of CORS is a deal breaker for us, hence I was wondering if there is a temporary workaround for the current release of tk-jetty9 that does not require any code change on your part. As a temporary solution, using xml or more clunky code is reasonable, as we can refactor it to use the proper solution when it is released later, and it will allow us to continue using tk-jetty9 in the meantime.\n\nThe reason I'm asking is because without CORS support, we cannot use tk-jetty9 as it is blocking work on our frontend hosted on a different domain from our API server. I'm inferring from your replies that the answer is no such workaround is possible.\n\nUnfortunately, I'm not familiar with jetty configuration to advise on the solution for this issue. In my case, I'd prefer jetty to ignore the Origin header and leave it to the user defined handler to deal with it using a middleware.\n\n", "created": "2014-10-06T19:30:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a] I do not believe there is a way to workaround your issue using an xml configuration given the current code base.  Some minor changes would need to be made to the code that instantiates the Jetty server object in order to make that possible, and they would probably be more work than simply adding in support for the CORS filter.\n\nI'm eager to get this fixed for you but we're in the middle of wrapping up a release of some of our commercial products right now, so it will likely be a few weeks before we could put together a fix.\n\nIf you want to take a swing at it yourself in the meantime, it should only be a few lines of code.  The change will go here:\n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/88beaa4b6c5eef02c4a3eec212de17b669277ae4/src/puppetlabs/trapperkeeper/services/webserver/jetty9_core.clj#L465\n\nand will be very similar to what we're doing for the GZIP/Logging handlers.  Here's an example of what it looks like to use the CORS filter programmatically (from http://www.programcreek.com/java-api-examples/index.php?api=org.eclipse.jetty.servlet.FilterHolder ):\n\n{quote}\n    FilterHolder filterHolder=new FilterHolder()", "created": "2014-10-07T15:46:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "[~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a] I've been having a look at this ticket. We have no CORS support by default, so as you say above, your cross-origin request fails. I'm seeing this behaviour too. However, I'm finding I can use ring-cors to solve the problem in my own ring handler without changes to TK-jetty9. I'd like to understand why we're seeing different behaviour.\n\nI've tried the following:\n\n* Curling the example \"bert and ernie\" ring app supplied with trapperkeeper-jetty9 (which has no CORS support) both with and without an \"Origin\" header\n** both give 200 OK and a response\n\n* Curling the example \"hello/goodbye\" servlet app (which also has no CORS support) both with and without an \"Origin\" header\n** both give 200 OK and a response\n\n* Curling a modified version of the ring app with ring-cors support in the handler with:\n** No \"Origin\" header  \n*** gives 200 OK and a response\n** A valid \"Origin\" header (per the active cors config) \n*** gives 200 OK and a response\n** An invalid \"Origin\" header (per the active cors config) \n*** gives 404 as expected\n \nCalling the API using jQuery running in Chrome again either fails and gives me the expected cross-origin errors (if CORS is missing) or works (if I use ring-cors in my handler).\n\nIn no cases am I seeing Jetty close the connection. I *can* get Jetty to close the connection by asking explicitly with a \"Connection: close\" header but even in that case I get the expected response too. I had a not-exactly-comprehensive search through the Jetty source and can only find connection closes in response to either explicit requests in the headers (like I did) or in response to server errors, like exceptions from the ring app itself. In the latter case the HTTP code would be 500 and that doesn't fit what you're seeing.\n\nI'd love to hear your feedback on the above. Would you be able to send me the full request and response HTTP headers? If possible, could you recreate the error in the example ring app - that might help identify where our code diverges? Finally, are you using curl or sniffing the HTTP traffic?\n\nThanks for the help!\n", "created": "2014-10-15T13:25:00.000000"}, {"author": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "body": "[~accountid:557058:38b78272-04e8-470c-a36e-3d8a864889cc]: Thanks for the detailed investigation. From your results, I suspect the bug may be triggered by mounting different handlers on the same endpoint. I had two services handling requests at /api/resource1 and /api/resource2 respectively. Due to TK-83, I had to mount them both at the path /api when calling add-ring-handler.\n\nI manage to replicate the issue with the \"bert and ernie\" example. I've attached a patch against tk-jetty9 in the original issue. The patch uses Compojure to ensure that each service only service the particular URI and wraps them in the ring-cors middleware then mount them on the root endpoint \"\"\n\n> curl -H \"Origin:http://google.com\" -i localhost:8080/bert\n\nHTTP/1.1 200 OK\nDate: Thu, 16 Oct 2014 01:59:28 GMT\nAccess-Control-Allow-Methods: DELETE, GET, POST, PUT\nAccess-Control-Allow-Origin: http://google.com\nContent-Length: 534\nServer: Jetty(9.1.0.v20131115)\n\n<h1>Hello from http://localhost:8080/bert</h1><p>You are visitor number 4.</p><pre>{:ssl-client-cert nil,\n :remote-addr \"127.0.0.1\",\n :scheme :http,\n :request-method :get,\n :query-string nil,\n :route-params {},\n :content-type nil,\n :uri \"/bert\",\n :server-name \"localhost\",\n :params {},\n :headers\n {\"origin\" \"http://google.com\",\n  \"user-agent\" \"curl/7.33.0\",\n  \"host\" \"localhost:8080\",\n  \"accept\" \"*/*\"},\n :content-length nil,\n :server-port 8080,\n :character-encoding nil,\n :body #<HttpInputOverHTTP HttpInputOverHTTP@297bd5d1>}\n</pre>\n\n> curl -H \"Origin:http://google.com\" -i localhost:8080/ernie\n\nHTTP/1.1 200 OK\nDate: Thu, 16 Oct 2014 01:59:52 GMT\nAccess-Control-Allow-Methods: DELETE, GET, POST, PUT\nAccess-Control-Allow-Origin: http://google.com\nContent-Length: 0\nServer: Jetty(9.1.0.v20131115)\n\n", "created": "2014-10-15T19:58:00.000000"}, {"author": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "body": "When I changed the cors middleware to return different methods for each service (bert returns :get :bert and ernie returns :get :ernie). I found that bert cors middleware is the one generating Access-Control-Allow-Methods in the response for /ernie.\n\n> curl -H \"Origin:http://google.com\" -i localhost:8080/bert\nHTTP/1.1 200 OK\nDate: Thu, 16 Oct 2014 02:09:59 GMT\nAccess-Control-Allow-Methods: BERT, GET\nAccess-Control-Allow-Origin: http://google.com\nContent-Length: 534\nServer: Jetty(9.1.0.v20131115)\n\n<h1>Hello from http://localhost:8080/bert</h1><p>You are visitor number 3.</p><pre>{:ssl-client-cert nil,\n :remote-addr \"127.0.0.1\",\n :scheme :http,\n :request-method :get,\n :query-string nil,\n :route-params {},\n :content-type nil,\n :uri \"/bert\",\n :server-name \"localhost\",\n :params {},\n :headers\n {\"origin\" \"http://google.com\",\n  \"user-agent\" \"curl/7.33.0\",\n  \"host\" \"localhost:8080\",\n  \"accept\" \"*/*\"},\n :content-length nil,\n :server-port 8080,\n :character-encoding nil,\n :body #<HttpInputOverHTTP HttpInputOverHTTP@3ed531ad>}\n</pre>\n\n> curl -H \"Origin:http://google.com\" -i localhost:8080/ernie\nHTTP/1.1 200 OK\nDate: Thu, 16 Oct 2014 02:10:29 GMT\nAccess-Control-Allow-Methods: BERT, GET\nAccess-Control-Allow-Origin: http://google.com\nContent-Length: 0\nServer: Jetty(9.1.0.v20131115)\n\n", "created": "2014-10-15T20:10:00.000000"}, {"author": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "body": "Digger into this further the culprit seems to be ring-cors and not tk-jetty9. ring-cors does not handle the case where the origin header is present and the handler returns nil to indicate that it does not handle the request. In this case, ring-cors should also return nil, but it executes (add-access-control request (handler request) access-control)) which works even though (handler request) is nil. \n\nI've filled a ticket with ring-cors. Thanks for the help in figuring out the root cause of the problem. We can consider this issue resolved.", "created": "2014-10-15T20:21:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "[~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a] Thanks for all this and I'm glad you're making progress. Really appreciate the effort you've put in.", "created": "2014-10-16T10:08:00.000000"}, {"author": "557058:38b78272-04e8-470c-a36e-3d8a864889cc", "body": "Thanks for raising the issue with ring-cors [~accountid:557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a]. I implemented a fix and raised a pull request with the maintainer of that project. For now you can work around the issue by wrapping your ring handler using the function below. Rather than simply wrapping using *wrap-cors*, this function will pass the response through ring-cors only if it in not nil.\n\n{code:borderStyle=solid}\n(defn- cors-ring-handler\n  \"Wraps the ring handler to support CORS and includes a workaround for issue #5\"\n  [handler]\n  (fn [request]\n    (let [resp (handler request)]\n      ", "created": "2014-10-24T07:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-10-03T19:19:00.000000", "creator": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@13616240"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuc7:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "null_*:*_1_*:*_0_*|*_1_*:*_1_*:*_1067547652_*|*_10007_*:*_1_*:*_213123774_*|*_3_*:*_2_*:*_488426233_*|*_5_*:*_1_*:*_0_*|*_10005_*:*_1_*:*_1710512"}], "description": "Using ring-cors with http-kit previously and CORS works, after switching to trapperkeeper-jetty9 CORS stops working due to http://www.eclipse.org/jetty/documentation/current/cross-origin-filter.html\n\nSample response of jetty9 with Origin header:\nHTTP/1.1 200 OK\nDate: Sat, 04 Oct 2014 01:15:33 GMT\nAccess-Control-Allow-Methods: DELETE, GET, POST, PUT\nAccess-Control-Allow-Origin: http://<redacted>\nConnection: close\nServer: Jetty(9.1.z-SNAPSHOT)\n\nAs shown, the ring-cors middleware generates the proper access control headers, however jetty closes the connection. \n\nRemoving the Origin header, the API call works as before.\n\nThis is a major problem for us as we are calling our APIs via Javascript from the browser.\n\nIs there a way to supply a web.xml to trapperkeeper's jetty9 as a workaround?", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10320", "fixedVersions": [], "id": "10320", "issueType": "Bug", "key": "TK-91", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "resolution": "Done", "resolutionDate": "2014-10-24T07:12:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "CORS headers not respected by jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-02T09:46:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b548b25"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywupz:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_981720435_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_859248954_*|*_10005_*:*_1_*:*_105064870993"}], "description": "With :force-redirects and :follow-redirects \"true\" for requests made through the Clojure binding in the Puppet Labs clj-http-client library and the target URI returning a 301 (Moved Permanently) and different URI from the original request in the Location header, I see the following:\n\n* For a POST request, the client issues a GET request when following the redirect. The GET request has no request body.\n\n* For a PUT or PATCH request, the client does not follow the redirect -- no follow-up request issued in response to the HTTP 3XX response to the initial request.\n\nI had originally been thinking that all of these would result in the request being redirected with the original method and request body intact.  The POST behavior may be due to how the underlying Apache http client library works, not sure.  From section 10.3.2 (301 Moved Permanently) in the HTTP 1.1 RFC (https://www.ietf.org/rfc/rfc2616.txt):\n\n{noformat}\n   If the 301 status code is received in response to a request other\n   than GET or HEAD, the user agent MUST NOT automatically redirect the\n   request unless it can be confirmed by the user, since this might\n   change the conditions under which the request was issued.\n\n      Note: When automatically redirecting a POST request after\n      receiving a 301 status code, some existing HTTP/1.0 user agents\n      will erroneously change it into a GET request.\n{noformat}\n\nThe process of confirming the redirect by the user, per the HTTP RFC, is difficult to reconcile with automatic redirection behaviors in the library.\n\nSince the force/follow redirect client options do not seem to reflect the actual behavior, these behaviors should be investigated further.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10649", "fixedVersions": [], "id": "10649", "issueType": "Bug", "key": "TK-90", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2018-02-20T16:50:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client redirects for POST, PUT, and PATCH don't seem to be working", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-01T19:02:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@78e7b75b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Capitalized?", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Yes"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywiuv:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1638825894_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_232907917730"}], "description": "When I tried to add the {{access-log-config}} item to my webserver config, I got this really terrible schema error:\n\n{code}\nException in thread \"main\" clojure.lang.ExceptionInfo: Input to init! does not match schema: [nil (named (not (some (check % a-clojure.lang.PersistentArrayMap) schemas)) config)] {:schema [#schema.core.One{:schema Any, :optional? false, :name context} #schema.core.One{:schema (either {(optional-key :access-log-config) java.lang.String, (optional-key :gzip-enable) java.lang.Boolean, (optional-key :truststore) java.lang.String, (optional-key :key-password) java.lang.String, (optional-key :client-auth) java.lang.String, (optional-key :jmx-enable) java.lang.String, (optional-key :ssl-port) Int, (optional-key :keystore) java.lang.String, (optional-key :trust-password) java.lang.String, (optional-key :ssl-cert) java.lang.String, (optional-key :ssl-cert-chain) java.lang.String, (optional-key :ssl-host) java.lang.String, (optional-key :ssl-crl-path) java.lang.String, (optional-key :port) Int, (optional-key :max-threads) Int, (optional-key :static-content) [{:resource java.lang.String, :path java.lang.String, (optional-key :follow-links) java.lang.Boolean}], (optional-key :ssl-ca-cert) java.lang.String, (optional-key :default-server) java.lang.Boolean, (optional-key :ssl-protocols) [java.lang.String], (optional-key :ssl-key) java.lang.String, (optional-key :request-header-max-size) Int, (optional-key :host) java.lang.String, (optional-key :cipher-suites) [java.lang.String]} (both {Keyword {(optional-key :access-log-config) java.lang.String, (optional-key :gzip-enable) java.lang.Boolean, (optional-key :truststore) java.lang.String, (optional-key :key-password) java.lang.String, (optional-key :client-auth) java.lang.String, (optional-key :jmx-enable) java.lang.String, (optional-key :ssl-port) Int, (optional-key :keystore) java.lang.String, (optional-key :trust-password) java.lang.String, (optional-key :ssl-cert) java.lang.String, (optional-key :ssl-cert-chain) java.lang.String, (optional-key :ssl-host) java.lang.String, (optional-key :ssl-crl-path) java.lang.String, (optional-key :port) Int, (optional-key :max-threads) Int, (optional-key :static-content) [{:resource java.lang.String, :path java.lang.String, (optional-key :follow-links) java.lang.Boolean}], (optional-key :ssl-ca-cert) java.lang.String, (optional-key :default-server) java.lang.Boolean, (optional-key :ssl-protocols) [java.lang.String], (optional-key :ssl-key) java.lang.String, (optional-key :request-header-max-size) Int, (optional-key :host) java.lang.String, (optional-key :cipher-suites) [java.lang.String]}} (pred one-default?))), :optional? false, :name config}], :value [{} {:rbac {:ssl-ca-cert \"./dev-resources/ssl/ca.pem\", :ssl-key \"./dev-resources/ssl/key.pem\", :ssl-cert \"./dev-resources/ssl/cert.pem\", :host \"0.0.0.0\", :port 8881}, :access-log-config \"./dev-resources/request-logging.xml\", :console {:host \"0.0.0.0\", :port 8880}}], :error [nil (named (not (some (check % a-clojure.lang.PersistentArrayMap) schemas)) config)]}, compiling:(/private/var/folders/9k/n0tqy1x515792y_xs5_h1wwr0000gq/T/form-init8621054008251244948.clj:1:124)\n        at clojure.lang.Compiler.load(Compiler.java:7142)\n        at clojure.lang.Compiler.loadFile(Compiler.java:7086)\n        at clojure.main$load_script.invoke(main.clj:274)\n {code}\n\nmy config looked like:\n\n{code}\nwebserver: {\n  access-log-config: \"./dev-resources/request-logging.xml\"\n\n  console {\n    host: 0.0.0.0\n    port: 8880\n  }\n\n  rbac {\n    host: 0.0.0.0\n    port: 8881\n    ssl-key: \"./dev-resources/ssl/key.pem\"\n    ssl-cert: \"./dev-resources/ssl/cert.pem\"\n    ssl-ca-cert: \"./dev-resources/ssl/ca.pem\"\n  }\n}\n{code}\n\nIt was complaining because I needed to put the {{access-log-config}} option in both of my webservers, but I could not have figured that out from the schema error.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10283", "fixedVersions": ["TK 1.y"], "id": "10283", "issueType": "Bug", "key": "TK-89", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Won't Fix", "resolutionDate": "2022-03-08T09:54:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Gross schema error", "timeSpent": "PT0S", "updated": "2022-03-08T09:54:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-10-01T14:16:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@21b8a026"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypo4n:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_95420_*|*_10007_*:*_1_*:*_2938189_*|*_3_*:*_1_*:*_906511_*|*_5_*:*_1_*:*_0"}], "description": "JavaClient.createClient() in clj-http-client errantly builds two clients instead of one.  The first one falls out of scope before the method call ends.  Because no close() call is made on the first one, however, all of the native resources associated with it, e.g., file descriptors, are leaked (never reclaimed until the process dies off).\n\nThe first build() call should be removed since it leaks resources and is unnecessary.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10281", "fixedVersions": [], "id": "10281", "issueType": "Bug", "key": "TK-88", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-10-01T15:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client errantly builds two clients for createClient() calls", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I've done some initial work on this but it's nowhere near done.", "created": "2015-01-16T13:20:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-29T16:40:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@75bdc089"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywisf:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Mar/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1216143277_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_233512419845"}], "description": "Most TK services have some required config, and, when any one of these config values are missing, will fail to {{init}} or {{start}}.  Currently, it is up to each service to validate it's config data, and the only way for services to handle this is to throw an Exception - this is undesirable because the stacktrace is almost always useless, and is very distracting to an end-user looking at the log and trying to diagnose this problem.\n\nI propose that we add some sort of way for TK services to define their required configuration.  TK would then verify that each service's required configuration is available before {{init}}; if any configuration is missing, the process should terminate with a user-friendly error message which mentions *all* of the missing config values (not just the first one encountered).", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10660", "fixedVersions": [], "id": "10660", "issueType": "New Feature", "key": "TK-86", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2022-03-08T10:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "validate service config before startup", "timeSpent": "PT0S", "updated": "2022-03-08T10:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "One case where this would be nice is our current plan for master + no-op CA service.", "created": "2014-09-29T12:30:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "duplicate of TK-299", "created": "2015-12-30T16:19:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-29T12:28:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3e6ced5f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuo7:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1231219981_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_859231315_*|*_10005_*:*_1_*:*_37411779500"}], "description": "... a way for a given service (s1) to say that, *if* an implementation of another service protocol exists (s2), load s2 before s1.\n\nThe idea of an \"optional\" dependency has come up several times.  There may be more to it than just service load order.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10581", "fixedVersions": [], "id": "10581", "issueType": "New Feature", "key": "TK-85", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Duplicate", "resolutionDate": "2015-12-30T16:19:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add support for service load order / optional dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-23T19:33:00.000000", "creator": "6243b375fd5e4500704351c5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@51dd7fe0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypo47:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_104214423_*|*_1_*:*_1_*:*_659536897_*|*_10007_*:*_1_*:*_3620456_*|*_5_*:*_1_*:*_0"}], "description": "The Java URI class [encodes the \"query\" parameter|http://docs.oracle.com/javase/7/docs/api/java/net/URI.html#legal-chars] when using its multi-parameter constructor. In {{proxy-servlet}} we are using {{getQueryString}} to get the query string to pass into URI, which [does not URL decode|http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getQueryString%28%29] the query string. This means that requests that are already URL encoded will be URL encoded again by URI.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10208", "fixedVersions": ["TK-JETTY9 0.7.6"], "id": "10208", "issueType": "Bug", "key": "TK-84", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Blocker", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6243b375fd5e4500704351c5", "resolution": "Fixed", "resolutionDate": "2014-10-02T16:42:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "proxy-servlet double encodes query strings", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Awesome, thanks for the tip!  We'd noticed that annoyance in the past but hadn't had time to figure out a proper fix.  Will get this onto the roadmap.", "created": "2014-09-18T08:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think we might even set this to `true` by default.  Would anyone have any concerns about that?", "created": "2014-09-18T08:38:00.000000"}, {"author": "557058:c0188ab7-8cd9-4c11-89f2-7b44c37cbf88", "body": "First issue I'm reading, first comment I'm adding, first thought it produced (after reading your last comment) - merely this: \n*Please* make sure to document the default and behavior it produces in a way that folks searching for a fix to the automatic 302's being thrown have a reasonably decent chance of hitting the documented behavior and can figure out what to do.\n\nOf course, I add this comment in complete ignorance of your documentation behavior and feel this little itch between my shoulder blades -- the tell that I'm speaking to those who already know. Still, just trying to help.\n-wc\n", "created": "2014-09-21T12:03:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Sure, thanks for the comment.  It seems to me that the most intuitive default behavior would be for it to *not* do a redirect, so I'm leaning towards making that the default.  We'd then provide an override setting that allowed people to turn that redirect behavior back on if that was their preference.  The new setting will be documented alongside all of the existing settings, here:\n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/doc/jetty-config.md\n", "created": "2014-09-21T13:24:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] if you get bored this week, here's a good ticket :)", "created": "2014-09-21T13:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-18T00:11:00.000000", "creator": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1ba0fecd"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypnf3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2172827_*|*_1_*:*_1_*:*_1352468566_*|*_10007_*:*_1_*:*_433360725_*|*_5_*:*_1_*:*_0"}], "description": "Currently when registering a handler using (add-ring-handler handler \"/api/resource\"), Jetty9 issues a 302 redirect when requesting http://server.com/api/resource to http://server.com/api/resource/ (with the trailing slash)\n\nThis makes it difficult to create a REST API endpoint at /api/resource (without trailing slash). A workaround is to change the endpoint to a higher level such as \"/api\", but this is not a good fix as all resources under /api will have the same endpoint.\n\nA better fix is to disable the automatic 302 from Jetty by calling setAllowNullPathInfo(true) for the context handler. This can be exposed as a web server configuration option.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10249", "fixedVersions": ["TK-JETTY9 0.8.0"], "id": "10249", "issueType": "New Feature", "key": "TK-83", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:55ee2a78-46ee-47f4-82aa-39621d2ea54a", "resolution": "Fixed", "resolutionDate": "2014-10-08T16:51:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Unable to serve content at endpoint registered in add-ring-handler as Jetty9 automatically does a 302 to endpoint + trailing slash", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I looked at this a bit.  The solution is probably to call {{.setAcceptQueueSize}} on the connector(s) we create.  Jetty does not have a setting that corresponds exactly to 'max number of connections', but 'accept queue size' is pretty close.  References:\n\nhttp://stackoverflow.com/a/7306195/1558755\nhttp://www.eclipse.org/jetty/documentation/current/configuring-connectors.html#jetty-connectors\nhttp://comments.gmane.org/gmane.comp.java.jetty.support/5590\n\nAnother option would be to use the QOSFilter and set maxRequests:\n\nhttp://www.eclipse.org/jetty/documentation/current/qos-filter.html", "created": "2014-09-18T15:30:00.000000"}, {"author": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363", "body": "[~accountid:557058:e2510a0a-1767-444f-be52-bae9bb15d3f6] Ping.", "created": "2014-09-23T16:59:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5], do you remember if you looked at the possibility of limiting the size of the queue backing the {{QueuedThreadPool}} that is passed into the {{Server}} instance during construction, at:\n\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/src/puppetlabs/trapperkeeper/services/webserver/jetty9_core.clj#L234\n\nIf we used the form of the constructor that accepts a queue, we could construct and pass in a form of queue that has a fixed maximum capacity, like a java.util.concurrent.ArrayBlockingQueue.\n\nhttps://github.com/eclipse/jetty.project/blob/master/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java#L85\n\nWithout that, I believe a queue with no effective maximum is being constructed so Jetty's acceptors might just be dumping all new requests into the queue and getting nearly unrecoverably behind under really high load.\n\nWondering if we limit the size of the thread queue like this if Jetty will be forced to drop new connections under sufficiently high load because there wouldn't be any place for it to store them.\n\nI first read about this at:\n\nhttps://wiki.eclipse.org/Jetty/Howto/High_Load#Thread_Pool", "created": "2014-10-12T01:20:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Woohoo for accidentally clicking things in JIRA!\n\n[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] - I don't remember looking into that option, no ... but I investigated this quite a while ago.  It sounds reasonable, and sounds more straightforward than tuning {{acceptQueueSize}} since it is at the {{Server}}-level instead of per-connector.", "created": "2014-10-13T11:37:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "I think one of the advantages of fixing the size on the {{QueuedThreadPool}} passed into the {{Server}} as opposed to just setting the {{acceptQueueSize}} on the {{ServerConnector}} is that the {{ServerConnector}} approach just passes the size down to the underlying JVM {{ServerSocket}} and a JVM implementation, by spec, is free to \"ignore\" whatever value is passed in.  From the Javadocs for the JDK's ServerSocket.bind() method for the \"backlog\" parameter:\n\n{quote}\nThe <code>backlog</code> argument is the requested maximum number of pending connections on the socket. Its exact semantics are implementation specific. In particular, an implementation may impose a maximum length or may choose to ignore the parameter altogther.\n{quote}\n\nA maximum set on the {{QueuedThreadPool}} size will be enforced by Jetty and does not appear to have OS, implementation-specific constraints which could cause it to be ignored.", "created": "2014-12-02T18:39:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-17T10:51:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4c6827e1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:e2510a0a-1767-444f-be52-bae9bb15d3f6"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypc93:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "23/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "null_*:*_1_*:*_0_*|*_10008_*:*_1_*:*_682279154_*|*_1_*:*_1_*:*_89368848_*|*_10007_*:*_1_*:*_419958451_*|*_3_*:*_2_*:*_3065675492_*|*_4_*:*_1_*:*_2146580003_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_4402626516"}], "description": "Add configuration to tk-jetty9 that enables control over the maximum number of open HTTP connections that jetty will maintain.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10580", "fixedVersions": ["TK-JETTY9 1.1.1"], "id": "10580", "issueType": "Improvement", "key": "TK-82", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-01-20T11:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "make jetty's # of HTTP connections configurable", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-16T17:24:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@56603fee"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypoov:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_87404_*|*_10007_*:*_1_*:*_2226151968_*|*_3_*:*_1_*:*_163393605_*|*_6_*:*_1_*:*_0"}], "description": "The request logback option for the TK Jetty9 service needs both tests and docs.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10498", "fixedVersions": ["TK-JETTY9 0.7.6"], "id": "10498", "issueType": "Improvement", "key": "TK-81", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-10-14T09:11:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add tests and documentation for request logback in TK Jetty9 service", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Also, it's still got ...\n{code}\n:test-paths [\"test\" \"test-resources\"]\n{code}.\n\nEww.  I know we had another ticket for that but I'm unable to find it.", "created": "2014-09-15T12:22:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] I would really love to see this one happen, so if you get some downtime, this is a good one to grab.  I think it'd be good to port the template to use the webrouting service.", "created": "2014-09-30T17:31:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I merged https://github.com/puppetlabs/trapperkeeper-lein-template/pull/2.  I *think* that we now need to do a release of the template, to get those changes out in the wild, but I don't know how to do that.", "created": "2014-10-07T12:49:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "tagged and released 0.1.2, tested manually.  looks good.", "created": "2014-10-07T13:33:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-15T12:19:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@35a8fbc8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypo4f:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1388838967_*|*_10007_*:*_1_*:*_514283580_*|*_3_*:*_1_*:*_2195076_*|*_5_*:*_1_*:*_0"}], "description": "Notably: \n{code}\n(def tk-version \"0.4.2\")\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10496", "fixedVersions": [], "id": "10496", "issueType": "Improvement", "key": "TK-80", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2014-10-07T13:34:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "lein template has outdated dependencies", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "@patrick ping just so you know this is out there.", "created": "2014-09-30T17:27:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This would be neat, but at this point it's very far from trivial, given the sheer number of TK services out there. We could still consider adding one, but taking it up consistently is a big project.", "created": "2022-01-13T13:26:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-10T15:09:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3219f753"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywiwn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2863174601_*|*_3_*:*_2_*:*_254858053_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_3_*:*_604363091_*|*_10005_*:*_1_*:*_232652483072"}], "description": "Currently, there are a number of places in trapperkeeper services where we have to throw an exception due to an invalid configuration. As it stands, there isn't really a good exception to throw that fits this situation. \n\nAs a result, we should create a new InvalidConfigurationException in TrapperKeeper that is specifically tailored to this type of error case. We should also change the various Trapperkeeper services to throw this exception in cases where there is an invalid configuration, instead of throwing whatever type of exception they're throwing now.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10578", "fixedVersions": [], "id": "10578", "issueType": "Improvement", "key": "TK-79", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:51:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add and use InvalidConfigurationException", "timeSpent": "PT0S", "updated": "2022-03-08T09:51:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-05T11:44:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5f888402"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5l3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_178954805_*|*_1_*:*_1_*:*_218707_*|*_10007_*:*_1_*:*_66644539_*|*_3_*:*_1_*:*_12981197_*|*_5_*:*_1_*:*_0"}], "description": "For some performance testing scenarios, we have a need to disable the default Gzip encoding that the tk-jetty9 service configures for a Jetty server.  An option should be added to the webserver configuration to configure whether or not Gzip encoding can be used, with the default for compatibility being \"true\".", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10413", "fixedVersions": [], "id": "10413", "issueType": "New Feature", "key": "TK-75", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-09-08T11:37:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add an option to the tk-jetty9 service to disable gzip", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-04T13:29:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7b2159eb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyporr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_104364_*|*_1_*:*_1_*:*_344448928_*|*_10007_*:*_1_*:*_250516446_*|*_3_*:*_1_*:*_5184769_*|*_5_*:*_1_*:*_0"}], "description": "clojure.lang.ExceptionInfo: Input to init does not match schema: [nil (named (not (map? nil)) config)]\n at puppetlabs.trapperkeeper.services.webrouting.webrouting_service_core$eval23053$init__23054.invoke (webrouting_service_core.clj:75)\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10336", "fixedVersions": [], "id": "10336", "issueType": "Bug", "key": "TK-74", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Fixed", "resolutionDate": "2014-09-11T12:13:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "missing webrouting config gives opaque message", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-03T14:33:00.000000", "creator": "6361cbfc59c794184bcbd33a", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6acd1b5f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5kn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6333750_*|*_10007_*:*_1_*:*_169767168_*|*_3_*:*_1_*:*_71660043_*|*_5_*:*_1_*:*_0"}], "description": "The static-content setting serves files and directories properly, but doesn't follow symlinks.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10248", "fixedVersions": [], "id": "10248", "issueType": "Task", "key": "TK-73", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6361cbfc59c794184bcbd33a", "resolution": "Fixed", "resolutionDate": "2014-09-06T11:22:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support symlinks when serving static content with jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] here's one you could pull in if you get bored :)", "created": "2014-09-02T18:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-09-02T17:52:00.000000", "creator": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@448d81b5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyporz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "03/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_90103_*|*_1_*:*_1_*:*_501462965_*|*_10007_*:*_1_*:*_250391530_*|*_3_*:*_1_*:*_5320051_*|*_5_*:*_1_*:*_0"}], "description": "When I leave a service out of the webrouting config it says this:\nCaused by: java.lang.IllegalArgumentException: specified service or endpoint does not appear in configuration file\n\tat puppetlabs.trapperkeeper.services.webrouting.webrouting_service_core$get_endpoint_and_server_from_config.invoke(webrouting_service_core.clj:48)\n\nIt would be helpful to know which service.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10335", "fixedVersions": ["TK-JETTY9 0.7.6"], "id": "10335", "issueType": "Bug", "key": "TK-71", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "resolution": "Fixed", "resolutionDate": "2014-09-11T12:13:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "webrouting service should specify which service it failed to find", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-02T14:59:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1dd7ff4e"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5kf:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_69581777_*|*_10007_*:*_1_*:*_257578256_*|*_3_*:*_1_*:*_4807483_*|*_5_*:*_1_*:*_0"}], "description": "We need a webrouting service example that does two things:\n\n1. Is path-specific. A handler should be added that actually cares about what path it gets\n2. Uses compojure.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10207", "fixedVersions": [], "id": "10207", "issueType": "Improvement", "key": "TK-69", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-09-06T11:12:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add path-sensitive webrouting example using compojure", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-09-02T11:47:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1a99eebc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5k7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_11192017_*|*_1_*:*_1_*:*_98277_*|*_10007_*:*_1_*:*_66897698_*|*_3_*:*_1_*:*_20260212_*|*_5_*:*_1_*:*_0"}], "description": "There will be many cases where static content will need to be added to a server, but writing an entire new service to do this is inconvenient and unnecessary. The Jetty9 Webservice should have support for a new configuration section that specifies static content to be added before server start-up.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10334", "fixedVersions": [], "id": "10334", "issueType": "New Feature", "key": "TK-68", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-09-03T15:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Allow user to specify static content in config file in Jetty9 Webservice", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Is it okay with you if I close this out? I think TK-79 and TK-86 cover this issue.", "created": "2014-10-17T16:01:00.000000"}, {"author": "623e7507866b810069e57527", "body": "And this and TK-86 seem like duplicates.", "created": "2014-10-17T16:01:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I think there are some other jetty-specific ones that have more concrete examples of how to get a schema error like this.  If you find one of those and link this to it as a dupe, I'm good with closing this.\n\nI think TK-86 is a superset of this though and could be a whole lot of work.  We may decide to make some more incremental improvements to the tk-j9 error messages before we dive all the way in for tk-86, so I do think it's worth keeping a few of the smaller tickets around.", "created": "2014-10-17T18:13:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T10:02:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-29T16:21:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@16c970db"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywiun:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_3895863081_*|*_3_*:*_1_*:*_83513333_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_233428660645"}], "description": "I've been hearing that it's too easy to end up with an exception like this in tk-j9:\n\n{quote}\nactual: clojure.lang.ExceptionInfo: Input to register-endpoint! does not match schema: [nil (named {:endpoint (not (instance? java.lang.String a-ring.util.servlet.proxy$javax.servlet.http.HttpServlet$ff19274a))} endpoint)]\n{quote}\n\nwe need to add some pre-schema validation to give a better error message here.  will add comments with repro scenario shortly, tracking down some more info.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10659", "fixedVersions": ["TK-JETTY9 1.y"], "id": "10659", "issueType": "Bug", "key": "TK-67", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Fix", "resolutionDate": "2022-03-08T10:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "improve error handling for tk-j9", "timeSpent": "PT0S", "updated": "2022-03-08T10:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:6243b375fd5e4500704351c5] you found a workaround for this, right?  We decided we don't need to do anything for now?", "created": "2014-09-30T17:20:00.000000"}, {"author": "6243b375fd5e4500704351c5", "body": "Yep, we've a workaround at https://github.com/puppetlabs/pe-classifier-ui/blob/3.4.x/src/puppetlabs/classifier_ui/routes.clj#L80-L88 but I think this is something we want to fix long term. Browsers and clj-http just ignore the body of DELETE requests.", "created": "2014-10-02T10:36:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-28T10:20:00.000000", "creator": "6243b375fd5e4500704351c5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@639215f5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu9b:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4003947007_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_859033298_*|*_10005_*:*_1_*:*_232653112668"}], "description": "{code}\npuppetlabs.trapperkeeper.main=> (http/delete \"http://www.example.org\" {:body \"boom\"})\n\nIllegalArgumentException No matching method found: setEntity for class org.apache.http.client.methods.HttpDelete  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10412", "fixedVersions": [], "id": "10412", "issueType": "Bug", "key": "TK-66", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6243b375fd5e4500704351c5", "resolution": "Won't Fix", "resolutionDate": "2022-03-08T10:01:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HTTP client throws exception if DELETE is called with :body", "timeSpent": "PT0S", "updated": "2022-03-08T10:01:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "attachments": [], "comments": [{"author": "6243b375fd5e4500704351c5", "body": "you might want to move this in to the trapperkeeper project so they can keep an eye on it", "created": "2014-08-28T10:07:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:0cc28489-f549-4a27-8863-54f5ed261a77] - I'm not clear on what you're asking for from Trapperkeeper here.  Your proposal sounds more like it is focused on how to write clojure code that deals with failed HTTP requests.  Is there some functionality in Trapperkeeper that you would like to see added/fixed/changed to address this?", "created": "2014-10-08T10:58:00.000000"}, {"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] I hope this will help:\n\nh3. Real life example:\n\nIn current PE installation, when I turn off pe-postgresql service and request `https://master.vagrant.internal/rbac/rbac-api/v1/users`, I get just 500 error with some cryptic message. I have no clue which service returned this error.\n\nh3. Proposal:\n\n{code:title=Request}\nGET /rbac/ HTTP/1.1\nHost: master.vagrant.internal\n...\n{code}\n\n{code:title=Response}\nStatus Code:200 OK\n\n# HTTP response body\n{\n    # Nested HTTP request\n    \"http_request\": {\n        \"Request URL\": \"http://localhost:4432/rbac-api/v1/users\",\n        \"Request Method\": \"GET\"\n    },\n    # Nested HTTP response\n    \"http_response\": {\n        \"StatusCode\": \"HTTP/1.1 500 Server Error\",\n        \"Payload\": {\n            \"msg\": \"Server error: Broken pipe\"\n            # There might be also http_request, http_response fields, when nesting is deeper\n        }\n    }\n}\n{code}\n\nThis way I can at least know what URL/application is returning the error.  Especially handy when there's more than one level of nesting.\n\nI'm not sure whether this can be done on TK level. But I think TK might help by providing unified way (function) for:\n# calling these HTTP requests - I believe there is such function already\n# sending reponse back to caller with all the needed info extracted from the request just called. That is: \"Packing\" subquery response to our response body.", "created": "2014-10-09T03:07:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "{quote}\ncalling these HTTP requests - I believe there is such function already\n{quote}\nI'm not sure exactly what you mean by this ... however, we have this thing: https://github.com/puppetlabs/clj-http-client ... which is what most (all?) of our TK apps are using for an http client.\n\n{quote}\nsending reponse back to caller with all the needed info extracted from the request just called. That is: \"Packing\" subquery response to our response body.\n{quote}\nIt sounds like what you're getting at here is some sort of reusable function(s) that generate specific kinds of HTTP responses when an error occurs.  A few thoughts on this:\n* First of all - it doesn't seem appropriate for the client to get a 200 when the service it's talking to got a 500 from some other service.\n* This is likely something that could be partially addressed by a ring middleware that catches exceptions and produces a certain kind of response based on the caught exception.  I am sure that something like this exists already ... for instance, http://mmcgrana.github.io/ring/ring.middleware.stacktrace.html.  If we decide we want to implement something similar, we have https://github.com/puppetlabs/ring-middleware, which would be the correct place for such a thing to go.  This seems like the most likely path forward on this issue ... however, it's still not clear to me *exactly what* such a middleware should do.  If you can define specific functionality that you want implemented, we can go from there.\n* However, all of that said, I imagine that many services will want to generate specific error responses, and there's not really a \"silver bullet\" here that doesn't already exist in some open-source library.", "created": "2014-10-09T11:56:00.000000"}, {"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "bq. First of all - it doesn't seem appropriate for the client to get a 200 when the service it's talking to got a 500 from some other service.\n\nYes, sorry for that. It should not be 200. I was not really focusing on this part.\n\nbq. wrap-stacktrace\n\nSeems interesting, but from the manual I cannot tell what does it exactly do. \n\nbq. it's still not clear to me exactly what such a middleware should do\n\nMaybe I started this wrong by proposing a solution. Maybe explaining the goal will help better. I don't want to assume, that it should be done by enhancement in trapperkeeper. Maybe there is needed enhancement in ring-middleware ... I cannot really tell.\n\nUser story: When I'm using any of our clojure applications, I get from time to time some HTTP error response with some cryptic error message in the response body (let's assume we cannot force all programmers to write meaningful error messages). I as a user have absolutely no clue which service failed first. There are multiple of them in the calling chain and any of it should be the source of troubles.\n\nImho the point which should handle this problem is the one which does the HTTP call and can see the result. So I guess it is ring-middleware? To enhance the function which does the HTTP call? Or we would have to use wrap-stacktrace function in all implementation places?\n\nI thought that best result would be that the middleware always adds some useful information to the response body:\n\nbq. Hello, I'm service XY, I got this weird response [HTTP response body, HTTP response code (or whole HTTP response?)] when calling following HTTP request [HTTP request - the one I called] and I'm returning this report as a response to following HTTP request [HTTP request - the one I've been called with] to parent service\n\nOr the JSON structure mentioned above. Or whatever...\n\nBut (as mentioned before) I can imagine that this would not be doable as each service might want to use the body for it's own purposes. In that case I think the only option is to log such cases. But I'm not sure whether it would be possible to log it all in one place?\n\nWell, this is just a proposal. I was hit by this problem many times - usually after rebase. And I wanted to have some clear way to tell which service is complaining. Which I'm not able to do now. If there's no idea how to achieve this, then ... I guess I have to deal with it :(", "created": "2014-10-10T08:47:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "bq. Maybe I started this wrong by proposing a solution. Maybe explaining the goal will help better. I don't want to assume, that it should be done by enhancement in trapperkeeper. Maybe there is needed enhancement in ring-middleware ... I cannot really tell.\n\nI agree with your overall goal that error responses should be informative in the case of an unexpected error / HTTP 500.  And yeah, I think that if there's anything reusable we can create here, it probably belongs in ring-middleware.  For now, though, I still don't know *exactly* what that middleware should do.\n\nbq. Imho the point which should handle this problem is the one which does the HTTP call and can see the result.\n\nAgreed.\n\nbq.  So I guess it is ring-middleware? To enhance the function which does the HTTP call? Or we would have to use wrap-stacktrace function in all implementation places?\n\nA middleware would be one way to solve this, yes.  It could be {{wrap-stacktrace}}, or something new that we add to ring-middleware.  I also imagine that in certain cases, a service would want to have its own, custom/service-specific error-handling middleware.\n\nbq. I was hit by this problem many times - usually after rebase. And I wanted to have some clear way to tell which service is complaining. Which I'm not able to do now. If there's no idea how to achieve this, then ... I guess I have to deal with it \n\nI totally understand your pain, and I think it's a valid problem.  However, for the most part, the solution to that problem is simply that *ring applications should be written with proper error-handling*.  I don't think there's any \"silver bullet\" here that we can put in TK that \"just solves this\".  I think this is a really good discussion to be having, but I still don't think we've come up with anything actionable at this point.\n  I think the solution you're looking for falls more into the realm of 'dev best practices'.", "created": "2014-10-10T12:35:00.000000"}, {"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "Ok, glad to have this discussion. Is there anything we can do now? I don't think there is any \"dev best practices\" guideline, right?", "created": "2014-10-13T07:48:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "As a matter of fact, there is!\n\nhttps://confluence.puppetlabs.com/display/ENG/Clojure\n\nThat seems like a perfect place to add something like this.\n\nI'm going to close this ticket out (for now, anyway) since there doesn't seem to be any work to be done at the moment.  But, feel free to bring up the issue again in the future if you find something that you think should be added into ring-middleware or TK.", "created": "2014-10-13T11:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-28T00:03:00.000000", "creator": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4c09bdae"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyw3s7:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "28/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_3671609905_*|*_6_*:*_1_*:*_0_*|*_10004_*:*_1_*:*_343988908"}], "description": "During my work on trappekeeper based projects I got to this scenario of HTTP request:\n\n* web page queries TK-A frontend server\n* TK-A server asks TK-B server for data\n* TK-B asks TK-C for additional data\n* Somewhere in this chain a HTTP:502 (bad gateway) is generated (without anything in response body). And I have absolutely no idea what service (TK-A, TK-B or TK-C) generated that error.\n\nI don't think that \"ok\" responses might be problematic. I believe that only error responses should be treated with caution.\n\nOne possible solution is to fix such cases and to make sure that all places which returns HTTP error response also flushes some useful information like: \"Hello, I'm service XY, I got this weird response [HTTP response body, HTTP response code (or whole HTTP response?)] when calling following HTTP request [HTTP request - the one I called] and I'm returning this report as a response to following HTTP request [HTTP request - the one I've been called with] to parent service\". \n - Pro is that we can be very verbose and put everything needed here.\n - Pro is that it should be imho easy to implement it in Clojure once and copy-paste it to all existing Clojure apps.\n - Pro is that this can stack. When one service fails because other one fails, we can still see the stack and find the original problem.\n - Con is that caller has to have this behavior implemented and has to follow it. Otherwise it's not working.\n - Con is that some services might want to use HTTP response body to tell something to caller. So we should also handle these cases as well and not only blindly dump error stack trace.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10658", "fixedVersions": [], "id": "10658", "issueType": "Story", "key": "TK-70", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "resolution": "Won't Fix", "resolutionDate": "2014-10-13T11:30:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "HTTP error stack trace proposal", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-26T16:57:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1afc5795"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywubb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4153162240_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858794218_*|*_10005_*:*_1_*:*_231125438590"}], "description": "With the changes introduced in trapperkeeper-webservices-jetty9 0.7.2 release, an `ssl-cert-chain` can be configured to add a cert chain along with the primary server cert into a KeyStore.  The SSL setup for the ProxyServlet (add-proxy-route) should automatically inherit the ability to use this setting as well, although we haven't tested to see what effect this actually has.  It could be that that if a chain were configured that the full chain would be presented by the proxy client to the server during the SSL handshake.\n\nThis ticket would just cover investigating what the behavior would be if the proxy client were to configure a certificate chain.  It would be good to update documentation in the project based on the outcome of the investigation.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10657", "fixedVersions": [], "id": "10657", "issueType": "Task", "key": "TK-65", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:40:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate effect of `ssl-cert-chain` setting on tk-jetty9 `add-proxy-route`", "timeSpent": "PT0S", "updated": "2022-02-18T17:40:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-26T16:03:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@13129b6a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypnh3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_6126943_*|*_1_*:*_1_*:*_4156158844_*|*_10007_*:*_1_*:*_318193650_*|*_3_*:*_1_*:*_7450261_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_591459854"}], "description": "For any cases where a Trapperkeeper-based service throws an Exception up the stack which is caught by Trapperkeeper's main() function and is not of a specific type -- cli-error or cli-help -- the failure message / trace on the command line looks a little strange.\n\nFor example:\n\n{noformat}\nBlah, blah, blah message\nException in thread \"main\" java.lang.IllegalArgumentException: No matching clause: :blah-type\n\tat puppetlabs.trapperkeeper.core$main.doInvoke(core.clj:164)\n\tat clojure.lang.RestFn.invoke(RestFn.java:457)\n\tat clojure.lang.Var.invoke(Var.java:427)\n{noformat}\n\nThe \"...IllegalArgumentException: No matching clause: ...\" part is what looks strange to me.  This appears to be due to not having an else for the case call from the main function:\n\nhttps://github.com/puppetlabs/trapperkeeper/blob/master/src/puppetlabs/trapperkeeper/core.clj#L164\n\nCould be nice to implement an else statement with some friendlier error message text.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10206", "fixedVersions": ["TK 1.0.0"], "id": "10206", "issueType": "Task", "key": "TK-64", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-10-24T11:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK failures from Slingshot exceptions look weird on the command line", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "With latest patches in pe-classifier-ui, the error looks like this in web browser:\n\n{code}\nHTTP ERROR: 500\n\nProblem accessing /node_groups/classifier-api/v1/environments. Reason:\n\n    java.lang.NullPointerException\nPowered by Jetty://\n{code}\n\nAnd like this in console:\n\n{code}\njava.lang.NullPointerException: null\n        at java.net.URI$Parser.parse(URI.java:3023) ~[na:1.7.0_55]\n        at java.net.URI.<init>(URI.java:595) ~[na:1.7.0_55]\n        at puppetlabs.ring_middleware.core$wrap_proxy$fn__10421.invoke(core.clj:18) ~[na:na]\n        at ring.middleware.cookies$wrap_cookies$fn__8554.invoke(cookies.clj:171) ~[na:na]\n        at puppetlabs.ring_middleware.core$wrap_proxy$fn__10421.invoke(core.clj:38) ~[na:na]\n        at ring.middleware.cookies$wrap_cookies$fn__8554.invoke(cookies.clj:171) ~[na:na]\n        at puppetlabs.classifier_ui.routes$wrap_remove_delete_body$fn__10475.invoke(routes.clj:157) ~[na:na]\n        at ring.middleware.anti_forgery$wrap_anti_forgery$fn__8769.invoke(anti_forgery.clj:90) ~[na:na]\n        at ring.middleware.session$wrap_session$fn__8679.invoke(session.clj:85) ~[na:na]\n        at compojure.core$routing$fn__6849.invoke(core.clj:107) ~[na:na]\n        at clojure.core$some.invoke(core.clj:2515) ~[clojure-1.6.0.jar:na]\n        at compojure.core$routing.doInvoke(core.clj:107) ~[na:na]\n        at clojure.lang.RestFn.invoke(RestFn.java:423) ~[clojure-1.6.0.jar:na]\n        at puppetlabs.classifier_ui.service$reify__10493$f_positional__10500$fnk10509_positional__10510$fn__10511$fn__10512.invoke(service.clj:13) ~[na:na]\n        at compojure.core$wrap_context$fn__6903.invoke(core.clj:165) ~[na:na]\n        at compojure.core$if_route$fn__6827.invoke(core.clj:40) ~[na:na]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$ring_handler$fn__21127.invoke(jetty9_core.clj:289) ~[na:na]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source) ~[na:na]\n        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1112) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1048) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.servlets.gzip.GzipHandler.handle(GzipHandler.java:275) ~[jetty-servlets-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.Server.handle(Server.java:459) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:280) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505) [jetty-io-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n        at java.lang.Thread.run(Thread.java:744) [na:1.7.0_55]\n{code}\n\nWhich is also not very helpful.", "created": "2014-09-03T07:13:00.000000"}, {"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "Moved to TK project, as it seems like more logical place.", "created": "2014-09-03T07:15:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:0cc28489-f549-4a27-8863-54f5ed261a77] - Here we go again!  :)\n\nThe two errors you posted seem independent of each other.  The first one would be addressed by adding better configuration validation / error handling into the classifier (for the time being, anyway - long-term, we are considering adding something like that into TK - see TK-86), so that change would go into classifier, not TK.\n\nThe NullPointerException doesn't seem related to this at all.  Are you still dealing with that?", "created": "2014-10-14T09:25:00.000000"}, {"author": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] if I remember that correctly both of the problems occured when there was \"something bad\" in my configuration. Some block was missing, or just some directive(variable). This ticket in general is meant for meaningful error messages when there is some glitch in configs.\n\nAnd looking into TK-86, I think that one covers this whole story. So I guess this should be closed as duplicate?\n\nI cannot reproduce the scenario from ticket topic, because there is no \"rbac-api-path\" directive now. But trying it for example with commented out \"rbac-server\", I get:\n\n{code}\n...\n2014-10-15 08:33:21,467 WARN  [p.r.h.middleware] GET /rbac/rbac-api/v1/users/current java.lang.NullPointerException: null\n                      Reflector.java:26 clojure.lang.Reflector.invokeInstanceMethod\n                          common.clj:21 puppetlabs.ring-middleware.common/strip-trailing-slash\n                          common.clj:31 puppetlabs.ring-middleware.common/proxy-request\n                        RestFn.java:467 clojure.lang.RestFn.invoke\n                            core.clj:16 puppetlabs.ring-middleware.core/wrap-proxy[fn]\n                        cookies.clj:171 ring.middleware.cookies/wrap-cookies[fn]\n                         routes.clj:127 puppetlabs.rbac-ui.routes/wrap-remove-delete-body[fn]\n                    anti_forgery.clj:90 ring.middleware.anti-forgery/wrap-anti-forgery[fn]\n                         session.clj:85 ring.middleware.session/wrap-session[fn]\n                      middleware.clj:70 puppetlabs.rbac.services.http.middleware/execute-handler[fn]\n                            AFn.java:18 clojure.lang.AFn.call\n                SubjectCallable.java:90 org.apache.shiro.subject.support.SubjectCallable.doCall\n                SubjectCallable.java:83 org.apache.shiro.subject.support.SubjectCallable.call\n                      middleware.clj:70 puppetlabs.rbac.services.http.middleware/execute-handler\n                     middleware.clj:137 puppetlabs.rbac.services.http.middleware/handle-web-access\n...\n{code}", "created": "2014-10-15T02:38:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Again, that error message looks like something that the RBAC service should be handling - validating configuration at startup, and failing-fast if it's invalid/absent.\n\nAgreed that the original intent of this ticket is a duplicate of TK-86.", "created": "2014-10-15T10:53:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-25T14:34:00.000000", "creator": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@185ec244"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyw21z:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4393151491_*|*_6_*:*_1_*:*_0"}], "description": "When I comment out some random configuration directive in rbac-ui configs. For example in: conf.d/rbac-ui.conf comment out: rbac-api-path and you will get:\n\n{code}\n1 vagrant@classifier:/vagrant/src/pe-classifier-ui\u27eb lein dev\nListening for transport dt_socket at address: 4000\n2014-08-22 04:38:38,061 INFO  [p.t.s.w.jetty9-core] Removing buggy security provider SunPKCS11-NSS version 1.7\n2014-08-22 04:38:39,441 INFO  [p.t.s.w.jetty9-service] Initializing web server(s).\n2014-08-22 04:38:40,135 INFO  [m.core] Starting migrations\n2014-08-22 04:38:40,373 INFO  [m.core] Ending migrations\n2014-08-22 04:38:40,592 INFO  [p.r.service] Initializing rbac ui webservice at http://:/rbac\n2014-08-22 04:38:40,594 INFO  [p.c.service] Initializing classifier ui webservice at http://0.0.0.0:9876\n2014-08-22 04:38:40,612 ERROR [p.t.internal] Error during service init!!!\nclojure.lang.ExceptionInfo: Input to register-endpoint! does not match schema: [nil (named (not (some (check % a-clojure.lang.PersistentArrayMap) schemas)) endpoint)]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$eval19128$register_endpoint_BANG___19129.invoke(jetty9_core.clj:334) ~[na:na]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$eval19552$add_ring_handler_BANG___19553$fn__19554.invoke(jetty9_core.clj:704) ~[na:na]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$eval19552$add_ring_handler_BANG___19553.invoke(jetty9_core.clj:697) ~[na:na]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_service$reify__19860$f_positional__19865$fnk19874_positional__19875$fn__19876.invoke(jetty9_service.clj:23) ~[na:na]\n        at puppetlabs.classifier_ui.service$reify__9417$f_positional__9424$fnk9433_positional__9434$fn__9435.invoke(service.clj:20) ~[na:na]\n{code}\n\nI think we definetelly should give some clearer message what happened and what the user should do. The message to the user is confusing.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10333", "fixedVersions": [], "id": "10333", "issueType": "Story", "key": "TK-72", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "resolution": "Duplicate", "resolutionDate": "2014-10-15T10:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Nicer clojure config error messages", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-24T06:11:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6acad527"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5pr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_7808463_*|*_1_*:*_1_*:*_90267_*|*_10007_*:*_1_*:*_114621158_*|*_3_*:*_1_*:*_287579_*|*_5_*:*_1_*:*_0"}], "description": "In version 0.5.0, if you try to use `defservice` with a protocol that is defined in a different namespace from the `defservice` statement, trapperkeeper will throw a weird error.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10446", "fixedVersions": [], "id": "10446", "issueType": "Bug", "key": "TK-62", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-08-25T16:18:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "defservice doesn't work with protocols from different namespaces", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:d2f4e3cd-249f-4cc2-8a57-23433aeefb52", "body": "If you run trapperkeeper with --config and it can't read that config it seems like it should log an error and exit non-zero", "created": "2016-02-29T14:00:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-22T15:35:00.000000", "creator": "557058:3a3de6c6-95b1-47b3-a52a-6a6865ff9241", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@36dad2f7"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywunz:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "29/Feb/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4503467984_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858982147_*|*_10005_*:*_1_*:*_232652439094"}], "description": "Using puppet-server as an example, when a config file in\n/etc/puppetserver/conf.d is not readable by the user who owns the java process\nunder which puppet-server is run the Trapperkeeper Config Service moves on to\nthe next config file without warning that it encountered a file which could not\nbe read.\n\nThis leads to a somewhat difficult to troubleshoot problem later on when some\nother trapperkeeper service attempts to use a value provided by that config file\nbut can't find it.\n\nAn even more difficult to troubleshoot situation would be one in which that\nconfig value falls back to an acceptable default instead of failing when it\ncan't find the one provided by the user config file. This is more difficult\nbecause rather than the entire service stack failing loudly there may simply be\nsubtle behavioral differences that go undetected until something bad happens,\npossibly days/weeks/months after the config change.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10574", "fixedVersions": [], "id": "10574", "issueType": "Bug", "key": "TK-61", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:3a3de6c6-95b1-47b3-a52a-6a6865ff9241", "resolution": "Won't Do", "resolutionDate": "2022-03-08T09:50:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Trapperkeeper Config Service should log a warning when a file in the config directory is not readable.", "timeSpent": "PT0S", "updated": "2022-03-08T09:50:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-20T12:08:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4db8b94b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywunr:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4688679528_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858971115_*|*_10005_*:*_1_*:*_67569588527"}], "description": "TK has a ton of pre- and post-conditions that would be much cleaner if they were expressed via prismatic/schema.  In particular, the macro implementation, although this may apply elsewhere too.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10318", "fixedVersions": [], "id": "10318", "issueType": "Improvement", "key": "TK-59", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Done", "resolutionDate": "2016-12-13T17:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "schematize Trapperkeeper implementation", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-19T17:34:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@448d40fe"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5on:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_348120_*|*_10007_*:*_1_*:*_78535361_*|*_3_*:*_1_*:*_647040_*|*_5_*:*_1_*:*_0"}], "description": "I've just noticed going through the Jetty9 Webservice code that the default-server support is not present for anything other than the add-handler functions. `override-webserver-settings!`, `get-registered-endpoints`, `log-registered-endpoints`, and `join` all still use the `:default` key for the default server, but instead they should be using the default server specified by the user.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10648", "fixedVersions": [], "id": "10648", "issueType": "Bug", "key": "TK-58", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-20T15:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Default server support not present for non-handler service functions in Jetty9 Webservice", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-19T15:33:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@cac701b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu9j:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4762836455_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858958613_*|*_10005_*:*_1_*:*_231125333128"}], "description": "This is an extension of TK-55. In the situation detailed in TK-55, the main method was being called twice, and then after the Address Bind Error exception was thrown, the leiningen run would hang, and the only way to get out of it was to kill the process. Upgrading to leiningen 2.4.x eliminates the main method being called twice. However, the initial File Not Found exception is still thrown, and after this the lein run still hangs.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10205", "fixedVersions": [], "id": "10205", "issueType": "Bug", "key": "TK-57", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Cannot Reproduce", "resolutionDate": "2022-02-18T17:38:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Error in multiserver setup start-up causes lein run to hang", "timeSpent": "PT0S", "updated": "2022-02-18T17:38:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-18T15:27:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2c62cff3"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypzpr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2679493_*|*_1_*:*_1_*:*_2063898878_*|*_10007_*:*_1_*:*_342818541_*|*_3_*:*_1_*:*_1082961_*|*_5_*:*_1_*:*_0"}], "description": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] reported that when they had a service that did not have a protocol, and it had an improperly defined TK lifecycle function, they got this error message:\n\n```\n0:57:22.095 [main] ERROR puppetlabs.trapperkeeper.internal - Encountered error during shutdown sequence\njava.lang.IllegalStateException: Lifecycle function 'stop' for service ':tk-service17272' must return a context map (got: nil\n```\n\nHe pointed out that in an app with lots of TK services, this message doesn't immediately make it very clear which service is the offender.\n\nIt seems like, now that we have `service-symbol`, we should be able to call that and include the output in the error message, which ought to improve this situation at least a bit.\n", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10247", "fixedVersions": [], "id": "10247", "issueType": "Improvement", "key": "TK-56", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-09-15T13:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "call 'service-symbol' in error message for lifecycle functions", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [{"attacher": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "created": "2014-08-18T14:53:00.000000", "name": "activity.conf", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10037"}, {"attacher": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "created": "2014-08-18T14:53:00.000000", "name": "classifier.conf", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10050"}, {"attacher": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "created": "2014-08-18T16:59:00.000000", "name": "output", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10051"}, {"attacher": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "created": "2014-08-18T14:53:00.000000", "name": "project.clj", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10023"}, {"attacher": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "created": "2014-08-18T14:53:00.000000", "name": "webserver.conf", "uri": "https://puppet.atlassian.net/rest/api/3/attachment/content/10065"}], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": ":(\n\nOK, this one sounds fairly urgent.", "created": "2014-08-18T14:28:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "Like I said though, I tried adding the same failure to the example multiserver app in tk-w-j9 and I couldn't reproduce the problem. So it's probably not as simple as the description, and could be due to something bad in one of the components my set is using. I will attach configs.", "created": "2014-08-18T14:46:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "I think all the relevant files. The project.clj (this is from a staging dir of an ezbake build) and the contents of conf.d.", "created": "2014-08-18T14:53:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "Also when I was trying to figure this out I found the error messages don't tell you what webserver configuration is failing. There's an info message that says starting server, but it doesn't say which server it's starting. I had to add a bunch of print debugging just to realize what was even happening.", "created": "2014-08-18T15:13:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "full log", "created": "2014-08-18T16:59:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I'm going to look into this more, but currently it looks like this is a leiningen issue. I was running leiningen 2.4.2 and couldn't reproduce this (I'd get a File Not Found exception after the shutdown and then the run would just hang forever). \n\nHowever, downgrading to leiningen 2.3.4, which is the version that [~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] is running and the version that [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] was running when he encountered TK-6, shows the expected behavior wherein the servers are all started a second time. This makes me think that both this ticket and TK-6 are caused by something in leiningen.", "created": "2014-08-18T17:51:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "[~accountid:623e7507866b810069e57527] Can we find out what the behavior is when deployed as a jar and run with java? Since there's no leiningen involved then I'd expect it's fine but I want to make sure. I'm mostly concerned about this happening to users. ", "created": "2014-08-19T15:32:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] Both this issue and TK-57 are not occurring when the project is bundled into a jar and run with Java. Are you okay with me closing this out?", "created": "2014-08-19T16:18:00.000000"}, {"author": "557058:40232c77-9d9b-410c-9f53-90adbf41eeb9", "body": "Yeah that's fine.", "created": "2014-08-19T20:52:00.000000"}, {"author": "623e7507866b810069e57527", "body": "This bug isn't present from leiningen 2.4.0 onwards, and it's also not present when bundled into a jar and run with java, so I'm closing out this ticket.", "created": "2014-08-20T14:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-18T14:18:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@31ed40b9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5nr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2415029_*|*_3_*:*_1_*:*_171622539_*|*_6_*:*_1_*:*_0"}], "description": "[~accountid:557058:40232c77-9d9b-410c-9f53-90adbf41eeb9] reported that, in a multi-server setup, an error in one webserver configuration can cause tk to start all the webservers a second time, leading to \"address already in use\" errors. In the incident in question, the specified pem file did not exist. \n\nIt is likely that the nonexistent file is what caused the error to occur. It's also possible that this ticket is related to the issue detailed in TK-6.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10330", "fixedVersions": [], "id": "10330", "issueType": "Bug", "key": "TK-55", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-20T14:38:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Error in webserver config in multiserver setup causes servers to be started a second time", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-18T12:30:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@779fed1c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypzpb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_254139863_*|*_1_*:*_1_*:*_2074055085_*|*_10007_*:*_1_*:*_85630407_*|*_5_*:*_1_*:*_0"}], "description": "Currently, due to the use of schema/either, the Trapperkeeper Jetty9 Webservice will output an extremely unpleasant error message when more than one default servers are specified. This should be cleaned up.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10309", "fixedVersions": ["TK-JETTY9 0.7.6"], "id": "10309", "issueType": "Improvement", "key": "TK-54", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-09-15T11:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Fix error message when more than one default servers are present", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-18T12:30:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": ["Emerald"]}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@140c393f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyp51r:"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_1831310401_*|*_1_*:*_1_*:*_5650006658_*|*_10007_*:*_1_*:*_753940419_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_69389753_*|*_10005_*:*_1_*:*_8212740478"}], "description": "see https://github.com/puppetlabs/puppet-server/pull/102#discussion_r16364948", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10246", "fixedVersions": ["JVM-SSL-UTILS 0.8.0"], "id": "10246", "issueType": "Bug", "key": "TK-181", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2015-02-25T15:40:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "bug in 'isSubtreeOf' method in jvm-ca", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-15T15:26:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2c2c98a8"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5mv:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_227605_*|*_10007_*:*_1_*:*_6812715_*|*_3_*:*_1_*:*_2248395_*|*_5_*:*_1_*:*_0"}], "description": "Currently, the webrouting service has no way to retrieve a web-route for a particular service. However, there are times in a trapperkeeper service where the web-route may need to be accessed outside of adding a handler. As such, an add-route function should be added to the webrouting service.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10474", "fixedVersions": [], "id": "10474", "issueType": "Improvement", "key": "TK-53", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-15T18:00:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add get-route function to Webrouting Service", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-14T11:10:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@b36c267"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5nj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_10330370_*|*_1_*:*_1_*:*_344690164_*|*_10007_*:*_1_*:*_176553231_*|*_3_*:*_1_*:*_2910797_*|*_5_*:*_1_*:*_0"}], "description": "Currently, when specifying multiple webroutes for a service in the configuration for the Webrouting Service, the user is required to have a webroute with id of :default for that service. This was required so that the user would be able to use the versions of functions without a route-id specified when adding handlers to endpoints even if multiple routes were configured.\n\nHowever, this requirement seems unnecessary, and so should be removed. Instead, an exception should be thrown if a user does not specify a route-id when adding a handler with a service that has multiple web routes configured.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10472", "fixedVersions": [], "id": "10472", "issueType": "Improvement", "key": "TK-52", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-20T15:38:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Remove :default endpoint requirement in Webrouting Service", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-12T16:12:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@56497b6c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5mn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_189085_*|*_1_*:*_1_*:*_6145880_*|*_10007_*:*_1_*:*_5590762_*|*_3_*:*_1_*:*_149981840_*|*_5_*:*_1_*:*_0"}], "description": "Currently the user has to hard-code the server-id to which they want to add a handler when adding the handler. This information should live in the configuration file. For each endpoint, the webrouting configuration should not only include the endpoint itself, but also the id of the server to which the endpoint should be added.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10647", "fixedVersions": [], "id": "10647", "issueType": "Improvement", "key": "TK-51", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-14T13:10:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Specify server-ids for endpoints in the webrouting configuration", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-12T16:05:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@668b6c01"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5mf:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_836050_*|*_1_*:*_1_*:*_784279_*|*_10007_*:*_1_*:*_155048899_*|*_3_*:*_1_*:*_5444388_*|*_5_*:*_1_*:*_0"}], "description": "Currently, the Jetty9 Webservice requires you to have a server with id :default when configuring multiple services. A server with id :default should not be required. Instead, the user should be able to specify what server they want to be the default.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10656", "fixedVersions": [], "id": "10656", "issueType": "Improvement", "key": "TK-50", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-14T13:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "User should be able to specify which server should be the default", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "6243b375fd5e4500704351c5", "body": "I've seen this too - I think this only occurs when the proxy routes {{path}} option is empty", "created": "2014-08-12T10:07:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-12T08:53:00.000000", "creator": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4ee61096"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5nb:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_5942338_*|*_1_*:*_1_*:*_174344812_*|*_10007_*:*_1_*:*_7711689_*|*_3_*:*_1_*:*_25652_*|*_5_*:*_1_*:*_0"}], "description": "When trying to create proxy request from for a service, I get an issue with extra slash in URL. Example of proxy route registration. \n\n{code}\n(add-proxy-route {:host \"localhost\"\n                            :port 1262\n                            :path \"\"}\n                           (str url-prefix \"/foo\")\n                           (-> app-config\n                               :some_namespace-api-options\n                               fix-proxy-opts\n                               (assoc :server-id :some_namespace)))\n{code}\n\nThen when I access following URL in my application:\n\nhttp://localhost:9876/some_namespace/foo/v1/bar\n\nAbove proxy code creates call to:\n\nhttp://localhost:1262//v1/bar\n\nNotice the double slash.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10471", "fixedVersions": [], "id": "10471", "issueType": "Bug", "key": "TK-48", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:0cc28489-f549-4a27-8863-54f5ed261a77", "resolution": "Fixed", "resolutionDate": "2014-08-14T13:06:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Ambigous slash when building proxy URL", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "This issue was fixed as part of TK-50, so I'm closing it out.", "created": "2014-08-18T10:52:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-11T10:26:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3cc0be2b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyvstj:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_606425998_*|*_6_*:*_1_*:*_0"}], "description": "This seems like an unnecessary restriction to me.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10470", "fixedVersions": [], "id": "10470", "issueType": "Improvement", "key": "TK-49", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2014-08-18T10:53:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-jetty9 should not require a server named :default", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I don't think this is actually an overwrite, I think it's additive.  I believe there is a use-case in puppet-server where we actually rely on this behavior so that we can mount both the CA endpoints and the puppet-server endpoints at \"/\".  As long as your ring handler doesn't have a catch-all route in it, then if none of its routes are matched, Jetty should fall through to the next handler registered at this endpoint.\n\nSo I don't think that we can / want to try to get rid of this behavior.\n\nWe should check on the implementation of, e.g., \"get-registered-endpoints\", etc., though... because we may be overwriting the values that we're storing there, as opposed to adding additional values.  If that's the case we may need to change the data structure to support this.", "created": "2014-08-16T17:51:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] you saw the comment above, right?  That we don't really want to get rid of this behavior?  [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] is using it in a few places and I think that it's possible that some other teams are too.", "created": "2014-09-02T13:05:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] it looks like I missed that comment, sorry about that! Registering endpoints is additive and won't overwrite anything, so if it's alright with you I think we should just close out this ticket.", "created": "2014-09-02T14:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] so when I call `get-registered-endpoints`, that will handle the case where I've registered more than one at a single prefix?", "created": "2014-09-02T14:33:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Every time a handler is added, it constructs an endpoint map and registers it. The registration process consists of adding the endpoint map to a set. It should handle the case where you register more than one endpoint at a single prefix (since the endpoint map is a set, and if you are adding multiple handlers to an endpoint those handlers should have different maps).\n\nI've noticed though that in some cases there might not be enough information to differentiate two different handlers at a single endpoint. For example, the endpoint map registered by add-ring-handler will consist of two things, a :type key with value :ring and the endpoint itself under the :endpoint key. So, if you add two different ring handlers to the same endpoint, only one endpoint will end up being registered, since both will register the exact same endpoint and a set does not contain repeats. This can also happen with servlet handlers if two are added to the same endpoint and the servlets added both have the same type.\n\nIt might be worthwhile to add more information to both of these types of endpoints so that multiple handlers of these types added to the same endpoint can be differentiated from one another.", "created": "2014-09-02T14:50:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Yeah", "created": "2014-09-02T14:54:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I think a data structure change would be a good idea. Either way though, I think maybe some more data needs to be added to the :ring and :servlet type endpoints. I don't think it's super useful to the user to, say, add two ring handlers to a single endpoint and be able to access the information for both handlers, but have that information be identical.", "created": "2014-09-02T17:38:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "truth", "created": "2014-09-02T18:50:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-08T17:40:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@47444a13"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypzp3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "16/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_3793576_*|*_1_*:*_2_*:*_2833637223_*|*_10007_*:*_1_*:*_344877782_*|*_3_*:*_2_*:*_84122962_*|*_5_*:*_1_*:*_0"}], "description": "Currently, the same endpoint can be specified multiple times on the same server in the webserver service and webrouting service. You can add a handler to an endpoint on a server, then add a different handler to the same endpoint on the same server and the first handler will be overwritten.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10328", "fixedVersions": ["TK-JETTY9 0.7.6"], "id": "10328", "issueType": "Bug", "key": "TK-47", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-09-15T13:01:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Same endpoint can be specified multiple times in webserver and webrouting services", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:da659199-c749-426a-b5d9-6563e2c1710a] [~accountid:623a4493a2f6400069eaa844] ping", "created": "2014-08-21T12:27:00.000000"}, {"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "I think this is a noop, now we have moved certificate-whitelist into our own section away from [jetty] as discussed.", "created": "2014-09-28T07:34:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-08T12:02:00.000000", "creator": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@12eb4f4f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyvsfz:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "21/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4390297665_*|*_6_*:*_1_*:*_0"}], "description": "Upon attempting to upgrade to Trapperkeeper we've realised we have a feature in PuppetDB that is not coverred, namely 'certificate-whitelist':\n\nhttps://docs.puppetlabs.com/puppetdb/2.1/configure.html#certificate-whitelist\n\nIt works as a basic ACL mechanism to only allow named SSL certificates to access your web app.\n\nThis is provided here in PuppetDB with this starting code:\n\nhttps://github.com/puppetlabs/puppetdb/blob/master/src/com/puppetlabs/puppetdb/cli/services.clj#L322-L325\n\nNow as TK 0.6.0 now validates its input configuration, we no longer are able to just pass through this option to PuppetDB any more and handle it there. But after discussions with [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] we figure we might as well move the feature into TK so others can benefit from it, and hopefully improve on it.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10411", "fixedVersions": [], "id": "10411", "issueType": "New Feature", "key": "TK-46", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "resolution": "Won't Fix", "resolutionDate": "2014-09-28T07:34:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Port certificate whitelist handling from PuppetDB into trapperkeeper-webserver-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Yeah, this looks like a bug.  Thanks [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091], I assume you need us to fix this ASAP?", "created": "2014-08-08T13:48:00.000000"}, {"author": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] I've got a workaround for the moment (converting strings to keywords wooo), but a fix in the next few weeks would be great.", "created": "2014-08-08T13:57:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Okay, will do.  Thanks.", "created": "2014-08-08T14:48:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-07T22:58:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@15cce312"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5nz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "08/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_910438271_*|*_10007_*:*_1_*:*_24435435_*|*_3_*:*_1_*:*_1400475_*|*_5_*:*_1_*:*_0"}], "description": "{code}\nclojure.lang.ExceptionInfo: Input to add-proxy-route does not match schema: [nil nil nil (named {:scheme (not (#{:orig :http :https} \"https\"))} options)]\n        at puppetlabs.trapperkeeper.services.webserver.jetty9_core$eval5722$add_proxy_route__5723.invoke(jetty9_core.clj:481) ~[na:na]\n{code}\n\nI'm trying to set options for {{add-proxy-route}} in a config file, and it seems like the schema for the values for these options (for example, {{scheme}}) only matches keywords, whereas the values when read from the config file are strings: https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/c0fa5197fd089500f0194787796927d2cb0dab1d/src/puppetlabs/trapperkeeper/services/webserver/jetty9_core.clj#L71-L74\n\nI should be able to set these options (both {{scheme}} and {{ssl-config \"use-server-cfg\"}} in a config file and have them work without having to convert the values into keywords.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10646", "fixedVersions": [], "id": "10646", "issueType": "Bug", "key": "TK-45", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2014-08-18T19:02:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jetty9 add-proxy-route schema doesn't match string values", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-08-07T11:41:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1754829a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5m7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_5128273_*|*_1_*:*_1_*:*_1140000_*|*_10007_*:*_1_*:*_502359586_*|*_3_*:*_1_*:*_101335646_*|*_5_*:*_1_*:*_0"}], "description": "The web-routing service has been added to the tk-jetty9 service, but it needs docs and an example.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10317", "fixedVersions": [], "id": "10317", "issueType": "Task", "key": "TK-44", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-14T13:07:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add docs and example for web-routing service", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "6243b375fd5e4500704351c5", "body": "oh, versions:\n{code}\n(def tk-version \"0.4.3\")\n(def ks-version \"0.7.2\")\n\n[puppetlabs/trapperkeeper-webserver-jetty9 \"0.5.2\"]\n{code}", "created": "2014-08-06T15:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-06T15:49:00.000000", "creator": "6243b375fd5e4500704351c5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7d151dfc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5jz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2980798_*|*_10007_*:*_1_*:*_70027039_*|*_3_*:*_1_*:*_4725798_*|*_5_*:*_1_*:*_0"}], "description": "Stack trace:\n{code}\n2014-08-06 14:48:09,427 WARN  [o.e.j.s.ServletHandler] /node_groups/classifier-api/v1/groups/00000000-0000-4000-8000-000000000000\njava.lang.IllegalArgumentException: No matching method found: append for class java.lang.String\n\tat clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:53) ~[clojure-1.6.0.jar:na]\n\tat clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28) ~[clojure-1.6.0.jar:na]\n\tat puppetlabs.trapperkeeper.services.webserver.jetty9_core$eval18842$proxy_servlet__18843$fn__18844$fn__18848.invoke(jetty9_core.clj:253) ~[na:na]\n\tat puppetlabs.trapperkeeper.services.webserver.jetty9_core.proxy$org.eclipse.jetty.proxy.ProxyServlet$ff19274a.rewriteURI(Unknown Source) ~[na:na]\n\tat org.eclipse.jetty.proxy.ProxyServlet.service(ProxyServlet.java:376) ~[jetty-proxy-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat puppetlabs.trapperkeeper.services.webserver.jetty9_core.proxy$org.eclipse.jetty.proxy.ProxyServlet$ff19274a.service(Unknown Source) ~[na:na]\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0]\n\tat puppetlabs.trapperkeeper.services.webserver.jetty9_core.proxy$org.eclipse.jetty.proxy.ProxyServlet$ff19274a.service(Unknown Source) ~[na:na]\n\tat org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:696) ~[jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:526) [jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:219) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1110) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:453) [jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1044) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.servlets.gzip.GzipHandler.handle(GzipHandler.java:275) [jetty-servlets-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.Server.handle(Server.java:459) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:280) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229) [jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505) [jetty-io-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]\n{code}\n\nProxy route:\n{code}\n          (add-proxy-route {:host (:classifier-api-host app-config)\n                            :port (:classifier-api-port app-config)\n                            :path (:classifier-api-path app-config)}\n                           (str url-prefix \"/classifier-api\"))\n{code}\n\nURL that I'm trying to access:\n{code}\nhttp://localhost:9876/node_groups/classifier-api/v1/groups/00000000-0000-4000-8000-000000000000?inherited=true\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10445", "fixedVersions": [], "id": "10445", "issueType": "Bug", "key": "TK-43", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Blocker", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6243b375fd5e4500704351c5", "resolution": "Fixed", "resolutionDate": "2014-08-07T13:25:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add-proxy-route routes die when given a query param", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "@kevin is this resolved now?", "created": "2014-10-13T18:34:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "derp, [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] ^^", "created": "2014-10-13T18:34:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - I don't think so, no.", "created": "2014-10-13T18:37:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] but the JVM args that you're passing at startup now will cause any OOM to kill the process... right?", "created": "2014-10-14T17:51:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - yes, that addresses this issue for puppet-server.  However, other projects that use tk-jetty9 are still susceptible to this issue.  However, I'm not sure that we can put any sort of general-purpose solution to this into tk-jetty9 ... for OOMEs specifically, it seems like the JVM arg that we're using in puppet-server is a pretty reasonable solution.  So, yeah, this seems like a \"won't fix\" to me.", "created": "2014-10-14T18:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-04T14:28:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@62599b9f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyvp5r:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6147900508_*|*_6_*:*_1_*:*_0"}], "description": "If an OutOfMemoryError occurs in a ring handler, the process keeps running.    This is because the Error occurs on one of jetty's request handler threads, and is never propagated back to Trapperkeeper's main thread.  Instead, the process should terminate.\n\nThis situation surely applies to other handler types and Error types.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10644", "fixedVersions": [], "id": "10644", "issueType": "Improvement", "key": "TK-42", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Fix", "resolutionDate": "2014-10-14T18:13:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "shutdown TK process on OutOfMemoryErrors in request handlers", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Can you take a look at the `project.clj` file and see if the `trapperkeeper-webserver-jetty9` dependency is listed inside of the `dev` profile?  If so, it won't be included in the uberjar, and you'll get the error that you described.  This can be fixed by simply moving the dependency up into the main dependencies section.\n\nWe've been doing it this way because we tend to combine several projects together at packaging time, and we wanted to make the decision as to what version of the webserver service to bundle at that time.  It's certainly debatable as to whether or not we should be doing that in the `lein new` template, though", "created": "2014-08-04T09:50:00.000000"}, {"author": "557058:dba163bc-bd10-4b1d-9a2e-0011c975b6d9", "body": "Just tested this out, and I can attest to the fact that if the `trapperkeeper-webserver-jetty9` dependency is moved-up into the main dependency section, it will be included in the uberjar and things work correctly.", "created": "2014-08-10T14:27:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This was fixed as part of TK-80", "created": "2014-10-07T13:38:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-08-03T04:29:00.000000", "creator": "623c15e38d8b9c0068b8b47d", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5958d171"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypo5b:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "04/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_5648946114_*|*_6_*:*_1_*:*_0"}], "description": "Doing this sequence of commands should work but fails:\n{code}\nlein new trapperkeeper testp/test\ncd test\n<add :aot [puppetlabs.trapperkeeper.main] to the project.clj>\nlein deps\nlein uberjar\njava -jar target/test-0.1.0-SNAPSHOT-standalone.jar -c test-resources/config.conf -b test-resources/bootstrap.cfg\n{code}\nLeads to:\n{code}\nException in thread \"main\" java.lang.IllegalArgumentException: Unable to load service: puppetlabs.trapperkeeper.services.webserver.jetty9-service/jetty9-service\n        at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_$fn__6144.invoke(bootstrap.clj:47)\n        at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_.invoke(bootstrap.clj:44)\n        at puppetlabs.trapperkeeper.bootstrap$parse_bootstrap_config_BANG_$iter__6167__6171$fn__6172.invoke(bootstrap.clj:157)\n        at clojure.lang.LazySeq.sval(LazySeq.java:40)\n        at clojure.lang.LazySeq.seq(LazySeq.java:49)\n        at clojure.lang.Cons.next(Cons.java:39)\n        at clojure.lang.RT.next(RT.java:598)\n        at clojure.core$next.invoke(core.clj:64)\n        at clojure.core$every_QMARK_.invoke(core.clj:2495)\n        at puppetlabs.trapperkeeper.bootstrap$parse_bootstrap_config_BANG_.invoke(bootstrap.clj:151)\n        at puppetlabs.trapperkeeper.core$boot_with_cli_data.invoke(core.clj:114)\n        at puppetlabs.trapperkeeper.core$run.invoke(core.clj:145)\n        at puppetlabs.trapperkeeper.core$main.doInvoke(core.clj:160)\n        at clojure.lang.RestFn.invoke(RestFn.java:457)\n        at clojure.lang.Var.invoke(Var.java:394)\n        at clojure.lang.AFn.applyToHelper(AFn.java:165)\n        at clojure.lang.Var.applyTo(Var.java:700)\n        at clojure.core$apply.invoke(core.clj:624)\n        at puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:7)\n        at clojure.lang.RestFn.applyTo(RestFn.java:137)\n        at puppetlabs.trapperkeeper.main.main(Unknown Source)\nCaused by: java.io.FileNotFoundException: Could not locate puppetlabs/trapperkeeper/services/webserver/jetty9_service__init.class or puppetlabs/trapperkeeper/services/webserver/jetty9_service.clj on classpath: \n        at clojure.lang.RT.load(RT.java:443)\n        at clojure.lang.RT.load(RT.java:411)\n        at clojure.core$load$fn__5066.invoke(core.clj:5641)\n        at clojure.core$load.doInvoke(core.clj:5640)\n        at clojure.lang.RestFn.invoke(RestFn.java:408)\n        at clojure.core$load_one.invoke(core.clj:5446)\n        at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n        at clojure.core$load_lib.doInvoke(core.clj:5485)\n        at clojure.lang.RestFn.applyTo(RestFn.java:142)\n        at clojure.core$apply.invoke(core.clj:626)\n        at clojure.core$load_libs.doInvoke(core.clj:5524)\n        at clojure.lang.RestFn.applyTo(RestFn.java:137)\n        at clojure.core$apply.invoke(core.clj:626)\n        at clojure.core$require.doInvoke(core.clj:5607)\n        at clojure.lang.RestFn.invoke(RestFn.java:408)\n        at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_$fn__6144.invoke(bootstrap.clj:44)\n        ... 20 more\n{code}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10494", "fixedVersions": [], "id": "10494", "issueType": "Bug", "key": "TK-41", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c15e38d8b9c0068b8b47d", "resolution": "Fixed", "resolutionDate": "2014-10-07T13:38:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Using lein uberjar with trapperkeeper does not work at all", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "There are some issues with 9.2.2 that are preventing the upgrade, largely with test times. I've opened a bug report against Jetty, which has been linked here in the ticket. I've also asked them to backport the GzipHandler fix that went into this release into the Jetty 9.1.x branch, which has also been linked here.", "created": "2014-08-12T12:11:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Here's another bugfix in newer Jetty's that [~accountid:6304e59555513d8d731063f4] pointed out to me:\n\nhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=440729", "created": "2014-10-16T09:52:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The issues were addressed and the tk-jetty9 dependency was updated to 9.28 as part of TK-141.  Closing this issue since it is no longer needed.", "created": "2015-03-21T01:01:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-28T17:16:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6823e83c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywirz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "12/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_3_*:*_7111256489_*|*_3_*:*_1_*:*_690543819_*|*_10006_*:*_2_*:*_1878350874"}], "description": "Requests to any endpoint return 404.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10323", "fixedVersions": [], "id": "10323", "issueType": "Bug", "key": "TK-40", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Duplicate", "resolutionDate": "2015-03-21T01:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jetty 9.2.2 breaks everything in trapperkeeper-webserver-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] this is fixed now and can be closed out, right?", "created": "2014-10-13T18:35:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Yup, I'll close it now.", "created": "2014-10-14T10:12:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-25T12:51:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1f05da53"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv9jz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6988866570_*|*_6_*:*_1_*:*_0"}], "description": "A service-symbol function was previously added to trapperkeeper. Unfortunately, however, this cannot be called from within a service function, as the \"this\" variable is needed but cannot be accessed.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10492", "fixedVersions": [], "id": "10492", "issueType": "Bug", "key": "TK-39", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-10-14T10:12:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Cannot access 'this' when using service-symbol from within service function", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] this is fixed and can be closed, right?", "created": "2014-10-13T18:35:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Yup, closing it out.", "created": "2014-10-14T10:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-24T15:06:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1c296511"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv93z:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_7067905516_*|*_6_*:*_1_*:*_0"}], "description": "Currently, TrapperKeeper doesn't support a service function calling a different arity version of itself. If you have a multi-arity function and, within one version of it, try to call a different version, an IllegalArgumentException is thrown. For example, say you have a function called hello. One version takes two parameters, and another takes three. Calling the hello function with arity 3 from within the hello function of arity 2 causes the error to occur.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10308", "fixedVersions": [], "id": "10308", "issueType": "Bug", "key": "TK-38", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-10-14T10:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "One version of a multi-arity service function cannot call another version of itself", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-07-23T14:34:00.000000", "creator": "6243b375fd5e4500704351c5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7a007b2d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypvf3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_95694427_*|*_1_*:*_2_*:*_1020816414_*|*_10007_*:*_1_*:*_683980185_*|*_3_*:*_1_*:*_7965286_*|*_5_*:*_1_*:*_0"}], "description": "It's likely that peoples PE console cookies are already going to be ~4k, so we should bump the default buffer size to account for this. Doubling it to 8192 should work.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10469", "fixedVersions": [], "id": "10469", "issueType": "Task", "key": "TK-37", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "6243b375fd5e4500704351c5", "resolution": "Fixed", "resolutionDate": "2014-08-13T12:55:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Bump the default request-buffer-size in webserver-jetty9", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "This was fixed in Jetty 9.2.2. Now, Jetty uses sendError() during bad Proxy requests, meaning that in this case, instead of the client hanging when the error happens, a 502 response is returned.", "created": "2014-08-18T12:37:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-18T15:58:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@66250ca9"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hypzov:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "0.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2666366341_*|*_6_*:*_1_*:*_0"}], "description": "Currently, when using the Jetty9 Webservice, making a proxy request with a very large cookie causes a failure. Specifically, the client hangs and never gets a response (see TK-31 for more information).\n\nAs it turns out, the size of the request buffer for the proxy request is overflowing due to the large cookie. This is causing Jetty to throw then catch an exception. Unfortunately, since Jetty is never sending a request, it's never receiving a response, and since it's never receiving a response, it's never returning anything whatsoever to the client, so the client waits and waits.\n\nWe want to identify if it is possible to handle this error ourselves, and do so if possible.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10468", "fixedVersions": [], "id": "10468", "issueType": "Bug", "key": "TK-36", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-18T12:37:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improve error handling when cookie is too big on a proxy request", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-07-17T11:50:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@656a635f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5lz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_446576691_*|*_10007_*:*_1_*:*_1888710146_*|*_3_*:*_1_*:*_82966760_*|*_5_*:*_1_*:*_0"}], "description": "The Jetty9 Webservice now supports multi-server configurations in which a user can specify multiple isolated servers in the configuration file. This has caused some additions to the API and some configuration changes (although the old configuration style will still work fine). As a result, we want to update the docs to reflect this change, and we want to add in an example app for the benefit of users.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10642", "fixedVersions": [], "id": "10642", "issueType": "Task", "key": "TK-35", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2014-08-14T11:35:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update docs/add example app for Jetty9 Webservice", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "6243b375fd5e4500704351c5", "body": "This manifests in PE-5500. Talking to [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] it sounds like transparently rewriting {{location}} headers to replace the proxied path with the proxy path is what we're going to implement.", "created": "2014-08-14T16:31:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "The current implementation for this feature would have the ProxyServlet (in conjunction with the HttpClient it creates?) return any redirects it receives for a request it is proxying back to the original client.  In order to achieve this, we've discussed having the ProxyServlet rewrite the 'Location' HTTP header in order to guide the client to the appropriate location to send its redirect request back to.  In this comment, I wanted to cover what the rules for these rewrite would be.\n\nFor these scenarios, the following nodes would be in play:\n\n* Original web client - at client.mycorp.com\n* Proxy server where the Trapperkeeper process hosting the ProxyServlet lives - URL at http://proxy.mycorp.com/local-proxy-content\n* Target server where the proxy server fetches the \u201creal content\u201d to be served to the original web client - URL at http://target.mycorp.com/remote-proxy-content\n* External redirect server that the target server sometimes redirects requests to - URL at http://redirect.mycorp.com/redirect-content\n\nFor each of the following scenarios, the target server would be returning a redirect \u2014 HTTP 3XX status code with Location header that the redirect request should be sent back to.\n\nIf the target server returns a Location header with a fully-qualified URL that does not start with the hostname and port that the proxy server used to contact the target server, the proxy server should just pass back the Location header unmodified.  For example, \u201cLocation: http://redirect.mycorp.com/redirect-content\u201d.  There doesn\u2019t seem to be anything the proxy server could do to munge the Location header and have the subsequent redirect request reliably go back through the proxy again and find the desired target.  If the ProxyServlet were to try to munge the response header to \u201cLocation: /local-proxy-content/redirect-content\u201d, for example, the subsequent redirect request would be proxied to http://target.mycorp.com/remote-proxy-content/redirect-content, which doesn\u2019t seem right.  The implication of this is that the client would need to be able to resolve this redirect location on its own since it wouldn\u2019t be going back through the proxy server for the redirect request.\n\nIf the target server returns a Location header with a relative path or a fully-qualified URL that starts with the hostname and port that the proxy server used to contact the target server, the proxy server should munge the Location header such that the follow-up redirect would be sent back through the proxy to the right location on the target server.  Examples of these would include: \n\n* \u201cLocation: /remote-proxy-content/new-location\u201d -> \u201cLocation: /local-proxy-content/new-location\u201d\n* \u201cLocation:  http://target.mycorp.com/remote-proxy-content/new-location\u201d -> \u201cLocation: /local-proxy-content/new-location\u201d\n* \u201cLocation: /alternate-proxy-content/new-location\u201d -> ???  This one seems particularly ugly.  Actually, I\u2019m not sure if we can do this one.  The ProxyServlet can\u2019t just pass this back without munging because there\u2019s no way the client could find it on a redirect.  Since the ProxyServlet always proxies to a fixed parent URL on the target server, though, a redirect from the target server that would use something outside of that path seems like it wouldn\u2019t be possible to express\u2026\n\nNote that in the above examples for the cases where munging is being done, the result of the munge always has a relative path \u2014 not an fully-qualified one.  I think this is the best way to go because the ProxyServlet won\u2019t necessarily know when hostname the original web client had used in order to get to it \u2014 could be \u201chttp://proxy.mycorp.com\u201d but could also have been \u201chttp://proxy-alias.mycorp.com\u201d if the client were accessing it through some custom host alias.  I suppose the ProxyServlet could try to pull the value from the \u201cHost\u201d header and use that in the munging process but I\u2019m not sure that\u2019s guaranteed to have the value that the client originally put into it (or if the client is guaranteed to even include it) by the time the ProxyServlet would see it.", "created": "2014-08-15T11:45:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Re: your third example, I think we should just return a failure response if the location header doesn't begin with the same prefix that we are proxying to.  (Note that it's probably fairly common that the prefix registered to proxy to will be an empty string, though, in which case this issue goes away.)\n\nThere's another case where I think we'd have to return a failure response, which is if the Location header is absolute and includes a hostname other than the one we are proxying to.\n\n[~accountid:6243b375fd5e4500704351c5] we talked about eventually having a config option that would allow you to choose this kind of behavior for proxy redirects, vs. having the proxy server use its own client to follow the redirect like [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] was suggesting.  I think in the long run it'd probably be good to support both options, because there are some cases that the latter one can handle that this approach can't.\n\nGiven that it might actually be quicker to implement [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]'s way than this way, we could consider just doing that first and filing a ticket to come back and add support for doing it this way in the future.  Since you ([~accountid:6243b375fd5e4500704351c5]) have the best understanding of impacts of this decision w/rt PE3.4, I'm happy to defer to your judgment.", "created": "2014-08-15T11:54:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "> Re: your third example, I think we should just return a failure response if the location header doesn't begin with the same prefix that we are proxying to.\n\nYeah, that's probably all we can do.\n\n> There's another case where I think we'd have to return a failure response, which is if the Location header is absolute and includes a hostname other than the one we are proxying to.\n\nYeah, I attempted to cover that case in my first example above.  Wasn't sure whether it was better to just send the Location header back in its original form since it is \"possible\" that the client might still be able to resolve the redirect location on its own or just throw an error.  I was suggesting sending back the unmunged header but could go either way.\n\n---\n\nI think having the ProxyServlet do the redirects on its own -- controllable via configuration setting -- would allow for a more robust solution for some of these edge cases and would be easier / quicker to implement than the location munging solution.  That said, I totally understand the preference to have the client handle redirects, where we're hoping that the redirect is a temporary thing and that the client would start using the new location from the outset later on.\n\n\n", "created": "2014-08-15T12:04:00.000000"}, {"author": "6243b375fd5e4500704351c5", "body": "I'm happy to try the proxysevlet-follows-redirect fix, but to be honest I can't guarantee that the client's'll like it. I'm certainly willing to try it out though :)\n\nI'd like us to move to the location munging eventually, because I think that is going to be the least surprising behaviour from a client perspective. ", "created": "2014-08-15T12:19:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "leaving this in \"functional review\" until we are able to diagnose the error that [~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] reported in chat today.", "created": "2014-08-19T17:15:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I'm going to close the PR for this and kick the ticket out to triage so we can discuss next steps.  I thought it was going to be quick and easy to finish it up but it seems like issues keep coming up, and it doesn't seem like continuing on it right now would provide a meaningful ROI.", "created": "2014-09-12T12:31:00.000000"}, {"author": "6243b375fd5e4500704351c5", "body": "The NC/RBAC UI issues were solved by moving to ring proxying so no problem", "created": "2014-09-12T14:06:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "AFAICT, this issue is done, so I'm going to close it.  I think it just got lost from our JIRA board.", "created": "2014-10-14T09:12:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5], I don't think we were done with this one yet.  There was some incremental work done on https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/66 to improve redirect support that was shelved because of some unresolved questions.  I think this one should remain open and in the backlog unless we've decided not to pursue further improvements.", "created": "2014-10-14T09:15:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "oops!", "created": "2014-10-14T09:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-10T17:35:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@743b7eb5"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuan:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_9774_*|*_1_*:*_1_*:*_2826641045_*|*_10007_*:*_3_*:*_4771495085_*|*_3_*:*_3_*:*_589176023_*|*_10009_*:*_1_*:*_76894343_*|*_6_*:*_2_*:*_507843_*|*_10006_*:*_1_*:*_805741383_*|*_10005_*:*_1_*:*_231125299426"}], "description": "When using add-proxy-route, if the proxied request returns a redirect, our handler does something stupid.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10244", "fixedVersions": [], "id": "10244", "issueType": "Bug", "key": "TK-33", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2022-02-18T17:38:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jetty add-proxy-route doesn't handle redirects", "timeSpent": "PT0S", "updated": "2022-02-18T17:38:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "So I'm looking for some input on how to approach this ticket from [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14], [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f], and [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5]. \n\nThis issue is caused by the way Jetty handles errors. As of Jetty 9.2.2, this issue is gone (they moved over to using the sendError method, so an error response now actually makes it all the way back to the client so it doesn't hang forever). The commit for this is [here|https://github.com/eclipse/jetty.project/commit/e199b671bb486432498a55b83e5ede89f75d212c#diff-a9f29ebcc11c053dadb192d7aa3c5169R559]. \n\nUnfortunately, TK-40 is still floating around due to the problems we got with speed (running the tests takes a couple of minutes in Jetty 9.2.2, and proxy requests take the entirety of their stop timeouts to return a response, with the default value being a minute).\n\nSo I can see two feasible approaches to this ticket. Since the issue is fixed in 9.2.2, we can let this ticket sit until we find a Jetty release that we can upgrade to (unfortunately, 9.2.3, which was just released on Friday, is not this release, as it has the same speed issues and is causing one of our tests to fail from a BrokenPipeException).\n\nAlternatively, since we are overloading some of the ProxyServlet methods already, I could feasibly implement this fix by overloading the onResponseFailure function in our reified ProxyServlet. Based on the changes in the Jetty commit above, I think we could do it without changing anything other than the onResponseFailure method. This would allow us to potentially carry the fix without having to wait for a Jetty release that works for us.\n\nThoughts? ", "created": "2014-09-10T16:11:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Unless this is causing anybody a headache, I'd prefer to not hack-up anything, and just wait until we can upgrade jetty.", "created": "2014-09-10T16:56:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "+1 to what [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] said.  Let's nag upstream and just stick on the version we're on until they either fix the issue upstream, or we have some kind of urgent issue that forces our hand.", "created": "2014-09-10T18:50:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I'm moving this back into \"doing\" and taking it out of the current sprint. Should I change the epic to either Future Must-Haves or Nice to Haves?", "created": "2014-09-11T10:23:00.000000"}, {"author": "623e7507866b810069e57527", "body": "We upgraded to Jetty 9.2 a while ago, so this is no longer happening. As a result, I'm going to close out this ticket.", "created": "2015-08-03T12:24:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-10T17:31:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@928729a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywu3r:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "10/Sep/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_2_*:*_8143613596_*|*_3_*:*_1_*:*_68262401_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858832425_*|*_10005_*:*_1_*:*_24520519576"}], "description": "When using add-proxy-route, if a proxy request fails, it seems that jetty logs something at debug and then the request hangs (or similar undesirable behavior).  We should look into ways to catch these errors and pass something more useful along as a response to the original request.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10640", "fixedVersions": [], "id": "10640", "issueType": "Bug", "key": "TK-34", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2015-08-03T12:25:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "jetty add-proxy-route doesn't behave nicely if the proxy request fails", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "My bug fix has been merged into Jetty. We should be able to update our Jetty dependencies in the Jetty9 Webservice once they do a new release.", "created": "2014-07-16T11:29:00.000000"}, {"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "[~accountid:623e7507866b810069e57527] do you know what release this will be? Is it 9.1.6 or did it go out on a 9.2.x branch? I'm only curious because we have TK-40 which blocks 9.2.2 from being used at all.", "created": "2014-07-30T13:22:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] The bugfix went out in 9.2.2, but this release unfortunately seems to break something else in the Jetty9 webservice.", "created": "2014-07-31T11:59:00.000000"}, {"author": "70121:7b50b988-18ad-4913-8df5-c67397870b32", "body": "[~accountid:623e7507866b810069e57527] should we just close this bug in lieu of TK-40 then? I presume we're not getting a fix for 9.1.5 now.", "created": "2014-07-31T12:03:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:70121:7b50b988-18ad-4913-8df5-c67397870b32] Yes, I think that would be a good idea. I'll close out this issue now.", "created": "2014-08-04T12:28:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] can we maybe just keep this open until we have diagnosed TK-40?  Then we can decide what to do from there.", "created": "2014-08-04T12:32:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We could change the title of this one to something relating to the specific bug fix though.", "created": "2014-08-04T12:33:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] Sure, I'll leave it open for now.", "created": "2014-08-04T12:33:00.000000"}, {"author": "623e7507866b810069e57527", "body": "We upgraded to Jetty 9.2 ages ago, so I'm going to close out this ticket.", "created": "2015-08-03T12:15:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-07-10T17:10:00.000000", "creator": "623e7507866b810069e57527", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@71411f74"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywiu7:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "30/Jul/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_8213109954_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858825452_*|*_10005_*:*_1_*:*_24519984158"}], "description": "There is currently a bug in Jetty's GzipHandler introduced in version 9.1.3 that is causing 404 errors on all endpoints on which a handler is registered whenever a GzipHandler is used, which is always. I am planning to make a PR to Jetty to fix this bug. We won't be able to update the Jetty dependency past 9.1.2 until they do a new release with the bug fix.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10491", "fixedVersions": [], "id": "10491", "issueType": "Bug", "key": "TK-32", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623e7507866b810069e57527", "resolution": "Fixed", "resolutionDate": "2015-08-03T12:16:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "GzipHandler bug preventing update to latest versions of Jetty", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-07-10T15:32:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b5b55ba"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv0if:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Mar/16"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "null_*:*_1_*:*_0_*|*_10008_*:*_1_*:*_506728480_*|*_1_*:*_1_*:*_507235433_*|*_10007_*:*_2_*:*_425676963_*|*_3_*:*_1_*:*_186035461_*|*_5_*:*_1_*:*_0"}], "description": "When using the proxy, if an HTTP request has a \"large\" cookie on it, the server does not respond to the request.\n\nThis was uncovered by [~accountid:6243b375fd5e4500704351c5].\n\nJetty logs the following error at DEBUG:\n\n{code}\njava.io.IOException: Response header too large\n\tat org.eclipse.jetty.http.HttpGenerator.generateRequest(HttpGenerator.java:241) ~[jetty-http-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpSenderOverHTTP.sendHeaders(HttpSenderOverHTTP.java:78) ~[jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.HttpSender.send(HttpSender.java:172) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:54) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpConnectionOverHTTP$Delegate.send(HttpConnectionOverHTTP.java:166) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpConnectionOverHTTP.send(HttpConnectionOverHTTP.java:68) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpDestinationOverHTTP.send(HttpDestinationOverHTTP.java:36) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.http.HttpDestinationOverHTTP.send(HttpDestinationOverHTTP.java:26) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.client.PoolingHttpDestination$2.run(PoolingHttpDestination.java:129) [jetty-client-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) [jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]\nCaused by: java.nio.BufferOverflowException: null\n\tat java.nio.HeapByteBuffer.put(HeapByteBuffer.java:183) ~[na:1.7.0_51]\n\tat java.nio.ByteBuffer.put(ByteBuffer.java:832) ~[na:1.7.0_51]\n\tat org.eclipse.jetty.http.HttpGenerator.putTo(HttpGenerator.java:1055) ~[jetty-http-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.http.HttpGenerator.generateHeaders(HttpGenerator.java:684) ~[jetty-http-9.1.0.v20131115.jar:9.1.0.v20131115]\n\tat org.eclipse.jetty.http.HttpGenerator.generateRequest(HttpGenerator.java:215) ~[jetty-http-9.1.0.v20131115.jar:9.1.0.v20131115]\n\t... 11 common frames omitted\n{code}\n\nThe cookie used was:\n{noformat}\npuppet_enterprise_console=BAh7DEkiD3Nlc3Npb25faWQGOgZFRiJFMWZjMjVjMzk2NzM5MWZmZDQ3NDEx%0AYzE2ZDNjNWQ5OTlmNWExYTVjOGU5NzA2OGQ0OWZhMDdjZWMwYzY3NzI5NUki%0AHkNPTlNPTEVfQVVUSF9BQ0NPVU5UX05BTUUGOwBGSSIbbGluZHNleUBwdXBw%0AZXRsYWJzLmNvbQY7AFRJIh5DT05TT0xFX0FVVEhfQUNDT1VOVF9ST0xFBjsA%0ARkkiD3JlYWQtd3JpdGUGOwBUSSIfQ09OU09MRV9BVVRIX0FVVEhFTlRJQ0FU%0AT1IGOwBGSSILZ29vZ2xlBjsAVEkiGEFDQ0VTU19DT05UUk9MX1JPTEUGOwBG%0ASSIOUkVBRF9PTkxZBjsARkkiD2NzcmYudG9rZW4GOwBGSSIxaDBMSkUwMS9r%0AZXFUWThjVXVzSXRNTzFPUDNKell3bmRCZ2pjUXVZQWJxVT0GOwBGSSIQX2Nz%0AcmZfdG9rZW4GOwBGSSIxZnl2Sm5scUxEQkhKVDlWelR2NnlMTmkyM3JtWWpj%0AdjdNYm9YR2dsdW9mTT0GOwBG%0A--15b097175979539c53f06ca7caf018cfabecaef9; rack.session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRiJFMDk2ZTJiZmY1MzllYzI4MDM4ZjYw%0AOTFlNTAzYmViYjE4ODk1ZTUzNjFmM2U5ZWNjZGNjNGFhM2JiYTI0NWI3N0ki%0AD2NzcmYudG9rZW4GOwBGSSIxVXFxMk0zVE1EYXBJMHY5eWhpOHJ4TVdVYjM5%0AeWxWVVVvbEhZelk5cHdIND0GOwBG%0A; _session_id=BAh7DEkiD3Nlc3Npb25faWQGOgZFRkkiJTk1NmUxYzdjNGZhMjJhZGY0N2ZkMDBhYjYxYjBkYzRkBjsAVEkiD2NzcmYudG9rZW4GOwBGSSIxRFlYdktwVjdDSVBXclZWbW1ja2toVnpYT1ZEeU1Ic0UrNFo5SCtHM0V3az0GOwBGSSIQX2NzcmZfdG9rZW4GOwBGSSIxZUY4bWdzcmtyeTlRekViK2kvOTdxVkNOdjdTK3UwZlhJMjhxRGZYdXJyST0GOwBGSSIeQ09OU09MRV9BVVRIX0FDQ09VTlRfTkFNRQY7AEZJIhh0ZXN0QHB1cHBldGxhYnMuY29tBjsAVEkiHkNPTlNPTEVfQVVUSF9BQ0NPVU5UX1JPTEUGOwBGSSIKYWRtaW4GOwBUSSIYQUNDRVNTX0NPTlRST0xfUk9MRQY7AEZJIg9SRUFEX1dSSVRFBjsARkkiCGNhcwY7AEZ7CEkiFmxhc3RfdmFsaWRfdGlja2V0BjsARm86HUNBU0NsaWVudDo6U2VydmljZVRpY2tldAk6DEB0aWNrZXRJIiVTVC0xMzk4MTIyOTIwcnpGRzdqQllYWkVZUHZ2Tlc4NwY7AFQ6DUBzZXJ2aWNlSSIjaHR0cDovL2xvY2FsaG9zdDozMDAwL2V2ZW50cy8%2FBjsARjoLQHJlbmV3MDoOQHJlc3BvbnNlbzoiQ0FTQ2xpZW50OjpWYWxpZGF0aW9uUmVzcG9uc2UKOhRAcGFyc2VfZGF0ZXRpbWVJdToJVGltZQ23jhyA%2BlGNcgc6C0Bfem9uZUkiCFBEVAY7AFQ6C29mZnNldGn%2BkJ06CUB4bWxvOhNSRVhNTDo6RWxlbWVudA86DEBwYXJlbnRvOxEPOxJvOhRSRVhNTDo6RG9jdW1lbnQROhxAZW50aXR5X2V4cGFuc2lvbl9jb3VudGkAOxIwOg5AY2hpbGRyZW5bCW86E1JFWE1MOjpYTUxEZWNsCzoPQHdyaXRldGhpc1Q6E0B3cml0ZWVuY29kaW5nVDsSQB06DUB2ZXJzaW9uSSIIMS4wBjsAVDoOQGVuY29kaW5nSSIKVVRGLTgGOwBUOhBAc3RhbmRhbG9uZTBvOhBSRVhNTDo6VGV4dAs6CUByYXdUOxJAHToTQGVudGl0eV9maWx0ZXIwOhJAdW5ub3JtYWxpemVkMDoQQG5vcm1hbGl6ZWQwOgxAc3RyaW5nSSIGCgY7AFRAHG87HAs7HVQ7EkAdOx4wOx8wOyAwOyFJIgYKBjsAVDoOQGVsZW1lbnRzbzoUUkVYTUw6OkVsZW1lbnRzBjoNQGVsZW1lbnRAHToQQGF0dHJpYnV0ZXNJQzoWUkVYTUw6OkF0dHJpYnV0ZXN7AAY7JEAdOg1AY29udGV4dHsAOhNAZXhwYW5kZWRfbmFtZUkiDlVOREVGSU5FRAY7AEY6DEBwcmVmaXhJIgAGOwBGOg9AbmFtZXNwYWNlSSIABjsARjoKQG5hbWVJIg5VTkRFRklORUQGOwBGOh1AaWdub3JlX3doaXRlc3BhY2Vfbm9kZXNGOhBAd2hpdGVzcGFjZVQ7J0AoOxVbCG87HAs7HVQ7EkAcOx4wOx8wOyAwOyFJIggKICAGOwBUQBtvOxwLOx1UOxJAHDseMDsfMDsgMDshSSIGCgY7AFQ7Im87IwY7JEAcOyVJQzsmewZJIghjYXMGOwBUbzoVUkVYTUw6OkF0dHJpYnV0ZQs7JEAcOx9JIh9odHRwOi8vd3d3LnlhbGUuZWR1L3RwL2NhcwY7AFQ7IDA7KEkiDnhtbG5zOmNhcwY7AFQ7KUkiCnhtbG5zBjsAVDsrSSIIY2FzBjsAVAY7JEAcOyhJIhhjYXM6c2VydmljZVJlc3BvbnNlBjsAVDspSSIIY2FzBjsAVDsrSSIUc2VydmljZVJlc3BvbnNlBjsAVDssRjstVDsnQCg7FVsKbzscCzsdVDsSQBs7HjA7HzA7IDA7IUkiCgogICAgBjsAVG87EQ87EkAbOydAKDsVWwZvOxwLOx1UOxJAQDseMDsfSSIYdGVzdEBwdXBwZXRsYWJzLmNvbQY7AFQ7IDA7IUkiGHRlc3RAcHVwcGV0bGFicy5jb20GOwBUOyJvOyMGOyRAQDslSUM7JnsABjskQEA7KEkiDWNhczp1c2VyBjsAVDspSSIIY2FzBjsAVDsrSSIJdXNlcgY7AFQ7LEY7LVRvOxwLOx1UOxJAGzseMDsfMDsgMDshSSIKCiAgICAGOwBUbzsRDzsSQBs7J0AoOxVbBm87HAs7HVQ7EkBMOx4wOx9JIixDQVNTZXJ2ZXI6OkF1dGhlbnRpY2F0b3JzOjpTUUxFbmNyeXB0ZWQGOwBUOyAwOyFJIixDQVNTZXJ2ZXI6OkF1dGhlbnRpY2F0b3JzOjpTUUxFbmNyeXB0ZWQGOwBUOyJvOyMGOyRATDslSUM7JnsABjskQEw7KEkiFmNhczphdXRoZW50aWNhdG9yBjsAVDspSSIIY2FzBjsAVDsrSSISYXV0aGVudGljYXRvcgY7AFQ7LEY7LVRvOxwLOx1UOxJAGzseMDsfMDsgMDshSSIICiAgBjsAVDsibzsjBjskQBs7JUlDOyZ7AAY7JEAbOyhJIh5jYXM6YXV0aGVudGljYXRpb25TdWNjZXNzBjsAVDspSSIIY2FzBjsAVDsrSSIaYXV0aGVudGljYXRpb25TdWNjZXNzBjsAVDssRjstVDoOQHByb3RvY29sZgYyOgpAdXNlckkiGHRlc3RAcHVwcGV0bGFicy5jb20GOwBUOhZAZXh0cmFfYXR0cmlidXRlc3sASSIPZmlsdGVydXNlcgY7AEZAXkkiGXVzZXJuYW1lX3Nlc3Npb25fa2V5BjsARkBe--4aaa7f88f10137c85d99a851bc08490934a2da80\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10549", "fixedVersions": [], "id": "10549", "issueType": "Bug", "key": "TK-31", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2014-07-29T11:08:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "proxy blows up on a big cookie", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-07-08T13:14:00.000000", "creator": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@77bdf824"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5jj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_2513774259_*|*_10007_*:*_1_*:*_597473310_*|*_5_*:*_1_*:*_0"}], "description": "http-kit had a :query-params option that was very useful for adding query params to a request. With the move to use the Apache HttpAsyncClient library instead of http-kit for clj-http-client, a query-params request option was removed. It should be added back.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10409", "fixedVersions": [], "id": "10409", "issueType": "Improvement", "key": "TK-29", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "70121:1f7c5098-d991-4129-bcae-5fc413f71091", "resolution": "Fixed", "resolutionDate": "2014-08-13T13:28:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Add query-params request option back into clj-http-client", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-06-26T11:14:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@572c3941"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv0a7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1215397556_*|*_10007_*:*_1_*:*_1185514089_*|*_3_*:*_1_*:*_449987034_*|*_5_*:*_1_*:*_0"}], "description": "Assuming we move forward with the new implementation of the clj-http-client that is based on apache httpasyncclient instead of http-kit, the current PR is missing an important chunk of functionality.\n\nThe current code provides API for making different types of HTTP requests (GET/POST/etc.) directly, but does not expose any access to the object that represents the HTTP client itself.  This means that every request causes a new client to be instantiated, and thus a new HTTP connection.  This is fine for simple cases but will be a huge performance hit for advanced use cases that are issuing multiple requests.\n\nWe need to extend the API to provide callers with a way to ask for an instance of a `client` object.  This client object should satisfy a new clojure protocol that basically has the same functions on it that we are exposing at the top level of the API (get/post/etc.).\n\nThe new protocol should also have a 'close' function that allows the instance to be cleaned up (and used with the clojure `with-open` macro when desirable).\n\nHopefully most of the existing code can be re-used to achieve this; I'd expect the work to roughly look like this:\n\n* create the new protocol for the client\n* make the existing `create-client` function public, and change the return type; currently it returns an instance of the apache Client object directly... instead, it should wrap that in an instance of the protocol\n* refactor the existing `request` function into two functions; one that requires a client as an argument and does all of the work, and one that contains the existing logic to instantiate a new default client and passes that to the new function to do the work.\n\nThinking about this a bit further, we probably need two different Client protocols... one for a synchronous client and one for an asynchronous client.  The sync one should be able to be implemented as a wrapper around the async one.  This probably means that we need two different 'create-client' functions; one for sync and one for async.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10490", "fixedVersions": [], "id": "10490", "issueType": "New Feature", "key": "TK-27", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-29T11:09:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "clj-http-client: add `client` protocol and API for managing clients explicitly", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-06-23T12:38:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@eec024b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyq047:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_192006_*|*_1_*:*_1_*:*_47273_*|*_10007_*:*_1_*:*_74651841_*|*_3_*:*_1_*:*_100892_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10314", "fixedVersions": [], "id": "10314", "issueType": "New Feature", "key": "TK-26", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-06-24T09:27:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add `dissoc-in` function to kitchensink", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-06-18T17:33:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@192d4f10"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywix3:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_3_*:*_11178716909_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858807561_*|*_10005_*:*_2_*:*_66503467535"}], "description": "See my last comment on TK-24.\n\nAlso, there's this: https://confluence.puppetlabs.com/display/ENG/Notes+on+AOT+Compilation", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10321", "fixedVersions": [], "id": "10321", "issueType": "Improvement", "key": "TK-25", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2016-12-13T17:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "wiki needs a section on AOT", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "At first glance, I can't reproduce this, via the following steps:\n\n1. {{lein new trapperkeeper my-tk-project}}\n2. add {{:aot :all}} to project.clj\n3. {{lein uberjar}} - this works, but seems like it should fail?", "created": "2014-06-18T14:57:00.000000"}, {"author": "557058:fed12845-b709-41ba-84cb-9da27f93ea7a", "body": "I can't reproduce the compilation failure -- I'll work on trying to narrow the conditions where this repros.\n\nHowever, on adding {{puppetlabs.trapperkeeper.services.nrepl/nrepl-services}} to {{./test-resources/bootstrap.cfg}} I do reproduce the runtime error with\n\n{code}\njava -jar target/my-tk-project-0.1.0-SNAPSHOT-standalone.jar --config ./test-resources/config.ini --bootstrap-config ./test-resources/bootstrap.cfg\n{code}", "created": "2014-06-18T15:53:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:fed12845-b709-41ba-84cb-9da27f93ea7a] - I was able to reproduce the problem you described when running the uberjar ...\n{quote}\njava.lang.RuntimeException: Unable to resolve symbol: nrepl-service in this context, compiling:(puppetlabs/trapperkeeper/services/nrepl/nrepl_service.clj:29:1)\n{quote}\n... after adding the nREPL service (and removing the jetty service) from the boostrap.cfg.\n\nUnfortunately, I don't have much more information at the time being.  We pretty much avoid AOT as much as possible, so I'm not surprised that trapperkeeper doesn't exactly play nice with it.  We use AOT by adding the following to project.clj:\n{noformat}\n:profiles { :uberjar {:aot [puppetlabs.trapperkeeper.main]} }\n{noformat}\n\nIf you look at that namespace, you'll see that it doesn't {{require}} any other namespaces - this has the affect of only AOT'ing that single namespace and allowing everything else to be compiled dynamically at runtime, effectively avoiding AOT as much as possible.  We've been advising this as a best practice for trapperkeeper applications that need an uberjar.  This should have a section in our docs, but it apparently doesn't, so I'll make sure that gets added.", "created": "2014-06-18T17:31:00.000000"}, {"author": "623c15e38d8b9c0068b8b47d", "body": "I Encounter a similar problem.\nAOT compiling the tk main does not work for me at all if i load tk via lein dependencies.\nIt just can't resolve the main while running uberjar. Running via trampoline/repl works like a charm.\nCopying the trapperkeeper main into my own src folder at least make the uberjar command finish, but starting the jar later crashes with the same error, namely a message stating that a symbol identifying a service could not be found.\nIt would be really nice to get the uberjar working just for easy of deployments sake.", "created": "2014-08-02T21:27:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:623c15e38d8b9c0068b8b47d] - We build and use trapperkeeer-based uberjars on a daily basis.  If you simply add this bit of code ...\n{code}\n:profiles { :uberjar {:aot [puppetlabs.trapperkeeper.main]} }\n{code}\n... to your project.clj, that should allow to build and use an uberjar.  Note that you shouldn't have any other {{:aot}} settings in project.clj or be using {{gen-class}} anywhere in your code.  My previous comment explains this a bit more.  This ticket covers the specific issue of trying to {{:aot :all}} the project, which is currently impossible with trapperkeeper, for the time being.", "created": "2014-08-04T12:04:00.000000"}, {"author": "623c15e38d8b9c0068b8b47d", "body": "[~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] could you please point out to me what is wrong in this file: https://github.com/exi/clj-parasoup/blob/01426abebf24361ba5899be11dc42db38a1a1451/project.clj\nI think a put the uberjar/aot settings in the right place but it still returns this:\n{code}\n$ lein uberjar   \nCompiling puppetlabs.trapperkeeper.main\nException in thread \"main\" java.io.FileNotFoundException: Could not locate puppetlabs/trapperkeeper/main__init.class or puppetlabs/trapperkeeper/main.clj on classpath: , compiling:(/tmp/form-init2538332848789810629.clj:1:90)\n        at clojure.lang.Compiler.load(Compiler.java:7142)\n        at clojure.lang.Compiler.loadFile(Compiler.java:7086)\n        at clojure.main$load_script.invoke(main.clj:274)\n        at clojure.main$init_opt.invoke(main.clj:279)\n        at clojure.main$initialize.invoke(main.clj:307)\n        at clojure.main$null_opt.invoke(main.clj:342)\n        at clojure.main$main.doInvoke(main.clj:420)\n        at clojure.lang.RestFn.invoke(RestFn.java:421)\n        at clojure.lang.Var.invoke(Var.java:383)\n        at clojure.lang.AFn.applyToHelper(AFn.java:156)\n        at clojure.lang.Var.applyTo(Var.java:700)\n        at clojure.main.main(main.java:37)\nCaused by: java.io.FileNotFoundException: Could not locate puppetlabs/trapperkeeper/main__init.class or puppetlabs/trapperkeeper/main.clj on classpath: \n        at clojure.lang.RT.load(RT.java:443)\n        at clojure.lang.RT.load(RT.java:411)\n        at clojure.core$load$fn__5066.invoke(core.clj:5641)\n        at clojure.core$load.doInvoke(core.clj:5640)\n        at clojure.lang.RestFn.invoke(RestFn.java:408)\n        at clojure.core$load_one.invoke(core.clj:5446)\n        at clojure.core$compile$fn__5071.invoke(core.clj:5652)\n        at clojure.core$compile.invoke(core.clj:5651)\n        at user$eval19.invoke(form-init2538332848789810629.clj:1)\n        at clojure.lang.Compiler.eval(Compiler.java:6703)\n        at clojure.lang.Compiler.eval(Compiler.java:6693)\n        at clojure.lang.Compiler.load(Compiler.java:7130)\n        ... 11 more\nCompilation failed: Subprocess failed\n{code}", "created": "2014-10-14T02:36:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:623c15e38d8b9c0068b8b47d] - The problem is on line 13 of your project.clj:\n{code}\n[puppetlabs/trapperkeeper ~tk-version :classifier \"test\"]\n{code}\nYou need to remove {{:classifier \"test\"}} from that line.", "created": "2014-10-14T09:08:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Reading back through the history of this issue, it doesn't seem like there's any work to be done here.  We have TK-72 open to add some documentation around AOT compilation.  It sounds like TK does not play nicely with {{:aot :all}} ... [~accountid:557058:fed12845-b709-41ba-84cb-9da27f93ea7a] - if that's something that you would like to see fixed, let's open a new ticket for that.  As I mentioned earlier, we specifically designed TK to avoid AOT as much as possible, so I'm not sure about that one.\n\nAnyway, I'm closing this ticket since it's quite old - [~accountid:623c15e38d8b9c0068b8b47d] - feel free to comment again if you're still having problems, or just open a new ticket.", "created": "2014-10-14T09:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-06-18T14:52:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7fe425d1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv1mv:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "18/Jun/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_10122242563_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_52998370"}], "description": "From a github issue at https://github.com/puppetlabs/trapperkeeper/issues/150 ...\n\nSteps to reproduce:\n1. In project.clj set :aot :all.\n2. Use puppetlabs.trapperkeeper.core/defservice to define a service that gets loaded by bootstrap.cfg.\n3. Attempt to create an uberjar.\n\nResult:\nFollowing error is thrown during compilation:\n\n{noformat}\nCompiling omf.http.http-service\nException in thread \"main\" java.lang.RuntimeException: Unable to resolve symbol: http-service in this context, compiling:(omf/http/http_service.clj:108:1)\n    at clojure.lang.Compiler.analyze(Compiler.java:6464)\n    at clojure.lang.Compiler.analyze(Compiler.java:6406)\n    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719)\n    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646)\n    at clojure.lang.Compiler.analyze(Compiler.java:6445)\n    at clojure.lang.Compiler.analyze(Compiler.java:6406)\n    at clojure.lang.Compiler.compile1(Compiler.java:7221)\n    at clojure.lang.Compiler.compile(Compiler.java:7292)\n    at clojure.lang.RT.compile(RT.java:398)\n    at clojure.lang.RT.load(RT.java:438)\n    at clojure.lang.RT.load(RT.java:411)\n    at clojure.core$load$fn__5066.invoke(core.clj:5641)\n    at clojure.core$load.doInvoke(core.clj:5640)\n    at clojure.lang.RestFn.invoke(RestFn.java:408)\n    at clojure.core$load_one.invoke(core.clj:5446)\n    at clojure.core$compile$fn__5071.invoke(core.clj:5652)\n    at clojure.core$compile.invoke(core.clj:5651)\n    at user$eval9.invoke(form-init8589420194764528579.clj:1)\n    at clojure.lang.Compiler.eval(Compiler.java:6703)\n    at clojure.lang.Compiler.eval(Compiler.java:6693)\n    at clojure.lang.Compiler.load(Compiler.java:7130)\n    at clojure.lang.Compiler.loadFile(Compiler.java:7086)\n    at clojure.main$load_script.invoke(main.clj:274)\n    at clojure.main$init_opt.invoke(main.clj:279)\n    at clojure.main$initialize.invoke(main.clj:307)\n    at clojure.main$null_opt.invoke(main.clj:342)\n    at clojure.main$main.doInvoke(main.clj:420)\n    at clojure.lang.RestFn.invoke(RestFn.java:421)\n    at clojure.lang.Var.invoke(Var.java:383)\n    at clojure.lang.AFn.applyToHelper(AFn.java:156)\n    at clojure.lang.Var.applyTo(Var.java:700)\n    at clojure.main.main(main.java:37)\n{noformat}\n\nWorkaround:\nThe error does not occur when defservice is directly used from the puppetlabs.trapperkeeper.services namespace.\n\nThis also seems to affect the nREPL service.  From https://github.com/puppetlabs/trapperkeeper/issues/151 ...\n\nSteps to reproduce:\n1. In project.clj set :aot :all.\n2. In bootstrap.cfg add the following line: puppetlabs.trapperkeeper.services.nrepl.nrepl-service/nrepl-service\n3. Run lein uberjar.\n4. Attempt to start the standalone jar.\n\nResult:\nTrapperKeeper service does not start and the following exception is thrown:\n\n{noformat}\nException in thread \"main\" java.lang.RuntimeException: Unable to resolve symbol: nrepl-service in this context, compiling:(puppetlabs/trapperkeeper/services/nrepl/nrepl_service.clj:48:1)\n    at clojure.lang.Compiler.analyze(Compiler.java:6464)\n    at clojure.lang.Compiler.analyze(Compiler.java:6406)\n    at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719)\n    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646)\n    at clojure.lang.Compiler.analyze(Compiler.java:6445)\n    at clojure.lang.Compiler.analyze(Compiler.java:6406)\n    at clojure.lang.Compiler.eval(Compiler.java:6707)\n    at clojure.lang.Compiler.load(Compiler.java:7130)\n    at clojure.lang.RT.loadResourceScript(RT.java:370)\n    at clojure.lang.RT.loadResourceScript(RT.java:361)\n    at clojure.lang.RT.load(RT.java:440)\n    at clojure.lang.RT.load(RT.java:411)\n    at clojure.core$load$fn__5066.invoke(core.clj:5641)\n    at clojure.core$load.doInvoke(core.clj:5640)\n    at clojure.lang.RestFn.invoke(RestFn.java:408)\n    at clojure.core$load_one.invoke(core.clj:5446)\n    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486)\n    at clojure.core$load_lib.doInvoke(core.clj:5485)\n    at clojure.lang.RestFn.applyTo(RestFn.java:142)\n    at clojure.core$apply.invoke(core.clj:626)\n    at clojure.core$load_libs.doInvoke(core.clj:5524)\n    at clojure.lang.RestFn.applyTo(RestFn.java:137)\n    at clojure.core$apply.invoke(core.clj:626)\n    at clojure.core$require.doInvoke(core.clj:5607)\n    at clojure.lang.RestFn.invoke(RestFn.java:408)\n    at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_$fn__8506.invoke(bootstrap.clj:44)\n    at puppetlabs.trapperkeeper.bootstrap$resolve_service_BANG_.invoke(bootstrap.clj:44)\n    at puppetlabs.trapperkeeper.bootstrap$parse_bootstrap_config_BANG_$iter__8529__8533$fn__8534.invoke(bootstrap.clj:157)\n    at clojure.lang.LazySeq.sval(LazySeq.java:40)\n    at clojure.lang.LazySeq.seq(LazySeq.java:49)\n    at clojure.lang.Cons.next(Cons.java:39)\n    at clojure.lang.RT.next(RT.java:598)\n    at clojure.core$next.invoke(core.clj:64)\n    at clojure.core$every_QMARK_.invoke(core.clj:2495)\n    at puppetlabs.trapperkeeper.bootstrap$parse_bootstrap_config_BANG_.invoke(bootstrap.clj:151)\n    at puppetlabs.trapperkeeper.core$boot_with_cli_data.invoke(core.clj:114)\n    at puppetlabs.trapperkeeper.core$run.invoke(core.clj:145)\n    at puppetlabs.trapperkeeper.core$main.doInvoke(core.clj:160)\n    at clojure.lang.RestFn.invoke(RestFn.java:421)\n    at clojure.lang.Var.invoke(Var.java:383)\n    at clojure.lang.AFn.applyToHelper(AFn.java:156)\n    at clojure.lang.Var.applyTo(Var.java:700)\n    at clojure.core$apply.invoke(core.clj:624)\n    at puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:7)\n    at clojure.lang.RestFn.invoke(RestFn.java:421)\n    at clojure.lang.Var.invoke(Var.java:383)\n    at user$eval5.invoke(form-init2155226568292534607.clj:1)\n    at clojure.lang.Compiler.eval(Compiler.java:6703)\n    at clojure.lang.Compiler.eval(Compiler.java:6693)\n    at clojure.lang.Compiler.load(Compiler.java:7130)\n    at clojure.lang.Compiler.loadFile(Compiler.java:7086)\n    at clojure.main$load_script.invoke(main.clj:274)\n    at clojure.main$init_opt.invoke(main.clj:279)\n    at clojure.main$initialize.invoke(main.clj:307)\n    at clojure.main$null_opt.invoke(main.clj:342)\n    at clojure.main$main.doInvoke(main.clj:420)\n    at clojure.lang.RestFn.invoke(RestFn.java:421)\n    at clojure.lang.Var.invoke(Var.java:383)\n    at clojure.lang.AFn.applyToHelper(AFn.java:156)\n    at clojure.lang.Var.applyTo(Var.java:700)\n    at clojure.main.main(main.java:37)\n{noformat}", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10467", "fixedVersions": [], "id": "10467", "issueType": "Bug", "key": "TK-24", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Fix", "resolutionDate": "2014-10-14T09:20:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "use of 'defservice' macro prevents AOT-compilation", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I am strongly considering porting the clj-http-client library over to use the apache async client:\n\nhttp://hc.apache.org/httpcomponents-asyncclient-4.0.x/\n\nDoing this would likely render this ticket obsolete, so we might want to make a final decision on that before anyone begins work on this.", "created": "2014-06-10T18:13:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I merged https://github.com/puppetlabs/clj-http-client/pull/7, but I'm not sure what to do with this ticket, since that PR didn't actually affect jetty9 (yet).", "created": "2014-07-09T14:09:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "Maybe should put it back in \"To Do\" so someone can pick it up to do the Jetty work later.  Also will need a clj-http-client release first, right?", "created": "2014-07-09T14:22:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-06-10T16:25:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6fa8757d"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5lr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Jun/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1212659841_*|*_10007_*:*_2_*:*_1623108469_*|*_3_*:*_2_*:*_1317543_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_2681745422"}], "description": "Some of the trapperkeeper-webservices-jetty9 ssl failure tests have been seen to sporadically fail because the wrong exception is thrown.  The test expects a `ProtocolException` but a Java `IOException` may be thrown instead.  One example of a failure was in this Travis CI run -- https://travis-ci.org/puppetlabs/trapperkeeper-webserver-jetty9/jobs/27256969.  The failing test was `ssl-failure-test`.\n\nI believe this may be due to the implementation of the SSL handler in the underlying http-kit code.  If the http-kit onComplete() handler in RespListener were called for a connection with no HTTP payload bytes, a ProtocolException can be thrown.  If an Exception were thrown up the stack within the Java framework security code first, though, that Exception could be what the client sees, e.g., the Java IOException.\n\nThe appearance of one Exception vs. another doesn't really matter for what these tests are intending to validating -- that the connection fails with no payload for a specifically induced SSL problem.  To avoid spurious test failures, these tests should be updated to tolerate either a ProtocolException or a Java IOException as a condition for success.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10306", "fixedVersions": [], "id": "10306", "issueType": "Bug", "key": "TK-23", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-08-13T13:26:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "tk-jetty9 ssl tests sporadically fail due to unexpected IOException", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-31T16:54:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6b5aa191"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu6a7:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_747576_*|*_1_*:*_1_*:*_65331_*|*_10007_*:*_1_*:*_242026783_*|*_3_*:*_1_*:*_746239_*|*_5_*:*_1_*:*_0"}], "description": "With the current implementation of the Jetty 9 web service, if `stop` is called when no `:jetty9-server` is attached to the supplied context, a schema validation failure occurs:\n\n2014-05-31 16:35:02,434 ERROR [p.t.internal] Encountered error during shutdown sequence\nclojure.lang.ExceptionInfo: Input to shutdown does not match schema: [(named (not (map? nil)) webserver-context)]\n\nThe only time `stop` could be called in this manner would be if the `init` for the Jetty9 service were not called first, e.g., if a Throwable is thrown during the init of a server which is initialized before the Jetty9 service.  Since the Jetty9 service only has a dependency on the internal ConfigService, this problem would most likely be triggered by an unrelated service.  Where load order between these services would not be predictable, this problem could be intermittent.\n\nThe schema violation in this case should not adversely affect the shutdown of other services since Trapperkeeper would catch and move on from the Throwable.  Nevertheless, it would be good to avoid having this message appear in the log file.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10406", "fixedVersions": [], "id": "10406", "issueType": "Bug", "key": "TK-22", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-06-03T12:34:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jetty9 service can encounter shutdown failure following early init failure", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-30T12:42:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@53610509"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyr1en:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_959005028_*|*_10007_*:*_1_*:*_17198696_*|*_3_*:*_1_*:*_8793_*|*_5_*:*_1_*:*_0"}], "description": "The `add-proxy-route` function on the jetty9 service allows you to configure Jetty to proxy certain requests to another host.  However, it currently does not provide any mechanism for manipulating the request (e.g. to add additional headers if they are needed in order to proxy successfully).  Would be nice to add the ability to register a general-purpose clojure callback function, which would be passed the request object and given the opportunity to manipulate it before Jetty continues on with the proxy operation.\n\nThere are examples available on the internet of folks accomplishing this via Java subclasses of the proxy servlet.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10403", "fixedVersions": [], "id": "10403", "issueType": "New Feature", "key": "TK-21", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-06-10T19:52:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "allow a clojure callback function to manipulate the request object when using jetty's proxy servlet", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] heads up on one detail that I didn't include here:\n\nIt's possible that a service might wish to introduce multiple web endpoints.  Thus, we probably need to support something like this:\n\n```\n    web-router-service: {\n        puppetlabs.foo/foo-service: \"/foo\",\n        puppetlabs.bar/bar-service: {bar1: \"/bar1\"\n                                                       bar2: \"/bar2\"}\n    }\n```\n\nIt might make the most sense not to worry about this use case until after you get the simpler one working, but I wanted to mention it so that you could keep it in mind.", "created": "2014-07-18T10:59:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "dang it jira's code formatting is so stupid", "created": "2014-07-18T11:20:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "{code}\n web-router-service: {\n        puppetlabs.foo/foo-service: \"/foo\",\n        puppetlabs.bar/bar-service: {bar1: \"/bar1\"\n                                                       bar2: \"/bar2\"}\n }\n{code}", "created": "2014-07-18T11:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-30T11:00:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@be0b7d0"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5jb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_348268_*|*_1_*:*_1_*:*_4232560567_*|*_10007_*:*_1_*:*_765664226_*|*_3_*:*_1_*:*_975667861_*|*_5_*:*_1_*:*_0"}], "description": "With the current pattern that we're using for services to register web handlers with the WebserverService, it's becoming clear that it may eventually end up being complicated to determine a complete list of all of the web services that are running in a TK instance, and where they came from.\n\nTo improve this situation, we'd like to introduce a new (optional) service that would be called `WebRoutingService`, or similar.  It would have a dependency on the `WebserverService`, and its protocol would be almost identical to that of the `WebserverService`.  Other services that currently depend on the webserver service would change their dependency to this new service.\n\nThe new service would basically have signatures that looked something like this:\n\n{code}\n    (add-ring-handler [this svc handler])\n{code}\n\nand/or:\n\n{code}\n    (add-ring-handler [this svc handler route-id])\n{code}\n\nAnd config that looked like this:\n\n{code}\n    web-router-service: {\n        puppetlabs.foo/foo-service: \"/foo\",\n        puppetlabs.bar/bar-service: \"/bar\"\n    }\n{code}\n\nAnd the implementation of the service functions would simply look up the namespaced symbol for `svc` in the configuration data for the new `WebRouterService`, find the url path that it should be mounted at, and call through to the WebServerService.\n\nThis would only require minimal changes to existing consumers of the WebserverService, and would allow us to consolidate all of our web routes in a single section of the config file.  Furthermore, the config file would include a clear reference to the namespace/service name where the web service is defined, which should make it much easier to find the code for any running web services.\n\nThis service would depend on the feature described in TK-19.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10465", "fixedVersions": [], "id": "10465", "issueType": "New Feature", "key": "TK-20", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-08-07T14:31:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "web routing service", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-30T10:52:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7bf3da75"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyuwhj:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "null_*:*_1_*:*_0_*|*_10008_*:*_1_*:*_69950481_*|*_1_*:*_1_*:*_2619242552_*|*_10007_*:*_2_*:*_265273991_*|*_3_*:*_1_*:*_62028570_*|*_5_*:*_1_*:*_0"}], "description": "The `defservice` macro, with a slight modification, should be capable of capturing a reference to the namespaced symbol of the var that the service definition will be bound to.  If we did this, and then added a function to the Service protocol that would expose the symbol to callers, then we could potentially use those symbols in config files and we'd have a way to find the actual service instance based on the data we read from the config file.\n\nThe main use case for this would be a web routing/configuration service that is described in another ticket.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10546", "fixedVersions": [], "id": "10546", "issueType": "New Feature", "key": "TK-19", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-04T08:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Make service namespace/var available at runtime", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I have a PR in for this which I think is a huge improvement over the current implementation, and doesn't require any (meaningful) API changes.\n\nBefore it gets merged I'd like to have someone experiment with all of the linked issues (TK-15, TK-38, maybe others) and validate that this seems to address the problems that they describe.\n\nI think there was a related issue that came up which we never filed a ticket for (my fault!), which [~accountid:623e7507866b810069e57527] discovered, about not being able to use the WebroutingService with a service that didn't have a protocol, because you couldn't call `get-service` without the protocol, and because the `this` keyword didn't work properly.  We should test this fix against that issue as well, and maybe create another Jira or two to track the issues related to that (and to capture the fact that we probably ought to go back in and update the docs/examples to reflect this improvement if it does actually fix it).", "created": "2014-08-12T09:10:00.000000"}, {"author": "623e7507866b810069e57527", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] I've tested your branch with all the linked issues on this ticket. It looks to me like your PR resolves the issues detailed in all three of the tickets. With TK-15, it resolves both the issue with the threading operator and the fact that the `service-context` function is just magically in scope.", "created": "2014-08-19T17:55:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Awesome, thanks.  If this gets merged would you mind adding a comment to those other tickets and closing them out?", "created": "2014-08-20T08:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-30T10:47:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@419ffb79"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5of:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_6349144362_*|*_10007_*:*_1_*:*_753116673_*|*_3_*:*_1_*:*_37858_*|*_5_*:*_1_*:*_0"}], "description": "The current implementation of trapperkeeper builds up a Prismatic Graph object first, and then reifies instances of all of the service protocols as wrappers around the prismatic graph functions.  It might be possible to flip that logic around so that we reify the services first, and then build up a graph that wraps the protocol instances.  The tricky part would be figuring out what to do about the things that we are pulling out of Graph's binding form.\n\nIf we could make this work, then some of the functions on the Service protocol, (e.g. service-context, TK-15) would be more flexible.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10400", "fixedVersions": [], "id": "10400", "issueType": "New Feature", "key": "TK-18", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-08-20T15:39:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Improve interaction with Prismatic Graph", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "It turns out this is actually being caused by a bug in Jetty. I've submitted a PR against Jetty to fix this, but until they do a release with a fix for this issue, we won't be able to update the Jetty dependency past 9.1.2. I'm closing out this ticket. Please see [TK-32|https://puppet.atlassian.net/browse/TK-32] for the ticket involving this bug.", "created": "2014-07-11T11:57:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-23T15:26:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7ba879f1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyuwrb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "11/Jul/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4051103633_*|*_3_*:*_1_*:*_170283362_*|*_6_*:*_1_*:*_0"}], "description": "The PuppetDB devs reported that they played around with upgrading Jetty to 9.1.5 in their project.clj, and said that something about the handler registration gets screwed up.  They reported getting 404s on all endpoints.  We should investigate.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10545", "fixedVersions": [], "id": "10545", "issueType": "Bug", "key": "TK-17", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Done", "resolutionDate": "2014-07-11T12:02:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "TK jetty service not compatible with jetty 9.1.5?", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-07T16:52:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@5571453a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyr1an:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_134322_*|*_10007_*:*_1_*:*_13665374_*|*_3_*:*_2_*:*_59998122_*|*_5_*:*_2_*:*_5301888"}], "description": "In a few of the Trapperkeeper tests, run-app is executed within a future.  In some cases, this is probably unnecessary for the purpose of the test.  For any cases where an exception may be propagated up and no try/catch block were wrapped around the run-app call, the test may encounter an unexpected failure.  This ticket would cover some work to fix up these tests to avoid this unnecessary dependency.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10584", "fixedVersions": [], "id": "10584", "issueType": "Bug", "key": "TK-16", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-05-08T14:50:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Potential race conditions in Trapperkeeper unit tests around future calls", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:623e7507866b810069e57527] [~accountid:557058:635376c9-938d-43fd-9435-895dd93cbee5] this is fixed and can be closed, right?", "created": "2014-10-13T18:37:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Yeah, I think so.  As of 0.5.0, {{service-context}} is no longer always in-scope in a service - https://github.com/puppetlabs/trapperkeeper/blob/master/CHANGELOG.md.  So, yes, that part has been addressed.\n\nAnd, since it's just a normal function now, I am sure that it should work with the threading macro.  So, yeah, AFAIK this has been addressed.", "created": "2014-10-14T10:21:00.000000"}, {"author": "623e7507866b810069e57527", "body": "Yeah, I just verified it works with the threading macro. This is fixed, so I'm closing it out.", "created": "2014-10-14T10:27:00.000000"}, {"author": "623e7507866b810069e57527", "body": "Nevermind, looks like it was already closed out.", "created": "2014-10-14T10:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-06T13:15:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@694a78ed"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv1mn:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "14/Oct/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_13900031654_*|*_6_*:*_1_*:*_0"}], "description": "There is some weirdness with Trapperkeeper's {{service-context}} function.\n\nFor one, it is always just \"magically\" in-scope in a {{service}} or {{defservice}}.  (maybe this isn't too weird).\n\nAlso, there are caveats about how it must be used.  For instance, you't can't pass {{this}} to it using the threading macro:\n{noformat}\n(-> this\n    (service-context)\n    (do-something-with-service-context))\n{noformat}\nThis fails with a compile error.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10444", "fixedVersions": [], "id": "10444", "issueType": "Bug", "key": "TK-15", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Fixed", "resolutionDate": "2014-10-14T10:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "service-context function is weird", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "This is still an issue with current TrapperKeeper apps. The Jetty websever responds to a revoked certificate, or a situation that prevents cert validation like a malformed CRL, by closing the connection with a FIN packet. This results in a very opaque error message on the agent side:\n\n{noformat}\nWarning: Unable to fetch my node definition, but the agent run will continue:\nWarning: SSL_connect SYSCALL returned=5 errno=0 state=unknown state\n{noformat}\n\nIt would be a huge improvement if Jetty would send alert 44 (certificate_revoked) in the case of a revoked cert, alert 45 (certificate_expired) in the case of an expired cert, alert 48 (unknown_ca) if the cert was not issued by a trusted CA, etc.\n\nThe only time we should see a simple close with no TLS alert is if some network device in the connection path decided to dump the connection.", "created": "2018-09-24T21:31:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "The Jetty version in PE 2018.1.5 responds with a SSL alert instead of closing the connection:\n\n{noformat}\nError: /File[/opt/puppetlabs/puppet/cache/lib]: Failed to generate additional resources using 'eval_generate': SSL_connect returned=1 errno=0 state=unknown state: sslv3 alert certificate unknown\n{noformat}\n\nHowever, \"certificate unknown\" is still a very vague message, especially when a dedicated \"certificate revoked\" alert is provided by the standard. The \"unknown\" alert suggests that the server is closing the connection due to not knowing the authority that issued the certificate presented by the agent. This leads to a lot of spurious dumping of certificate files on both sides of the connection to verify that the same CA is used in all cases which leads away from the real issue of the certificate being revoked.", "created": "2018-12-17T12:34:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Here's a good list of available alert codes and when to use them:\n\nhttps://blogs.msdn.microsoft.com/kaushal/2012/10/05/ssltls-alert-protocol-the-alert-codes/", "created": "2019-08-06T14:00:00.000000"}, {"author": "61af86343618cd006f430854", "body": "Hi,\n\nThis sounds like a useful change, have you looked at creating a PR for this? The module's code is open source and we encourage community contributions.\u00a0\n\nWe actively monitor new PRs and review/merge them.\u00a0 Unfortunately, there has not been enough of a demand for this change to prioritize and resource.\n\nThank you for taking the time to create this ticket.", "created": "2022-03-08T09:50:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Re-opening this one. Using specific error codes for TLS errors is the difference between a problem solved in 15 minutes over email or several days over hour(s)-long screenshares.", "created": "2022-03-08T09:59:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-06T11:43:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1966e948"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "CS Priority", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Major"}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:b3e6b0df-198d-45f8-9ba5-d41f90e80ced"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywug7:"}, {"fieldName": "Zendesk Ticket Count", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "Zendesk Ticket IDs", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textarea", "value": "43105"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Sep/18"}], "description": "When a Puppet agent attempts to make a request to the MRI Puppet master and the agent certificate\u2019s serial number is in the master\u2019s CRL, I see the following warning in the agent\u2019s log:\n\n{noformat}\nWarning: Unable to fetch my node definition, but the agent run will continue:\nWarning: SSL_connect returned=1 errno=0 state=SSLv3 read server session ticket A: sslv3 alert certificate revoked\n{noformat}\n\nWhen doing the same test with a Puppet Server master and an underlying Jetty server whose SslContext is configured for CRL support (see PE-3914), I see the following warning in the agent\u2019s log instead of the above warning:\n\n{noformat}\nWarning: Unable to fetch my node definition, but the agent run will continue:\nWarning: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read finished A\n{noformat}\n\nDoing some packet tracing with Wireshark, the main difference I\u2019ve noticed between the two is that the MRI Puppet master generates an SSLv3 alert for \u201ccertificate revoked\u201d (44) before sending the FIN packet for the connection whereas the JVM Puppet master sends no SSLv3 alert.\n\nIf DEBUG level logging is enabled for the Jetty server in the Puppet Server master, there is a more specific message logged about the certificate revocation failure.  This would only be seen in the master-side log, though.  Also, the failure message does not appear to identify anything specific about the client other than the revocation date of the certificate.\n\n[~accountid:63d40628f6e1b543161789a7] indicated that it would be nice if we could get the Jetty server to send the SSLv3 certificate revoked alert as it would help with agent-side error reporting.  Part of the issue is that \"read finished A\" can happen for a lot of other reasons, e.g. the client sent SSLv2 client hello, the client TCP connected, but never sent a hello, the server timed out the client, ...  [~accountid:63d40628f6e1b543161789a7] did not indicate that this is a clear showstopper, however.  ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10397", "fixedVersions": [], "id": "10397", "issueType": "Improvement", "key": "TK-150", "labels": ["jira_escalated"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Low (migrated)", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "status": "Open", "statusCategory": "To Do", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Investigate adding SSLv3 certificate revoked alert to Jetty / Java", "timeSpent": "PT0S", "updated": "2022-03-08T09:59:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "Additionally commentary from Anna:{quote}For me, the length of time the master takes to restart isn't the primary issue - it's that I'm trying to coordinate node life cycles from a remote orchestrator tool that won't be granted the privileges needed to perform such a restart{quote}", "created": "2015-02-17T22:38:00.000000"}, {"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "Given the comment above, would it make sense to put the refresh on a configurable timer? Would that sidestep concurrency issues?", "created": "2015-02-17T22:41:00.000000"}, {"author": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "body": "[~accountid:557058:db3c8c5c-5825-4424-a788-64c2fa922e24] The concurrency issues I was referring to above were around how the SSLContext that Jetty uses to enforce the CRL is managed.  We'd need to be able to update it at runtime without adversely affecting Jetty's use of it during the processing of incoming connections.  This concurrency issue would exist regardless of what trigger we'd use to update it.  It should be relatively straightforward to handle the concurrency", "created": "2015-02-18T08:55:00.000000"}, {"author": "557058:db3c8c5c-5825-4424-a788-64c2fa922e24", "body": "[~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f] thanks for the additional context.\n\nNo problem with this being public.\n\nw/r/t to knowing when to reload the CRL, I suspect in an environment with lots of ephemeral nodes you would get bursts of revocations that come in one at a time from a single delete action performed serially, which could make watching the CRL file problematic. ", "created": "2015-02-18T22:31:00.000000"}, {"author": "557058:41dc5120-addb-42c7-aff4-2d00c35c948c", "body": "[~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] Can you review these?", "created": "2017-07-14T11:11:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "[~accountid:557058:41dc5120-addb-42c7-aff4-2d00c35c948c] Yea I can definitely run with these. Should I also be updating the PRs as needed, or is there someone else who will be on that?", "created": "2017-07-14T11:15:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "[~accountid:557058:1db5c8e0-e1c5-41a9-9ae9-281047124514] IMHO, the right way for QA to test this (should QA conclude this is a high risk ticket) is to create a beaker test that adds an agent's cert to the CRL, then tries an agent run.  Expected Result = agent run files with a code and message that indicate the certificate is no longer valid.\n\nI kind of thought we'd have a test that does this already, but with a puppet server restart after the CRL is incremented.  Maybe we are doing this as a clojure integration test.  If we are doing this as a clojure integration test, there's no need for QA to get involved with a beaker test. ", "created": "2017-07-18T12:31:00.000000"}, {"author": "557058:b6301e26-c165-42d0-ab3a-59124339555e", "body": "[~accountid:557058:bab073e0-f060-421e-9465-366c4060cc31] There is already a clojure test in both the puppetserver PR and the tk jetty PR that does exactly that. I'd prefer to not duplicate this test in beaker.\n\nThe puppetserver PR also adjusts one of the existing beaker tests to expect the CRL refresh to not require a service restart/reload.", "created": "2017-07-18T12:36:00.000000"}, {"author": "557058:bab073e0-f060-421e-9465-366c4060cc31", "body": "Found clojure integration test that covers this modification:\nhttps://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/177/files#diff-a1d74a2a9e21cffe9067894637a1fbe0R379\n\nDiscussed briefly with @haus on HipChat in the \"Enterprise in the Cloud etc\" room.  We think this is medium risk and that QA should have a manual test, once, to validate behavior with multiple agents.", "created": "2017-07-18T12:40:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "merged to trapperkeeper-webserver-jetty9/1.x at https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/commit/a9aaf57122cfdc905a9c7023a0af30b9c980f249", "created": "2017-07-18T15:08:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "The unit test added with puppetserver 2.x PR https://github.com/puppetlabs/puppetserver/pull/1461/files fails on JDK 7 on Ubuntu 14.04 . Need to assess impact / support for JDK 7 \n\nThe specific failure is:\n{code}\n     ERROR in (crl-reloaded-without-server-restart) (FileDispatcherImpl.java:-2)\nnode request after revocation fails\nexpected: (loop [times 30] (println \"Errored at least once\") (cond (ssl-exception-for-request?) true (zero? times) false :else (do (Thread/sleep 500) (recur (dec times)))))\n  actual: java.io.IOException: Connection reset by peer\n at sun.nio.ch.FileDispatcherImpl.read0 (FileDispatcherImpl.java:-2)\n    sun.nio.ch.SocketDispatcher.read (SocketDispatcher.java:39)\n    sun.nio.ch.IOUtil.readIntoNativeBuffer (IOUtil.java:223)\n    sun.nio.ch.IOUtil.read (IOUtil.java:197)\n    sun.nio.ch.SocketChannelImpl.read (SocketChannelImpl.java:384)\n    org.apache.http.nio.reactor.ssl.SSLIOSession.receiveEncryptedData (SSLIOSession.java:449)\n    org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady (SSLIOSession.java:503)\n    org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady (AbstractIODispatch.java:122)\n    org.apache.http.impl.nio.reactor.BaseIOReactor.readable (BaseIOReactor.java:164)\n    org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent (AbstractIOReactor.java:339)\n    org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents (AbstractIOReactor.java:317)\n    org.apache.http.impl.nio.reactor.AbstractIOReactor.execute (AbstractIOReactor.java:278)\n    org.apache.http.impl.nio.reactor.BaseIOReactor.execute (BaseIOReactor.java:106)\n    org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run (AbstractMultiworkerIOReactor.java:590)\n    java.lang.Thread.run (Thread.java:745)\n{code}\n\n", "created": "2017-07-26T15:39:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "I'm wondering if this might be something about the libraries or implementation that varies between JDK 7 and 8 or the platforms..\n\nNote that we expect an exception to occur in the test - specifically, a ConnectionClosedException: https://github.com/puppetlabs/puppetserver/blob/2.x/test/integration/puppetlabs/services/certificate_authority/certificate_authority_int_test.clj#L330\n\nThe full trace of that exception, when we get it, is:\n{code}\ncaught exception org.apache.http.ConnectionClosedException: Connection closed\norg.apache.http.ConnectionClosedException: Connection closed\n\tat org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:341)\n\tat org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:263)\n\tat org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)\n\tat org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)\n\tat org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:123)\n\tat org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:164)\n\tat org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:339)\n\tat org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:317)\n\tat org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:278)\n\tat org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:106)\n\tat org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:590)\n\tat java.lang.Thread.run(Thread.java:745)\n{code}\n\nNote that the variation in the traces begins at {{at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:123}}\n\nCould our expected exception be too strict given the circumstances? [~accountid:557058:b6301e26-c165-42d0-ab3a-59124339555e] [~accountid:557058:104b5720-714d-4539-b455-df472251ec89]\n", "created": "2017-07-26T17:56:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "The outcome from the discussing the failures associated with Java 7:\n\n* The library used by file system watch service is known to be buggy on Java 7\n* Puppet Server 2.x open source supports Java 7 and 8, while PE ships with Java 8 only so this is less of an issue\n* To avoid possibly destabilizing puppet server 2.x series so late in its life, we will make the file system watch service optional, and not include it by default\n* In PE where we ship Java 8, we will enable the watch service by default\n* Users of FOSS 2.x who desire the CRL reload behavior and are on Java 8 can enable it by uncommenting a line in their bootstrap.cfg\n\nA PR has been raised to puppetserver/2.x to make the reload behavior optional and disabled by default:\nhttps://github.com/puppetlabs/puppetserver/pull/1475\n\nA separate ticket in PE has been filed to enable the watch service by default in PE: PE-21894", "created": "2017-08-07T12:34:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "Separately from the test failure noted in this PR, we also had additional failures in the pe-puppet-server-extensions acceptance suite, wherein during the lifecycle of those tests the puppetserver service would unexpectedly fall over.\n\nWe ultimately determined that this was due to the creation of an unreadable root-owned directory in the ssl dir that we were watching, because the watch service was attempting to traverse the new directory to recursively watch new files.\n\nThis means TK-448, which was originally thought to be a \"nice-to-have\" is actually a blocker for this functionality as well. A separate PR has been raised to support non-recursive watching, here:\nhttps://github.com/puppetlabs/trapperkeeper-filesystem-watcher/pull/17\n\nAn additional PR is open against trapperkeeper-webserver-jetty9 to use the non-recursive form of the watch service, here: https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/pull/182.\n\nAn additional PR is open against puppetserver/2.x to use the non-recursive form of the watch service, here: https://github.com/puppetlabs/puppetserver/pull/1476\n", "created": "2017-08-07T12:38:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "We again encountered unexpected issues in CI. The pe-pse file-sync acceptance suite is failing. It appears that the way we set up compile masters in those tests results in a ssl dir owned by root/root and nontraversable by other users. somewhere in all the crazy implicit management of ssl dir we end up trying to start pe-puppetserver without the dir being propertly owned by pe-puppet, which results in a failure to start. we addressed this issue previously in the pe_install module by explicitly managing the ownership of the ssl dir before the pe-puppetserver service started. \n\nLink https://cinext-jenkinsmaster-enterprise-prod-1.delivery.puppetlabs.net/view/pe-puppet-server-extensions/job/enterprise_pe-puppet-server-extensions_integration-system_file-sync-glisan/28/LAYOUT=redhat7-64mdcla-64compile_master.fa-64compile_master.fa-64a-64a,LDAP_TYPE=default,SAUCE=default,UNEEDED=UNEEDED,label=beaker/consoleFull\n\nActual failures appear to be caused by the fact that after installing the test version of pe-puppetserver, the pe-puppetserver service fails to start. Same access denied error as before with the {{$ssldir/ca/private}} dir, except this time its actually just {{$ssldir}} itself that's raising the error.\n\npossible options:\n- manage the ssl dir in the master profile of the puppet_enterprise module in the same way we do during pe_install \n- just chown the directory in the pe-puppetserver post\n- manipulate the somehow to ensure that puppet has reset the directory permissions before we try to start the service (assuming this is safe because we're in a very contrived case here that a real user wouldn't hit)\n\n\n", "created": "2017-08-18T12:28:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "New PR Is up that causes us to chown the directory in the post of the pe-puppetserver install.\n\nhttps://github.com/puppetlabs/pe-puppetserver/pull/215", "created": "2017-08-19T13:33:00.000000"}, {"author": "557058:e484fb55-2ddc-43a0-968e-11d70ae3153c", "body": "released in tk-jetty9 1.8.1", "created": "2017-08-23T10:13:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-06T10:42:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@395d0c28"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "623c0ff494742a00683e3fe4"}, {"fieldName": "QA Risk Assessment", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Manual"}, {"fieldName": "QA Risk Assessment Reason", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:textfield", "value": "Fairly large change, but well covered with clojure integration tests as doced.  Test once manually with multiple agents."}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hylmjr:"}, {"fieldName": "Release Notes", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "New Feature"}, {"fieldName": "Scrum Team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Puppet Server"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "17/Feb/15"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_2_*:*_90608744_*|*_1_*:*_1_*:*_14559638726_*|*_10007_*:*_3_*:*_3103560351_*|*_3_*:*_2_*:*_344196289_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_2_*:*_3088821986_*|*_10005_*:*_1_*:*_82923459638"}], "description": "The CRL option which can be set on the SslContextFactory in Jetty (see PE-3914) only allows the CRL to be established at Jetty server start time, by default.  For backward compatibility with the CRL behavior in Puppet Server, only loading the CRL at service start time may be sufficient.  However, we may want to improve upon this further by allowing the certs loaded into the CRL to be used by a Jetty server right away -- without needing to restart Puppet Server and its underlying Jetty.  Run-time reloading of the CRL could be desirable for other components built on the trapperkeeper-webservices-jetty9 service - including PuppetDB and PE Console Services.\n\n*Ticket scope*\n\nHere is a proposal for the scope of this ticket:\n\n1) Investigate approaches for safely, concurrently swapping out the {{SslContextFactory}} in the Jetty webserver without needing to restart a currently started Jetty ServerConnector.\n\n2) Use the {{trapperkeeper-filesystem-watcher}} service to register a watcher for the CRL file (and, optionally, the keystore, truststore, and associated parameters which map to files on disk).\n\n3) On receipt of a filesystem-watcher notification for a changed file, invoke some functionality to refresh Jetty's {{SslContextFactory}} instance(s) for the appropriate Server / connectors (without the need for a server restart).\n\n*Additional Jetty background*\n\nThe entries in the CRL cert are only processed by Jetty when doStart() is called on the SslContextFactory.  From this point on, the CRL entries are referenced by the factory in memory.\n\nI was able to force Jetty to reload the CRL entries from the cert on disk by having the Jetty webserver service create a custom, derived SslContextFactory which overrides a method that Jetty calls when handling a new client connection, newSSLEngine.  Here is the implementation I used:\n\n---\n{code}\n(defn- ssl-context-factory-with-crl-refresh []\n  (proxy [SslContextFactory] []\n    (newSSLEngine\n      ([] (proxy-super newSSLEngine))\n      ([^InetSocketAddress address]\n        (.stop this)\n        (.start this)\n        (proxy-super newSSLEngine address)))))\n{code}\n----\n\nThe derived class is referenced in place of the Java SslContextFactory by changing the following line in jetty9-core's ssl-context-factory function:\n\n{code}\n  [context (ssl-context-factory-with-crl-refresh)]\n{code}\n\n---\n\nFor the overload of newSSLEngine() which includes an address parameter, the underlying SslContextFactory is stopped and restarted.  This causes the doStart() method on the class to be run again, loading entries from the CRL cert on disk back into memory and attaching them to a new SslContext object.\n\nThis is a naive implementation which would recreate the SslContext for each connection that the server services.  The performance of this solution at scale would probably not be desirable.  To optimize this further, it may make sense to create a file watcher around the CRL file and only regenerate the SslContext when the content of the file has actually changed.  If this were done asynchronously from the handling of a request on the server side, the impact to clients could be significantly reduced.\n\nAdditionally, any solution in this area would need to handle concurrency.  The example above does not do that.  The Jetty server may be servicing several requests simultaneously and, so, any changes which would need to be made to the SslContext would need to be protected for concurrent access so as to avoid temporary problems in connection handling -- e.g., connection failed or (even worse) unauthorized connection succeeds because the CRL hasn't been fully reattached to the context before a client request is validated against it.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10312", "fixedVersions": ["TK-JETTY9 1.8.1"], "id": "10312", "issueType": "New Feature", "key": "TK-149", "labels": ["AWS1"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2017-08-23T10:13:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Runtime refresh of Jetty CRL (jetty 1.8)", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "2", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-02T17:30:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@66ad10b6"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywivz:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_14173605003_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858745527_*|*_10005_*:*_1_*:*_231125195542"}], "description": "@ruth pointed out that a common use case for any small apps that are service static resources is that they're going to want the ability to redirect requests to \"/\" to an index page.  We should see if the current implementation of `add-context-handler` already supports this, and if not, see if it would be easy to add that.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10310", "fixedVersions": [], "id": "10310", "issueType": "Task", "key": "TK-14", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:36:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "determine whether or not the add-context-handler in the jetty service supports a redirect for an index page", "timeSpent": "PT0S", "updated": "2022-02-18T17:36:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-02T17:01:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@231ee09b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyq05r:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "2.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_5162249516_*|*_10007_*:*_1_*:*_9855685_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10464", "fixedVersions": [], "id": "10464", "issueType": "Task", "key": "TK-13", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-01T13:43:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Change examples in docs from .ini to .conf", "timeSpent": "PT0S", "updated": "2022-02-03T07:07:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-02T16:45:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72ad8e3a"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyuwhz:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_5247945365_*|*_10007_*:*_1_*:*_91753209_*|*_3_*:*_1_*:*_4872805_*|*_5_*:*_1_*:*_0"}], "description": "We've started using the HOCON format for most of the configuration for our internal services.  It's an improvement over ini in many ways.  We should update the trapperkeeper leiningen template to use them in its examples.\n\nAnd while we're at it, we should update to the most recent versions of all of the projects.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10542", "fixedVersions": [], "id": "10542", "issueType": "Task", "key": "TK-12", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Major", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-03T13:21:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Update lein template to use a better config format", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "623c15e38d8b9c0068b8b47d", "body": "Pull request for this feature: https://github.com/puppetlabs/trapperkeeper/pull/147", "created": "2014-05-02T10:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-05-02T10:17:00.000000", "creator": "623c15e38d8b9c0068b8b47d", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@46e072dc"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyr0tb:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_2673394_*|*_1_*:*_1_*:*_890746_*|*_10007_*:*_1_*:*_257876784_*|*_10009_*:*_1_*:*_162473252_*|*_5_*:*_2_*:*_8488132"}], "description": "Clojure IDE like LightTable need custom additional nrepl middleware to be able to talk to the nrepl.\nThis is already supported by lein directly but it is not possible in the nrepl service.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10582", "fixedVersions": [], "id": "10582", "issueType": "New Feature", "key": "TK-11", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "623c15e38d8b9c0068b8b47d", "resolution": "Fixed", "resolutionDate": "2014-05-07T10:24:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Support custom nrepl middlewares", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-05-01T12:57:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@4322b59c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyuwhr:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_65031000_*|*_1_*:*_1_*:*_4929401982_*|*_10007_*:*_1_*:*_268965534_*|*_3_*:*_1_*:*_251166210_*|*_5_*:*_1_*:*_0"}], "description": "This was [~accountid:557058:50693b46-2d67-4417-b1cc-9b21dadb467f]'s suggestion during our recent whiteboarding session on how to make it easy to discover registered web endpoints.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10443", "fixedVersions": [], "id": "10443", "issueType": "Task", "key": "TK-10", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-04T08:47:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "add function to jetty service that causes it to print out all registered endpoints", "timeSpent": "PT0S", "updated": "2022-02-03T07:02:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-04-30T14:14:00.000000", "creator": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@65421fb2"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyq05j:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_4921185993_*|*_10007_*:*_1_*:*_15731523_*|*_5_*:*_1_*:*_0"}], "description": "The TrapperKeeper usage message states that the -c options is the path to an .ini or directory of .ini files, but hocom .conf files are now also supported.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10630", "fixedVersions": [], "id": "10630", "issueType": "Bug", "key": "TK-9", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:030c0c27-db47-4e72-b56f-d63a9eca4314", "resolution": "Fixed", "resolutionDate": "2014-06-26T17:36:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "The usage message specifically mentions .ini files as config", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-04-29T17:32:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@64aac205"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hytyfb:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_8679160_*|*_1_*:*_1_*:*_9636_*|*_10007_*:*_1_*:*_60933463_*|*_3_*:*_1_*:*_110147_*|*_5_*:*_1_*:*_0"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10645", "fixedVersions": [], "id": "10645", "issueType": "Sub-task", "key": "TK-8", "labels": [], "originalEstimate": "PT0S", "parent": "10575", "parentSummary": "port jetty config validation to use prismatic schema", "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-04-30T12:54:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "don't use 'schema.macros' directly", "timeSpent": "PT0S", "updated": "2022-02-03T07:04:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-04-28T15:35:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@7ea587a1"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywugf:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_14526114696_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_858739336_*|*_10005_*:*_1_*:*_231125169130"}], "description": "Currently, if the trapperkeeper-webserver-jetty9 service is started with both PEM-based (ssl-ca-cert, ssl-key, ssl-cert) and Keystore-based (keystore, key-password, truststore, trust-password) options specified for an SSL port binding, the PEM options are honored and the Keystore options are ignored.  A warning about the conflict is logged.\n\nTo make the conflict more obvious, it may be better to throw an exception and not allow the application to proceed.  [~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] thought that there may be some compatibility implications to research before committing to making this change, so I just logged this as a ticket for future consideration.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10393", "fixedVersions": [], "id": "10393", "issueType": "Improvement", "key": "TK-7", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Minor", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:35:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Consider having Jetty9 error out if both PEM and Keystore SSL options specified", "timeSpent": "PT0S", "updated": "2022-02-18T17:35:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [{"author": "623e7507866b810069e57527", "body": "It looks like this was an issue with leiningen 2.3.4. I've verified that 2.3.4 show this behavior, but it's been eliminated in 2.4.x. ", "created": "2014-08-19T15:20:00.000000"}, {"author": "623e7507866b810069e57527", "body": "I'm closing this since upgrading to lein 2.4.x eliminates the problem.", "created": "2014-08-19T15:29:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-04-25T10:26:00.000000", "creator": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@77123b64"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv1mf:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "19/Aug/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_10040608897_*|*_6_*:*_1_*:*_0"}], "description": "I have noticed one case in which the Trapperkeeper -main function is called twice for one \"lein run\" invocation.  This occurs when I specify an argument for --bootstrap-config and/or --config which refers to a file which cannot be found.  I verified the second invocation of -main by putting a println trace statement at the beginning of -main.\n\nFor several other cases that I've traced, I haven't seen the second invocation of -main, including:\n\n- Bad cli arg caught by clj-kitchensink (e.g., add \"--bogus\" to the end of the \"lein run\" command line).\n\n- Exception thrown in `service` init which triggers normal shutdown processing.\n\n- Manually introduced exception thrown inside the body of the \"main\" function.\n\nIn conjunction with the case which showed the second invocation, I also dumped the stack to the console.  Below are the stacks for the first and second invocation.  Note that the second invocation has a number of frames involving reflection code which do not appear in the first invocation:\n\nFirst invocation:\n\njava.lang.Exception: Stack trace\n\tat java.lang.Thread.dumpStack(Thread.java:1364)\n\tat puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:10)\n\tat clojure.lang.RestFn.invoke(RestFn.java:457)\n\tat clojure.lang.Var.invoke(Var.java:427)\n\tat user$eval536$fn__538.invoke(form-init7654551998651054391.clj:1)\n\tat user$eval536.invoke(form-init7654551998651054391.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6619)\n\tat clojure.lang.Compiler.eval(Compiler.java:6609)\n\tat clojure.lang.Compiler.load(Compiler.java:7064)\n\tat clojure.lang.Compiler.loadFile(Compiler.java:7020)\n\tat clojure.main$load_script.invoke(main.clj:294)\n\tat clojure.main$init_opt.invoke(main.clj:299)\n\tat clojure.main$initialize.invoke(main.clj:327)\n\tat clojure.main$null_opt.invoke(main.clj:362)\n\tat clojure.main$main.doInvoke(main.clj:440)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:163)\n\tat clojure.lang.Var.applyTo(Var.java:532)\n\tat clojure.main.main(main.java:37)\n\nSecond invocation:\n\nava.lang.Exception: Stack trace\n\tat java.lang.Thread.dumpStack(Thread.java:1364)\n\tat puppetlabs.trapperkeeper.main$_main.doInvoke(main.clj:10)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:137)\n\tat puppetlabs.trapperkeeper.main.main(Unknown Source)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:606)\n\tat clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)\n\tat clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:606)\n\tat clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)\n\tat clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)\n\tat user$eval536.invoke(form-init7654551998651054391.clj:1)\n\tat clojure.lang.Compiler.eval(Compiler.java:6619)\n\tat clojure.lang.Compiler.eval(Compiler.java:6609)\n\tat clojure.lang.Compiler.load(Compiler.java:7064)\n\tat clojure.lang.Compiler.loadFile(Compiler.java:7020)\n\tat clojure.main$load_script.invoke(main.clj:294)\n\tat clojure.main$init_opt.invoke(main.clj:299)\n\tat clojure.main$initialize.invoke(main.clj:327)\n\tat clojure.main$null_opt.invoke(main.clj:362)\n\tat clojure.main$main.doInvoke(main.clj:440)\n\tat clojure.lang.RestFn.invoke(RestFn.java:421)\n\tat clojure.lang.Var.invoke(Var.java:419)\n\tat clojure.lang.AFn.applyToHelper(AFn.java:163)\n\tat clojure.lang.Var.applyTo(Var.java:532)\n\tat clojure.main.main(main.java:37)\n\nNot sure if this is a problem with something Trapperkeeper is doing or something lein/clojure is doing.\n\nNote that for my testing I was using Leiningen 2.3.4 (latest stable at time this ticket was submitted) in conjunction with JDK 7 (1.7.0_51).", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10242", "fixedVersions": [], "id": "10242", "issueType": "Bug", "key": "TK-6", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "resolution": "Fixed", "resolutionDate": "2014-08-19T15:29:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Trapperkeeper -main called twice in some cases", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": "623e7507866b810069e57527", "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-04-13T11:20:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@25815bb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyq04v:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_5853836_*|*_1_*:*_1_*:*_21516022_*|*_10007_*:*_1_*:*_73330294_*|*_3_*:*_1_*:*_11854303_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_6291502660"}], "description": "Currently, when booting trapperkeeper, you must pass a \"--config\" argument on the cli to specify the directory where your configuration lives.  In practice, it's unlikely that a real-world app would ever have a use case where it didn't need some configuration, but, it's a very annoying and confusing roadblock to people who are just playing around with the framework to see how it works.  We should be able to get rid of this requirement, and maybe just log a warning if you boot without specifying a configuration path.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10264", "fixedVersions": [], "id": "10264", "issueType": "Bug", "key": "TK-5", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-06-26T14:14:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "get rid of requirement for \"--config\" arg", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-04-01T14:21:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@3050451f"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyr0sn:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "3.0"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_422633_*|*_1_*:*_1_*:*_18197784_*|*_10007_*:*_2_*:*_392720198_*|*_3_*:*_2_*:*_5803558_*|*_4_*:*_1_*:*_252077450_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_1731610324"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10575", "fixedVersions": [], "id": "10575", "issueType": "Improvement", "key": "TK-2", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-04-29T09:15:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "port jetty config validation to use prismatic schema", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "No reason to bother with this until we get through with the pending changes to the jetty9 service (TK-2, TK-3).", "created": "2014-04-19T13:28:00.000000"}, {"author": "557058:aa277a93-6688-4f34-ad9d-e53477acf74b", "body": "Closing this as \"won't do\" as we are several years past where Jetty 7 was retired.", "created": "2018-09-24T21:22:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-03-17T15:51:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@2c8ac3fe"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuin:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Sep/18"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_157261149_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_18855412103_*|*_10005_*:*_1_*:*_123739968421"}], "description": "I think that the majority of the tests in the jetty9 service should work against the jetty7 version (and probably just about any other implementation of the protocol).  It's probably time to pull out the protocol and the tests into their own project and have the jetty9 service depend on that... then, refactor common code that can be re-used by the j7 service into a separate artifact and refactor both j7 and j9 to use that.  This should make it much easier to keep them in sync in the future, and probably will also make it easier to provide other implementations of the protocol (http-kit?  netty?) if we decide to do that.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10643", "fixedVersions": [], "id": "10643", "issueType": "Task", "key": "TK-4", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2018-09-24T21:22:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "backport latest jetty9 changes to jetty7", "timeSpent": "PT0S", "updated": "2022-02-03T07:08:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-03-12T11:06:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@760659eb"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywujz:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_77482135_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_19384556139_*|*_10005_*:*_1_*:*_67569300540"}], "description": "1. A service passes a function {{f}} to {{shutdown-on-error}} (this is good).\n2. When {{f}} executes, it throws an exception.\n3. The service is being exercised via a test that only bootstraps TK (does *not* run it).\n\nIn this situation, the exception will *not* bubble up or cause the test to fail, and it will also *not* be logged.\n\nThis is due to the implementation of our shutdown stuff.  {{shutdown-on-error}} handles the exception by delivering a {{promise}} - however, since the app has only been *bootstrapped*, not run, nobody has called {{wait-for-shutdown}} - meaning, nothing will handle the {{promise}} when it is delivered.\n\nThis is a landmine.\n\nThere are multiple possible solutions:\n* document this and move on\n* re-work our testutils and docs to enforce that services are only tested with a running TK, not just bootstrapped\n* improve our shutdown / framework stuff to \"work\" (bubble up and/or log the exception) in this case.\n* ???\n* profit", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10386", "fixedVersions": [], "id": "10386", "issueType": "Bug", "key": "TK-135", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Fix", "resolutionDate": "2016-12-13T17:28:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "shutdown-on-error can swallow errors during testing", "timeSpent": "PT0S", "updated": "2022-02-03T07:06:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "Just realized that {{shutdown-on-error}} is a service function.  That makes this a bit more difficult.  Not sure how it would be implemented ... don't think it can continue being a service function if it is to be converted to a macro.", "created": "2014-03-18T16:16:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I had another idea on how we could improve on {{shutdown-on-error}} - perhaps we could write a new macro which would become the new API for this functionality: it would simply take a form and wrap it with a call to shutdown on error.  It could also in-line the service ID, instead making all callers pass {{(service-id this)}}.", "created": "2014-04-02T10:51:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-03-08T13:46:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@1b2f6a7b"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "QA Contact", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:userpicker", "value": "557058:151c148a-2bb4-4fdc-9320-df94e73b0363"}, {"fieldName": "QA Status", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:select", "value": "Reviewed"}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuj3:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_150694977_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_19643708819_*|*_10005_*:*_1_*:*_231124926104"}], "description": "{{shutdown-on-error}} is a function that takes a function as an argument.  It would be more idiomatic as a macro, so you could just write:\n{noformat}\n(shutdown-on-error\n  (do-stuff ... ))\n{noformat}\nCurrently, that chunk of code will compile and run, but it's broken, in that {{do-stuff}} will actually execute *before* {{shutdown-on-error}}, so it won't be wrapped in the proper error-handling/shutdown logic.  This is the bug that [~accountid:557058:030c0c27-db47-4e72-b56f-d63a9eca4314] ran into - it's an easy landmine to step on.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10263", "fixedVersions": [], "id": "10263", "issueType": "Improvement", "key": "TK-137", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2022-02-18T17:35:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "convert shutdown-on-error to a macro", "timeSpent": "PT0S", "updated": "2022-02-18T17:35:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [], "components": ["TrapperKeeper"], "created": "2014-03-03T14:09:00.000000", "creator": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@55f5e384"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywuk7:"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_1679228_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_20223337979_*|*_10005_*:*_1_*:*_67569725221"}], "description": "compojure apps can be made to automatically reload any changed files on each HTTP request.  This is a big time-saver during development.  Make this work with trapperkeeper.\n\nYou can see an example of this by creating a new compojure app (via the template).  Notice that it adds a couple of extra dev dependencies, and that when the server is started with {{lein run}}, it will automatically reload any changed files on each request.  When you turn your web-app into a TK service, you currently lose this functionality.  ", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10313", "fixedVersions": [], "id": "10313", "issueType": "Improvement", "key": "TK-132", "labels": ["qa-reviewed"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "resolution": "Won't Do", "resolutionDate": "2016-12-13T17:35:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "enable Compojure's auto-reload functionality", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "License appears in both README and LICENSE.", "created": "2014-02-28T15:14:00.000000"}, {"author": "557058:c241032a-c552-4408-9a96-dcd5a643ff69", "body": "This is common across a bunch of our repos, and I think the project this refers to is archived. Closing.", "created": "2022-01-13T13:23:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-02-28T15:12:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@41750d2c"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hywujj:"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "13/Jan/22"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_834817_*|*_6_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_20479646155_*|*_10005_*:*_1_*:*_227999434476"}], "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10538", "fixedVersions": [], "id": "10538", "issueType": "Task", "key": "TK-136", "labels": ["low-hanging-fruit"], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Won't Do", "resolutionDate": "2022-01-13T13:24:00.000000", "status": "Closed", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "remove LICENSE file from trapperkeeper template?", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "This will be *much* easier to implement once we've cleaned up the configuration syntax by porting over to use Prismatic schema.", "created": "2014-04-19T13:26:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "[~accountid:70121:1f7c5098-d991-4129-bcae-5fc413f71091] how soon do you expect that someone would begin work on something that could leverage this?", "created": "2014-06-25T12:36:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "@ruth cool, thanks for the heads up.  I don't think it should be a problem for us to get this done before then.", "created": "2014-06-25T14:20:00.000000"}], "components": ["TrapperKeeper"], "created": "2014-02-09T20:46:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@72be3dc4"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyv0in:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "5.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "25/Jun/14"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "10008_*:*_1_*:*_34251_*|*_1_*:*_1_*:*_43123277_*|*_10007_*:*_1_*:*_690480054_*|*_3_*:*_1_*:*_591345977_*|*_5_*:*_1_*:*_0_*|*_10006_*:*_1_*:*_12290144198"}], "description": "One use case for this is for apps that need to have an admin dashboard web page.  We may want for the admin dashboard to be able to be configured to use a different port and SSL configuration than the rest of the web services.\n\nThe implementation I've been playing around with would be to simply give an id to the Jetty server instance, and allow you to configure more than one of them in a single instance of the WebserverService.  The existing config syntax would be supported, and would result in a single embedded server instance with an id of `:default`.  For each  of the `add\\-\\*\\-handler` functions, we'd add a corresponding `add\\-\\*\\-handler-to` function, which would have an additional argument `server-id` in the function signature.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10573", "fixedVersions": [], "id": "10573", "issueType": "New Feature", "key": "TK-3", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-07-17T11:45:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "Jetty service: support multiple isolated servers on different ports", "timeSpent": "PT0S", "updated": "2022-02-03T07:05:00.000000", "votes": "0", "watchers": []}, {"affectedVersions": [], "assignee": null, "attachments": [], "comments": [{"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Probably punting this one until a second request for the feature comes up.", "created": "2013-12-18T12:25:00.000000"}, {"author": "557058:1381f112-1c4e-4869-ba34-30602d945124", "body": "I would like this to happen, too! I'm currently just using the var directly, but it would be nice to not have to var-quote it.\n\nI want this for the exact same reasons as Patrick, though, so perhaps it doesn't count as a \"second request.\"", "created": "2013-12-20T16:46:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "Hey [~accountid:557058:1381f112-1c4e-4869-ba34-30602d945124], thanks for the input.\n\nCan you give us a few more details?  Are you writing a cli tool for NC?  Is it something we expect to ship?\n\nWhen you say you're using the var directly, I presume that you mean that you're accessing the `parse-config-file` function via it's var in order to work around the fact that it is currently marked as private?", "created": "2013-12-26T10:19:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "I'm going to close this issue because it's been open for a long time with no response.  I also can't think of a situation in which it still applies.  Feel free to re-open if there's any interest in this still.", "created": "2014-06-10T18:58:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "I have a concrete and fairly immediate use-case for this, so I'm re-opening it.", "created": "2014-08-21T10:02:00.000000"}, {"author": "557058:635376c9-938d-43fd-9435-895dd93cbee5", "body": "[~accountid:557058:a3132145-aae4-410f-9f7a-85a3117a0c14] - out of curiosity, what is your use-case?", "created": "2014-08-21T12:32:00.000000"}, {"author": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "body": "We are going to need to add a command-line tool or two to one of our other projects, and the implementation will rely on some config values.", "created": "2014-08-21T13:27:00.000000"}], "components": ["TrapperKeeper"], "created": "2013-12-17T18:02:00.000000", "creator": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "customFieldValues": [{"fieldName": "Sub-team", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "Approvals", "fieldType": "com.atlassian.servicedesk.approvals-plugin:sd-approvals", "value": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@6849eb10"}, {"fieldName": "Epic/Theme", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:labels", "value": []}, {"fieldName": "People Involved", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multiuserpicker", "value": []}, {"fieldName": "Flagged", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes", "value": []}, {"fieldName": "Rank", "fieldType": "com.pyxis.greenhopper.jira:gh-lexo-rank", "value": "0|hyu5p3:"}, {"fieldName": "Story Points", "fieldType": "com.atlassian.jira.plugin.system.customfieldtypes:float", "value": "1.0"}, {"fieldName": "[CHART] Date of First Response", "fieldType": "com.atlassian.jira.ext.charting:firstresponsedate", "value": "20/Dec/13"}, {"fieldName": "[CHART] Time in Status", "fieldType": "com.atlassian.jira.ext.charting:timeinstatus", "value": "1_*:*_1_*:*_77036561_*|*_10007_*:*_1_*:*_22768956_*|*_3_*:*_1_*:*_1566875_*|*_4_*:*_2_*:*_174062_*|*_5_*:*_1_*:*_0_*|*_6_*:*_1_*:*_6188582433_*|*_10006_*:*_1_*:*_15042723186"}], "description": "If users want to write a command-line tool that doesn't make sense to boot the full trapperkeeper framework for, but they still want to leverage trapperkeeper's configuration data, they should be able to.\n\nRight now we have a private function called `parse-config-file` that would serve exactly this purpose, but it's private, and its name also makes it a bit too coupled with the current implementation.  I propose that we make it public and change the name to `load-config`, or, provide a wrapper function called `load-config` that users could call.", "epicLinkSummary": null, "estimate": "PT0S", "externalId": "10461", "fixedVersions": [], "id": "10461", "issueType": "Improvement", "key": "TK-60", "labels": [], "originalEstimate": "PT0S", "parent": null, "parentSummary": null, "priority": "Normal", "projectDescription": "This is the public issue tracker for Trapperkeeper, an open-source Clojure framework for applications and services.  For more info, see the <a href=\"https://github.com/puppetlabs/trapperkeeper-webserver-jetty9/blob/master/README.md\">README</a>.", "projectKey": "TK", "projectLead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "projectName": "Trapperkeeper", "projectType": "software", "projectUrl": null, "reporter": "557058:a3132145-aae4-410f-9f7a-85a3117a0c14", "resolution": "Fixed", "resolutionDate": "2014-08-21T16:49:00.000000", "status": "Resolved", "statusCategory": "Done", "statuscategorychangedate": "11/Mar/23 9:11 AM", "summary": "provide a way to retrieve configuration data as a library function call", "timeSpent": "PT0S", "updated": "2022-02-03T07:03:00.000000", "votes": "0", "watchers": []}], "key": "TK", "lead": "557058:50693b46-2d67-4417-b1cc-9b21dadb467f", "name": "Trapperkeeper", "template": "com.pyxis.greenhopper.jira:gh-simplified-scrum-classic", "type": "software", "url": "", "versions": [{"name": "HTTP-CLIENT 0.2.8", "releaseDate": "", "released": false}, {"name": "HTTP-CLIENT 0.3.0", "releaseDate": "2014-10-21", "released": true}, {"name": "HTTP-CLIENT 0.3.1", "releaseDate": "2014-10-22", "released": true}, {"name": "HTTP-CLIENT 0.4.0", "releaseDate": "2014-11-17", "released": true}, {"name": "HTTP-CLIENT 0.4.1", "releaseDate": "2015-01-26", "released": true}, {"name": "HTTP-CLIENT 0.4.2", "releaseDate": "2015-02-13", "released": true}, {"name": "HTTP-CLIENT 0.4.3", "releaseDate": "2015-03-20", "released": true}, {"name": "HTTP-CLIENT 0.4.4", "releaseDate": "2015-04-14", "released": true}, {"name": "JRUBY-UTILS 0.1.0", "releaseDate": "2016-06-21", "released": true}, {"name": "JVM-CA 0.6.0", "releaseDate": "2014-08-26", "released": true}, {"name": "JVM-CA 0.6.1", "releaseDate": "2015-01-21", "released": true}, {"name": "JVM-SSL-UTILS 0.7.0", "releaseDate": "2015-01-22", "released": true}, {"name": "JVM-SSL-UTILS 0.8.0", "releaseDate": "2015-02-17", "released": true}, {"name": "JVM-SSL-UTILS 0.y", "releaseDate": "", "released": false}, {"name": "TK-FS-WATCHER 1.1.0", "releaseDate": "", "released": false}, {"name": "TK-JETTY9 1.3.1", "releaseDate": "2015-04-14", "released": true}, {"name": "TK-JETTY9 1.y", "releaseDate": "", "released": false}, {"name": "TK-JETTY9 1.3.0", "releaseDate": "2015-03-23", "released": true}, {"name": "TK-JETTY9 1.2.0", "releaseDate": "2015-03-06", "released": true}, {"name": "TK-JETTY9 1.1.0", "releaseDate": "2015-01-08", "released": true}, {"name": "TK-JETTY9 1.1.1", "releaseDate": "2015-01-26", "released": true}, {"name": "TK-JETTY9 1.0.1", "releaseDate": "2014-11-21", "released": true}, {"name": "TK-JETTY9 1.0.0", "releaseDate": "2014-11-19", "released": true}, {"name": "TK-JETTY9 0.9.0", "releaseDate": "2014-10-16", "released": true}, {"name": "TK-JETTY9 0.8.1", "releaseDate": "2014-10-14", "released": true}, {"name": "TK-JETTY9 0.8.0", "releaseDate": "2014-10-10", "released": true}, {"name": "TK-JETTY9 0.7.6", "releaseDate": "2014-10-02", "released": true}, {"name": "TK-JETTY9 1.6.0", "releaseDate": "2016-12-16", "released": true}, {"name": "TK-JETTY9 1.8.1", "releaseDate": "2017-08-07", "released": false}, {"name": "TK-JETTY9 2.0.2", "releaseDate": "2017-08-09", "released": false}, {"name": "TK Puppet5.0", "releaseDate": "2017-06-27", "released": true}, {"name": "TK 0.5.1", "releaseDate": "2014-08-25", "released": true}, {"name": "TK 1.0.0", "releaseDate": "2014-11-19", "released": true}, {"name": "TK 1.0.1", "releaseDate": "2014-11-20", "released": true}, {"name": "TK 1.1.0", "releaseDate": "2015-02-23", "released": true}, {"name": "TK 1.1.1", "releaseDate": "2015-04-14", "released": true}, {"name": "TK 1.3.0", "releaseDate": "2016-02-08", "released": true}, {"name": "TK 1.4.0", "releaseDate": "2016-05-02", "released": true}, {"name": "TK 1.4.1", "releaseDate": "2016-05-23", "released": true}, {"name": "TK 1.4.2", "releaseDate": "2016-08-07", "released": true}, {"name": "TK 1.5.1", "releaseDate": "2016-09-28", "released": true}, {"name": "TK 1.y", "releaseDate": "", "released": false}, {"name": "PE 2016.4.0", "releaseDate": "2016-08-07", "released": true}, {"name": "PE 2016.2.0", "releaseDate": "2016-06-20", "released": true}, {"name": "None", "releaseDate": "", "released": false}, {"name": "TK-JETTY9 2.1.0", "releaseDate": "", "released": false}, {"name": "TK 1.5.4", "releaseDate": "", "released": false}, {"name": "TK 1.5.6", "releaseDate": "", "released": false}, {"name": "SERVER 6.0.0", "releaseDate": "", "released": false}, {"name": "TK-JETTY9 2.3.1", "releaseDate": "", "released": false}, {"name": "SERVER 6.1.0", "releaseDate": "", "released": false}, {"name": "TK  2.0.0", "releaseDate": "", "released": false}, {"name": "SERVER 6.6.0", "releaseDate": "", "released": false}, {"name": "TK 3.1.0", "releaseDate": "", "released": false}, {"name": "SERVER 6.12.0", "releaseDate": "", "released": false}, {"name": "SERVER 5.3.14", "releaseDate": "", "released": false}, {"name": "SERVER 6.12.1", "releaseDate": "", "released": false}, {"name": "TK-METRICS 1.3.1", "releaseDate": "", "released": false}, {"name": "TK-JETTY9 4.2.0", "releaseDate": "", "released": false}]}]}