[ https://issues.apache.org/jira/browse/BROOKLYN-421?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16292353#comment-16292353 ]
Sam Corbett commented on BROOKLYN-421: -------------------------------------- Here's a more up-to-date stack trace for the alternative option: {noformat} "brooklyn-jetty-server-8081-qtp651992021-30@7102" prio=5 tid=0x1e nid=NA runnable java.lang.Thread.State: RUNNABLE at org.apache.brooklyn.util.core.ResourceUtils.getResourceFromUrl(ResourceUtils.java:221) at org.apache.brooklyn.core.mgmt.ha.OsgiArchiveInstaller.makeLocalZipFileFromInputStreamOrUrl(OsgiArchiveInstaller.java:243) - locked <0x1d87> (a org.apache.brooklyn.core.mgmt.ha.OsgiArchiveInstaller) at org.apache.brooklyn.core.mgmt.ha.OsgiArchiveInstaller.install(OsgiArchiveInstaller.java:392) at org.apache.brooklyn.core.mgmt.ha.OsgiManager.installDeferredStart(OsgiManager.java:400) at org.apache.brooklyn.core.catalog.internal.CatalogUtils.installLibraries(CatalogUtils.java:172) at org.apache.brooklyn.core.catalog.internal.CatalogUtils.installLibraries(CatalogUtils.java:152) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItemsFromItemMetadataBlock(BasicBrooklynCatalog.java:671) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItemsFromCatalogBomRoot(BasicBrooklynCatalog.java:558) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addTypesFromBundleBom(BasicBrooklynCatalog.java:1573) at org.apache.brooklyn.core.catalog.internal.CatalogBundleLoader.scanForCatalogInternal(CatalogBundleLoader.java:104) at org.apache.brooklyn.core.catalog.internal.CatalogBundleLoader.scanForCatalog(CatalogBundleLoader.java:67) at org.apache.brooklyn.core.mgmt.ha.OsgiManager.loadCatalogBom(OsgiManager.java:561) at org.apache.brooklyn.core.mgmt.ha.OsgiArchiveInstaller$1.run(OsgiArchiveInstaller.java:644) at org.apache.brooklyn.core.mgmt.ha.OsgiArchiveInstaller.install(OsgiArchiveInstaller.java:701) at org.apache.brooklyn.core.mgmt.ha.OsgiManager.install(OsgiManager.java:415) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItemsOsgi(BasicBrooklynCatalog.java:1516) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:1453) at org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:117) at org.apache.brooklyn.rest.resources.CatalogResource.createFromYaml(CatalogResource.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) {noformat} YAML to bundle URL: # BasicBrooklynCatalog.collectCatalogItemsFromItemMetadataBlock turns the YAML into instances of {{CatalogBundle}}. # CatalogUtils.installLibraries turns each {{CatalogBundle}} into a {{BasicManagedBundle}}. # OsgiArchiveInstaller.makeLocalZipFileFromInputStreamOrUrl passes the bundle's URL to {{ResourceUtils}}. > Catalog libraries: externalized config for basic-auth credentials in url (via > YAML) > ----------------------------------------------------------------------------------- > > Key: BROOKLYN-421 > URL: https://issues.apache.org/jira/browse/BROOKLYN-421 > Project: Brooklyn > Issue Type: Bug > Affects Versions: 0.10.0 > Reporter: Aled Sage > > A customer wants to use YAML catalog items, where the library bundles are > retrieved from their Nexus repo using basic-auth. They want the nexus > credentials to be stored in an externalized credential store. They want the > credentials to be able to contain special characters (e.g. "@") that are not > valid in a URL. > Building up to this, here is what we currently support... > Either of the catalog items below is valid (i.e. the credentials can be > encoded in the url; the library can be supplied either as a string or as a > map (where the map currently takes keys of "url", "name" and "version")): > {noformat} > brooklyn.catalog: > id: simple-example > version: "1.0" > itemType: template > libraries: > - url: https://myuser:myp...@nexus.example.com/mybundle.jar > item: > ... > brooklyn.catalog: > id: simple-example > version: "1.0" > itemType: template > libraries: > - https://myuser:myp...@nexus.example.com/mybundle.jar > item: > ... > {noformat} > For usernames / passwords with special characters, these need to be escaped > before adding to the url. For example, for username "myu...@example.com", the > url would be > {{https://myuser%40mydomain.com:myp...@nexus.example.com/mybundle.jar}}. > For externalized config, one can use the example below: > {noformat} > brooklyn.catalog: > id: simple-example > version: "1.0" > itemType: template > libraries: > - $brooklyn:formatString: > - https://%s:%s...@nexus.example.com/mybundle.jar > - $brooklyn:external("myprovider", "username") > - $brooklyn:external("myprovider", "password") > item: > ... > {noformat} > However, this requires that the externalised config stores the username and > password in its url-escaped form (rather than as the raw password). > It also means that the password is embedded in the url, which is potentially > logged or persisted. > --- > We could fix the first of these problems (i.e. credentials store can just > supply the raw username/password) by adding DSL support for > {{$brooklyn:escapeUrl}}. One could write something like: > {noformat} > brooklyn.catalog: > id: simple-example > version: "1.0" > itemType: template > libraries: > - $brooklyn:formatString: > - https://%s:%s...@nexus.example.com/mybundle.jar > - $brooklyn:escapeUrl: > - $brooklyn:external("myprovider", "username") > - $brooklyn:escapeUrl: > - $brooklyn:external("myprovider", "password") > item: > ... > {noformat} > --- > Alternatively (as well?) we could supply the basic-auth credentials as an > explicit configuration option. The advantage of this is that we should be > able to keep it as the DSL "deferred supplier" so not persist the password. > For example, something like the YAML below: > {noformat} > brooklyn.catalog: > id: simple-example > version: "1.0" > itemType: template > libraries: > - url: https://nexus.example.com/mybundle.jar > basicAuth: > username: $brooklyn:external("myprovider", "username") > password: $brooklyn:external("myprovider", "password") > item: > ... > {noformat} > However, this is fiddly to implement. Looking at the code path for where it > eventually loads the bundle over http(s): > {noformat} > "main" prio=5 tid=0x00007fa34c002000 nid=0x1703 at > breakpoint[0x0000700000217000] > java.lang.Thread.State: RUNNABLE > at > org.apache.brooklyn.util.core.ResourceUtils.getResourceViaHttp(ResourceUtils.java:420) > at > org.apache.brooklyn.util.core.ResourceUtils.getResourceFromUrl(ResourceUtils.java:251) > at > org.apache.brooklyn.util.core.osgi.Osgis.getUrlStream(Osgis.java:421) > at org.apache.brooklyn.util.core.osgi.Osgis.cacheFile(Osgis.java:369) > at org.apache.brooklyn.util.core.osgi.Osgis.install(Osgis.java:342) > at > org.apache.brooklyn.core.mgmt.ha.OsgiManager.registerBundle(OsgiManager.java:122) > at > org.apache.brooklyn.core.catalog.internal.CatalogUtils.installLibraries(CatalogUtils.java:160) > at > org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:494) > at > org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:428) > at > org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.collectCatalogItems(BasicBrooklynCatalog.java:417) > at > org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:974) > at > org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.addItems(BasicBrooklynCatalog.java:1) > at > org.apache.brooklyn.camp.brooklyn.AbstractYamlTest.addCatalogItems(AbstractYamlTest.java:199) > at > org.apache.brooklyn.camp.brooklyn.AbstractYamlTest.addCatalogItems(AbstractYamlTest.java:195) > at > org.apache.brooklyn.camp.brooklyn.catalog.CatalogOsgiVersionMoreEntityTest.testLibraryUrlsUsingExternalizedConfig(CatalogOsgiVersionMoreEntityTest.java:318) > {noformat} > One needs to go all the way back to {{OsgiManager.registerBundle}} before we > have the {{CatalogBundle}} object - after that, we only have the URL string. > So that is a lot of methods that would need to change! -- This message was sent by Atlassian JIRA (v6.4.14#64029)