Fix conflicts from #806. This closes #806.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/2aac052f Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/2aac052f Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/2aac052f Branch: refs/heads/master Commit: 2aac052fbde38b566f5d70efa0d241b0488c98f4 Parents: 2ed62d6 f73a1af Author: Hadrian Zbarcea <[email protected]> Authored: Sat Aug 8 22:39:29 2015 -0400 Committer: Hadrian Zbarcea <[email protected]> Committed: Sat Aug 8 22:54:34 2015 -0400 ---------------------------------------------------------------------- brooklyn-install.sh | 2 +- .../io/brooklyn/camp/CampRestResources.java | 2 +- .../camp/rest/resource/ApidocRestResource.java | 4 +- .../ApplicationComponentRestResource.java | 2 +- ...pplicationComponentTemplateRestResource.java | 2 +- .../rest/resource/AssemblyRestResource.java | 2 +- .../resource/AssemblyTemplateRestResource.java | 2 +- .../resource/PlatformComponentRestResource.java | 2 +- .../PlatformComponentTemplateRestResource.java | 2 +- .../rest/resource/PlatformRestResource.java | 2 +- docs/guide/ops/brooklyn_properties.md | 10 +- docs/guide/start/brooklyn.properties | 2 +- .../main/java/org/apache/brooklyn/cli/Main.java | 4 +- .../brooklyn/cli/lister/ItemDescriptors.java | 14 +- .../jsgui/BrooklynJavascriptGuiLauncher.java | 2 +- .../BrooklynJavascriptGuiLauncherTest.java | 2 +- .../brooklyn/launcher/BrooklynLauncher.java | 8 +- .../brooklyn/launcher/BrooklynWebServer.java | 22 +- .../launcher/config/BrooklynGlobalConfig.java | 2 +- .../BrooklynEntityMirrorIntegrationTest.java | 2 +- .../launcher/BrooklynWebServerTest.java | 2 +- .../brooklyn/launcher/WebAppRunnerTest.java | 4 +- .../main/java/brooklyn/rest/api/AccessApi.java | 62 -- .../java/brooklyn/rest/api/ActivityApi.java | 69 --- .../java/brooklyn/rest/api/ApplicationApi.java | 222 ------- .../main/java/brooklyn/rest/api/CatalogApi.java | 325 ---------- .../java/brooklyn/rest/api/EffectorApi.java | 85 --- .../main/java/brooklyn/rest/api/EntityApi.java | 235 -------- .../java/brooklyn/rest/api/EntityConfigApi.java | 145 ----- .../java/brooklyn/rest/api/LocationApi.java | 101 ---- .../main/java/brooklyn/rest/api/PolicyApi.java | 151 ----- .../java/brooklyn/rest/api/PolicyConfigApi.java | 120 ---- .../main/java/brooklyn/rest/api/ScriptApi.java | 52 -- .../main/java/brooklyn/rest/api/SensorApi.java | 150 ----- .../main/java/brooklyn/rest/api/ServerApi.java | 203 ------- .../main/java/brooklyn/rest/api/UsageApi.java | 156 ----- .../main/java/brooklyn/rest/api/VersionApi.java | 42 -- .../brooklyn/rest/domain/AccessSummary.java | 74 --- .../java/brooklyn/rest/domain/ApiError.java | 208 ------- .../brooklyn/rest/domain/ApplicationSpec.java | 181 ------ .../rest/domain/ApplicationSummary.java | 117 ---- .../rest/domain/BrooklynFeatureSummary.java | 91 --- .../rest/domain/CatalogEntitySummary.java | 81 --- .../rest/domain/CatalogItemSummary.java | 151 ----- .../rest/domain/CatalogLocationSummary.java | 59 -- .../rest/domain/CatalogPolicySummary.java | 64 -- .../brooklyn/rest/domain/ConfigSummary.java | 172 ------ .../brooklyn/rest/domain/EffectorSummary.java | 187 ------ .../rest/domain/EntityConfigSummary.java | 69 --- .../java/brooklyn/rest/domain/EntitySpec.java | 102 ---- .../brooklyn/rest/domain/EntitySummary.java | 97 --- .../java/brooklyn/rest/domain/HasConfig.java | 28 - .../main/java/brooklyn/rest/domain/HasId.java | 26 - .../main/java/brooklyn/rest/domain/HasName.java | 26 - .../rest/domain/HighAvailabilitySummary.java | 144 ----- .../brooklyn/rest/domain/LinkWithMetadata.java | 88 --- .../rest/domain/LocationConfigSummary.java | 62 -- .../java/brooklyn/rest/domain/LocationSpec.java | 96 --- .../brooklyn/rest/domain/LocationSummary.java | 96 --- .../rest/domain/PolicyConfigSummary.java | 60 -- .../brooklyn/rest/domain/PolicySummary.java | 108 ---- .../rest/domain/ScriptExecutionSummary.java | 67 --- .../brooklyn/rest/domain/SensorSummary.java | 107 ---- .../main/java/brooklyn/rest/domain/Status.java | 33 - .../rest/domain/SummaryComparators.java | 82 --- .../java/brooklyn/rest/domain/TaskSummary.java | 232 ------- .../brooklyn/rest/domain/UsageStatistic.java | 124 ---- .../brooklyn/rest/domain/UsageStatistics.java | 76 --- .../brooklyn/rest/domain/VersionSummary.java | 81 --- .../org/apache/brooklyn/rest/api/AccessApi.java | 62 ++ .../apache/brooklyn/rest/api/ActivityApi.java | 69 +++ .../brooklyn/rest/api/ApplicationApi.java | 222 +++++++ .../apache/brooklyn/rest/api/CatalogApi.java | 325 ++++++++++ .../apache/brooklyn/rest/api/EffectorApi.java | 85 +++ .../org/apache/brooklyn/rest/api/EntityApi.java | 235 ++++++++ .../brooklyn/rest/api/EntityConfigApi.java | 145 +++++ .../apache/brooklyn/rest/api/LocationApi.java | 101 ++++ .../org/apache/brooklyn/rest/api/PolicyApi.java | 151 +++++ .../brooklyn/rest/api/PolicyConfigApi.java | 120 ++++ .../org/apache/brooklyn/rest/api/ScriptApi.java | 52 ++ .../org/apache/brooklyn/rest/api/SensorApi.java | 150 +++++ .../org/apache/brooklyn/rest/api/ServerApi.java | 203 +++++++ .../org/apache/brooklyn/rest/api/UsageApi.java | 156 +++++ .../apache/brooklyn/rest/api/VersionApi.java | 42 ++ .../brooklyn/rest/domain/AccessSummary.java | 74 +++ .../apache/brooklyn/rest/domain/ApiError.java | 208 +++++++ .../brooklyn/rest/domain/ApplicationSpec.java | 181 ++++++ .../rest/domain/ApplicationSummary.java | 117 ++++ .../rest/domain/BrooklynFeatureSummary.java | 91 +++ .../rest/domain/CatalogEntitySummary.java | 81 +++ .../rest/domain/CatalogItemSummary.java | 151 +++++ .../rest/domain/CatalogLocationSummary.java | 59 ++ .../rest/domain/CatalogPolicySummary.java | 64 ++ .../brooklyn/rest/domain/ConfigSummary.java | 172 ++++++ .../brooklyn/rest/domain/EffectorSummary.java | 187 ++++++ .../rest/domain/EntityConfigSummary.java | 69 +++ .../apache/brooklyn/rest/domain/EntitySpec.java | 102 ++++ .../brooklyn/rest/domain/EntitySummary.java | 97 +++ .../apache/brooklyn/rest/domain/HasConfig.java | 28 + .../org/apache/brooklyn/rest/domain/HasId.java | 26 + .../apache/brooklyn/rest/domain/HasName.java | 26 + .../rest/domain/HighAvailabilitySummary.java | 144 +++++ .../brooklyn/rest/domain/LinkWithMetadata.java | 88 +++ .../rest/domain/LocationConfigSummary.java | 62 ++ .../brooklyn/rest/domain/LocationSpec.java | 96 +++ .../brooklyn/rest/domain/LocationSummary.java | 96 +++ .../rest/domain/PolicyConfigSummary.java | 60 ++ .../brooklyn/rest/domain/PolicySummary.java | 108 ++++ .../rest/domain/ScriptExecutionSummary.java | 67 +++ .../brooklyn/rest/domain/SensorSummary.java | 107 ++++ .../org/apache/brooklyn/rest/domain/Status.java | 33 + .../rest/domain/SummaryComparators.java | 82 +++ .../brooklyn/rest/domain/TaskSummary.java | 232 +++++++ .../brooklyn/rest/domain/UsageStatistic.java | 124 ++++ .../brooklyn/rest/domain/UsageStatistics.java | 76 +++ .../brooklyn/rest/domain/VersionSummary.java | 81 +++ usage/rest-api/src/main/webapp/WEB-INF/web.xml | 10 +- .../java/brooklyn/rest/domain/ApiErrorTest.java | 63 -- .../rest/domain/ApplicationSpecTest.java | 53 -- .../rest/domain/EffectorSummaryTest.java | 53 -- .../brooklyn/rest/domain/EntitySpecTest.java | 50 -- .../brooklyn/rest/domain/EntitySummaryTest.java | 61 -- .../brooklyn/rest/domain/LocationSpecTest.java | 58 -- .../rest/domain/VersionSummaryTest.java | 62 -- .../brooklyn/rest/util/RestApiTestUtils.java | 58 -- .../brooklyn/rest/domain/ApiErrorTest.java | 63 ++ .../rest/domain/ApplicationSpecTest.java | 53 ++ .../rest/domain/EffectorSummaryTest.java | 53 ++ .../brooklyn/rest/domain/EntitySpecTest.java | 50 ++ .../brooklyn/rest/domain/EntitySummaryTest.java | 61 ++ .../brooklyn/rest/domain/LocationSpecTest.java | 58 ++ .../rest/domain/VersionSummaryTest.java | 62 ++ .../brooklyn/rest/util/RestApiTestUtils.java | 58 ++ .../brooklyn/rest/client/BrooklynApi.java | 30 +- .../ApplicationResourceIntegrationTest.java | 14 +- .../rest/client/BrooklynApiRestClientTest.java | 11 +- .../rest-client/src/test/webapp/WEB-INF/web.xml | 38 +- .../java/brooklyn/rest/BrooklynRestApi.java | 89 --- .../java/brooklyn/rest/BrooklynWebConfig.java | 155 ----- .../BrooklynPropertiesSecurityFilter.java | 176 ------ .../rest/filter/HaHotCheckResourceFilter.java | 151 ----- .../rest/filter/HaHotStateRequired.java | 36 -- .../rest/filter/HaMasterCheckFilter.java | 140 ----- .../brooklyn/rest/filter/LoggingFilter.java | 160 ----- .../brooklyn/rest/filter/NoCacheFilter.java | 40 -- .../rest/filter/RequestTaggingFilter.java | 62 -- .../resources/AbstractBrooklynRestResource.java | 153 ----- .../brooklyn/rest/resources/AccessResource.java | 46 -- .../rest/resources/ActivityResource.java | 67 --- .../brooklyn/rest/resources/ApidocResource.java | 29 - .../rest/resources/ApplicationResource.java | 463 -------------- .../rest/resources/CatalogResource.java | 481 --------------- .../rest/resources/EffectorResource.java | 115 ---- .../rest/resources/EntityConfigResource.java | 153 ----- .../brooklyn/rest/resources/EntityResource.java | 225 ------- .../rest/resources/LocationResource.java | 185 ------ .../rest/resources/PolicyConfigResource.java | 109 ---- .../brooklyn/rest/resources/PolicyResource.java | 133 ----- .../brooklyn/rest/resources/ScriptResource.java | 99 --- .../brooklyn/rest/resources/SensorResource.java | 150 ----- .../brooklyn/rest/resources/ServerResource.java | 496 --------------- .../brooklyn/rest/resources/UsageResource.java | 257 -------- .../rest/resources/VersionResource.java | 32 - .../brooklyn/rest/security/PasswordHasher.java | 32 - .../provider/AbstractSecurityProvider.java | 56 -- .../provider/AnyoneSecurityProvider.java | 40 -- .../provider/BlackholeSecurityProvider.java | 40 -- ...nUserWithRandomPasswordSecurityProvider.java | 68 --- .../provider/DelegatingSecurityProvider.java | 156 ----- .../provider/ExplicitUsersSecurityProvider.java | 103 ---- .../security/provider/LdapSecurityProvider.java | 131 ---- .../security/provider/SecurityProvider.java | 35 -- .../rest/transform/AccessTransformer.java | 39 -- .../rest/transform/ApplicationTransformer.java | 116 ---- .../transform/BrooklynFeatureTransformer.java | 45 -- .../rest/transform/CatalogTransformer.java | 163 ----- .../rest/transform/EffectorTransformer.java | 86 --- .../rest/transform/EntityTransformer.java | 155 ----- .../transform/HighAvailabilityTransformer.java | 50 -- .../rest/transform/LocationTransformer.java | 194 ------ .../rest/transform/PolicyTransformer.java | 84 --- .../rest/transform/SensorTransformer.java | 85 --- .../rest/transform/TaskTransformer.java | 147 ----- .../rest/util/BrooklynRestResourceUtils.java | 564 ----------------- .../rest/util/DefaultExceptionMapper.java | 102 ---- .../brooklyn/rest/util/EntityLocationUtils.java | 85 --- .../brooklyn/rest/util/FormMapProvider.java | 81 --- .../rest/util/ManagementContextProvider.java | 33 - .../brooklyn/rest/util/ShutdownHandler.java | 23 - .../rest/util/ShutdownHandlerProvider.java | 30 - .../brooklyn/rest/util/URLParamEncoder.java | 27 - .../brooklyn/rest/util/WebResourceUtils.java | 162 ----- .../rest/util/json/BidiSerialization.java | 175 ------ .../util/json/BrooklynJacksonJsonProvider.java | 172 ------ .../json/ConfigurableSerializerProvider.java | 94 --- .../ErrorAndToStringUnknownTypeSerializer.java | 125 ---- .../rest/util/json/MultimapSerializer.java | 62 -- ...StrictPreferringFieldsVisibilityChecker.java | 107 ---- .../apache/brooklyn/rest/BrooklynRestApi.java | 89 +++ .../apache/brooklyn/rest/BrooklynWebConfig.java | 155 +++++ .../BrooklynPropertiesSecurityFilter.java | 176 ++++++ .../rest/filter/HaHotCheckResourceFilter.java | 151 +++++ .../rest/filter/HaHotStateRequired.java | 36 ++ .../rest/filter/HaMasterCheckFilter.java | 140 +++++ .../brooklyn/rest/filter/LoggingFilter.java | 160 +++++ .../brooklyn/rest/filter/NoCacheFilter.java | 40 ++ .../rest/filter/RequestTaggingFilter.java | 62 ++ .../resources/AbstractBrooklynRestResource.java | 153 +++++ .../brooklyn/rest/resources/AccessResource.java | 46 ++ .../rest/resources/ActivityResource.java | 67 +++ .../brooklyn/rest/resources/ApidocResource.java | 29 + .../rest/resources/ApplicationResource.java | 463 ++++++++++++++ .../rest/resources/CatalogResource.java | 481 +++++++++++++++ .../rest/resources/EffectorResource.java | 115 ++++ .../rest/resources/EntityConfigResource.java | 153 +++++ .../brooklyn/rest/resources/EntityResource.java | 225 +++++++ .../rest/resources/LocationResource.java | 185 ++++++ .../rest/resources/PolicyConfigResource.java | 109 ++++ .../brooklyn/rest/resources/PolicyResource.java | 133 +++++ .../brooklyn/rest/resources/ScriptResource.java | 99 +++ .../brooklyn/rest/resources/SensorResource.java | 150 +++++ .../brooklyn/rest/resources/ServerResource.java | 496 +++++++++++++++ .../brooklyn/rest/resources/UsageResource.java | 257 ++++++++ .../rest/resources/VersionResource.java | 32 + .../brooklyn/rest/security/PasswordHasher.java | 32 + .../provider/AbstractSecurityProvider.java | 56 ++ .../provider/AnyoneSecurityProvider.java | 40 ++ .../provider/BlackholeSecurityProvider.java | 40 ++ ...nUserWithRandomPasswordSecurityProvider.java | 68 +++ .../provider/DelegatingSecurityProvider.java | 156 +++++ .../provider/ExplicitUsersSecurityProvider.java | 103 ++++ .../security/provider/LdapSecurityProvider.java | 131 ++++ .../security/provider/SecurityProvider.java | 35 ++ .../rest/transform/AccessTransformer.java | 39 ++ .../rest/transform/ApplicationTransformer.java | 116 ++++ .../transform/BrooklynFeatureTransformer.java | 45 ++ .../rest/transform/CatalogTransformer.java | 163 +++++ .../rest/transform/EffectorTransformer.java | 86 +++ .../rest/transform/EntityTransformer.java | 155 +++++ .../transform/HighAvailabilityTransformer.java | 50 ++ .../rest/transform/LocationTransformer.java | 194 ++++++ .../rest/transform/PolicyTransformer.java | 84 +++ .../rest/transform/SensorTransformer.java | 85 +++ .../rest/transform/TaskTransformer.java | 147 +++++ .../rest/util/BrooklynRestResourceUtils.java | 564 +++++++++++++++++ .../rest/util/DefaultExceptionMapper.java | 102 ++++ .../brooklyn/rest/util/EntityLocationUtils.java | 85 +++ .../brooklyn/rest/util/FormMapProvider.java | 81 +++ .../rest/util/ManagementContextProvider.java | 33 + .../brooklyn/rest/util/ShutdownHandler.java | 23 + .../rest/util/ShutdownHandlerProvider.java | 30 + .../brooklyn/rest/util/URLParamEncoder.java | 27 + .../brooklyn/rest/util/WebResourceUtils.java | 162 +++++ .../rest/util/json/BidiSerialization.java | 175 ++++++ .../util/json/BrooklynJacksonJsonProvider.java | 172 ++++++ .../json/ConfigurableSerializerProvider.java | 94 +++ .../ErrorAndToStringUnknownTypeSerializer.java | 125 ++++ .../rest/util/json/MultimapSerializer.java | 62 ++ ...StrictPreferringFieldsVisibilityChecker.java | 107 ++++ .../rest-server/src/main/webapp/WEB-INF/web.xml | 40 +- .../config/render/TestRendererHints.java | 2 + .../brooklynnode/DeployBlueprintTest.java | 90 --- .../BrooklynPropertiesSecurityFilterTest.java | 111 ---- .../brooklyn/rest/BrooklynRestApiLauncher.java | 433 -------------- .../rest/BrooklynRestApiLauncherTest.java | 76 --- .../BrooklynRestApiLauncherTestFixture.java | 110 ---- .../test/java/brooklyn/rest/HaHotCheckTest.java | 130 ---- .../brooklyn/rest/HaMasterCheckFilterTest.java | 219 ------- .../brooklyn/rest/domain/ApplicationTest.java | 94 --- .../rest/domain/LocationSummaryTest.java | 55 -- .../brooklyn/rest/domain/SensorSummaryTest.java | 102 ---- .../rest/resources/AccessResourceTest.java | 68 --- .../rest/resources/ApiDocResourceTest.java | 138 ----- .../ApplicationResourceIntegrationTest.java | 134 ----- .../rest/resources/ApplicationResourceTest.java | 598 ------------------- .../rest/resources/CatalogResetTest.java | 113 ---- .../rest/resources/CatalogResourceTest.java | 432 -------------- .../rest/resources/DelegatingPrintStream.java | 183 ------ .../rest/resources/DescendantsTest.java | 134 ----- .../resources/EntityConfigResourceTest.java | 173 ------ .../rest/resources/EntityResourceTest.java | 190 ------ .../rest/resources/ErrorResponseTest.java | 98 --- .../rest/resources/LocationResourceTest.java | 189 ------ .../rest/resources/PolicyResourceTest.java | 145 ----- .../rest/resources/ScriptResourceTest.java | 53 -- .../SensorResourceIntegrationTest.java | 83 --- .../rest/resources/SensorResourceTest.java | 272 --------- .../ServerResourceIntegrationTest.java | 126 ---- .../rest/resources/ServerResourceTest.java | 176 ------ .../rest/resources/ServerShutdownTest.java | 187 ------ .../rest/resources/UsageResourceTest.java | 447 -------------- .../rest/resources/VersionResourceTest.java | 50 -- .../rest/security/PasswordHasherTest.java | 37 -- .../security/provider/TestSecurityProvider.java | 46 -- .../rest/testing/BrooklynRestApiTest.java | 185 ------ .../rest/testing/BrooklynRestResourceTest.java | 155 ----- .../rest/testing/mocks/CapitalizePolicy.java | 32 - .../rest/testing/mocks/EverythingGroup.java | 27 - .../rest/testing/mocks/EverythingGroupImpl.java | 32 - .../rest/testing/mocks/NameMatcherGroup.java | 30 - .../testing/mocks/NameMatcherGroupImpl.java | 33 - .../rest/testing/mocks/RestMockApp.java | 24 - .../rest/testing/mocks/RestMockAppBuilder.java | 39 -- .../testing/mocks/RestMockSimpleEntity.java | 104 ---- .../testing/mocks/RestMockSimplePolicy.java | 65 -- .../util/BrooklynRestResourceUtilsTest.java | 215 ------- .../rest/util/EntityLocationUtilsTest.java | 73 --- .../rest/util/HaHotStateCheckClassResource.java | 38 -- .../rest/util/HaHotStateCheckResource.java | 44 -- .../util/NullHttpServletRequestProvider.java | 46 -- .../rest/util/NullServletConfigProvider.java | 46 -- .../brooklyn/rest/util/TestShutdownHandler.java | 39 -- .../json/BrooklynJacksonSerializerTest.java | 399 ------------- .../brooklynnode/DeployBlueprintTest.java | 92 +++ .../BrooklynPropertiesSecurityFilterTest.java | 111 ++++ .../brooklyn/rest/BrooklynRestApiLauncher.java | 433 ++++++++++++++ .../rest/BrooklynRestApiLauncherTest.java | 76 +++ .../BrooklynRestApiLauncherTestFixture.java | 110 ++++ .../apache/brooklyn/rest/HaHotCheckTest.java | 130 ++++ .../brooklyn/rest/HaMasterCheckFilterTest.java | 219 +++++++ .../brooklyn/rest/domain/ApplicationTest.java | 94 +++ .../rest/domain/LocationSummaryTest.java | 55 ++ .../brooklyn/rest/domain/SensorSummaryTest.java | 102 ++++ .../rest/resources/AccessResourceTest.java | 68 +++ .../rest/resources/ApiDocResourceTest.java | 138 +++++ .../ApplicationResourceIntegrationTest.java | 134 +++++ .../rest/resources/ApplicationResourceTest.java | 598 +++++++++++++++++++ .../rest/resources/CatalogResetTest.java | 113 ++++ .../rest/resources/CatalogResourceTest.java | 432 ++++++++++++++ .../rest/resources/DelegatingPrintStream.java | 183 ++++++ .../rest/resources/DescendantsTest.java | 134 +++++ .../resources/EntityConfigResourceTest.java | 173 ++++++ .../rest/resources/EntityResourceTest.java | 191 ++++++ .../rest/resources/ErrorResponseTest.java | 98 +++ .../rest/resources/LocationResourceTest.java | 189 ++++++ .../rest/resources/PolicyResourceTest.java | 145 +++++ .../rest/resources/ScriptResourceTest.java | 53 ++ .../SensorResourceIntegrationTest.java | 84 +++ .../rest/resources/SensorResourceTest.java | 273 +++++++++ .../ServerResourceIntegrationTest.java | 127 ++++ .../rest/resources/ServerResourceTest.java | 176 ++++++ .../rest/resources/ServerShutdownTest.java | 187 ++++++ .../rest/resources/UsageResourceTest.java | 447 ++++++++++++++ .../rest/resources/VersionResourceTest.java | 50 ++ .../rest/security/PasswordHasherTest.java | 37 ++ .../security/provider/TestSecurityProvider.java | 46 ++ .../rest/testing/BrooklynRestApiTest.java | 185 ++++++ .../rest/testing/BrooklynRestResourceTest.java | 155 +++++ .../rest/testing/mocks/CapitalizePolicy.java | 32 + .../rest/testing/mocks/EverythingGroup.java | 27 + .../rest/testing/mocks/EverythingGroupImpl.java | 32 + .../rest/testing/mocks/NameMatcherGroup.java | 30 + .../testing/mocks/NameMatcherGroupImpl.java | 33 + .../rest/testing/mocks/RestMockApp.java | 24 + .../rest/testing/mocks/RestMockAppBuilder.java | 39 ++ .../testing/mocks/RestMockSimpleEntity.java | 104 ++++ .../testing/mocks/RestMockSimplePolicy.java | 65 ++ .../util/BrooklynRestResourceUtilsTest.java | 215 +++++++ .../rest/util/EntityLocationUtilsTest.java | 73 +++ .../rest/util/HaHotStateCheckClassResource.java | 38 ++ .../rest/util/HaHotStateCheckResource.java | 44 ++ .../util/NullHttpServletRequestProvider.java | 46 ++ .../rest/util/NullServletConfigProvider.java | 46 ++ .../brooklyn/rest/util/TestShutdownHandler.java | 39 ++ .../json/BrooklynJacksonSerializerTest.java | 399 +++++++++++++ .../main/java/brooklyn/rest/apidoc/Apidoc.java | 33 - .../brooklyn/rest/apidoc/ApidocEndpoint.java | 54 -- .../apidoc/ApidocHelpMessageBodyWriter.java | 28 - .../brooklyn/rest/apidoc/ApidocResource.java | 291 --------- .../java/brooklyn/rest/apidoc/ApidocRoot.java | 47 -- .../org/apache/brooklyn/rest/apidoc/Apidoc.java | 33 + .../brooklyn/rest/apidoc/ApidocEndpoint.java | 54 ++ .../apidoc/ApidocHelpMessageBodyWriter.java | 28 + .../brooklyn/rest/apidoc/ApidocResource.java | 291 +++++++++ .../apache/brooklyn/rest/apidoc/ApidocRoot.java | 47 ++ 375 files changed, 21333 insertions(+), 21324 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java ---------------------------------------------------------------------- diff --cc usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java index 799b181,aeab8fa..9538073 --- a/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java +++ b/usage/jsgui/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java @@@ -27,8 -26,9 +27,8 @@@ import org.testng.annotations.Test import brooklyn.config.BrooklynServiceAttributes; import brooklyn.entity.basic.Entities; import brooklyn.management.ManagementContext; - import brooklyn.rest.BrooklynRestApiLauncherTestFixture; + import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; import brooklyn.test.Asserts; -import brooklyn.test.HttpTestUtils; /** Convenience and demo for launching programmatically. */ public class BrooklynJavascriptGuiLauncherTest { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java ---------------------------------------------------------------------- diff --cc usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java index d66dc53,b0ba2e7..d4787ff --- a/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java +++ b/usage/launcher/src/test/java/org/apache/brooklyn/entity/brooklynnode/BrooklynEntityMirrorIntegrationTest.java @@@ -39,8 -37,10 +39,8 @@@ import brooklyn.entity.proxying.EntityS import org.apache.brooklyn.launcher.BrooklynWebServer; import brooklyn.management.ManagementContext; import brooklyn.management.ha.HighAvailabilityMode; - import brooklyn.rest.filter.BrooklynPropertiesSecurityFilter; + import org.apache.brooklyn.rest.filter.BrooklynPropertiesSecurityFilter; import brooklyn.test.Asserts; -import brooklyn.test.EntityTestUtils; -import brooklyn.test.HttpTestUtils; import brooklyn.test.entity.LocalManagementContextForTests; import brooklyn.test.entity.TestApplication; import brooklyn.util.exceptions.Exceptions; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/launcher/src/test/java/org/apache/brooklyn/launcher/WebAppRunnerTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java ---------------------------------------------------------------------- diff --cc usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java index d3586af,f23d721..9c23546 --- a/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java +++ b/usage/rest-client/src/test/java/org/apache/brooklyn/rest/client/BrooklynApiRestClientTest.java @@@ -38,11 -37,12 +38,12 @@@ import brooklyn.entity.basic.StartableA import brooklyn.location.basic.BasicLocationRegistry; import brooklyn.management.ManagementContext; import brooklyn.management.internal.LocalManagementContext; - import brooklyn.rest.BrooklynRestApiLauncher; - import brooklyn.rest.BrooklynRestApiLauncherTest; - import brooklyn.rest.domain.ApplicationSummary; - import brooklyn.rest.domain.CatalogLocationSummary; - import brooklyn.rest.security.provider.TestSecurityProvider; + import org.apache.brooklyn.rest.BrooklynRestApiLauncher; + import org.apache.brooklyn.rest.BrooklynRestApiLauncherTest; + import org.apache.brooklyn.rest.domain.ApplicationSummary; + import org.apache.brooklyn.rest.domain.CatalogLocationSummary; + import org.apache.brooklyn.rest.security.provider.TestSecurityProvider; -import brooklyn.test.HttpTestUtils; ++import org.apache.brooklyn.test.HttpTestUtils; import brooklyn.test.entity.TestEntity; @Test http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java ---------------------------------------------------------------------- diff --cc usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java index 0000000,6195ab0..68d8e9a mode 000000,100644..100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/entity/brooklynnode/DeployBlueprintTest.java @@@ -1,0 -1,91 +1,92 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.brooklyn.entity.brooklynnode; + + import static org.testng.Assert.assertEquals; + + import java.net.URI; + import java.util.List; + import java.util.Map; + ++import org.apache.brooklyn.test.HttpTestUtils; + import org.eclipse.jetty.server.Server; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import org.testng.annotations.BeforeMethod; + import org.testng.annotations.Test; + + import brooklyn.entity.basic.BasicApplication; + import brooklyn.entity.basic.EntityLocal; + import brooklyn.entity.brooklynnode.BrooklynNode; + import brooklyn.entity.brooklynnode.BrooklynNode.DeployBlueprintEffector; + import brooklyn.entity.proxying.EntitySpec; + import brooklyn.event.feed.http.JsonFunctions; + import brooklyn.management.EntityManager; + import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; -import brooklyn.test.HttpTestUtils; ++import org.apache.brooklyn.test.HttpTestUtils; + import brooklyn.util.guava.Functionals; + + import com.google.common.base.Function; + import com.google.common.collect.ImmutableList; + import com.google.common.collect.ImmutableMap; + + public class DeployBlueprintTest extends BrooklynRestApiLauncherTestFixture { + + private static final Logger log = LoggerFactory.getLogger(DeployBlueprintTest.class); + + Server server; + + @BeforeMethod(alwaysRun=true) + public void setUp() throws Exception { + server = newServer(); + useServerForTest(server); + } + + @Test + public void testStartsAppViaEffector() throws Exception { + URI webConsoleUri = URI.create(getBaseUri()); + + EntitySpec<BrooklynNode> spec = EntitySpec.create(BrooklynNode.class); + EntityManager mgr = getManagementContextFromJettyServerAttributes(server).getEntityManager(); + BrooklynNode node = mgr.createEntity(spec); + ((EntityLocal)node).setAttribute(BrooklynNode.WEB_CONSOLE_URI, webConsoleUri); + mgr.manage(node); + Map<String, String> params = ImmutableMap.of(DeployBlueprintEffector.BLUEPRINT_CAMP_PLAN.getName(), "{ services: [ serviceType: \"java:"+BasicApplication.class.getName()+"\" ] }"); + String id = node.invoke(BrooklynNode.DEPLOY_BLUEPRINT, params).getUnchecked(); + + log.info("got: "+id); + + String apps = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications"); + List<String> appType = parseJsonList(apps, ImmutableList.of("spec", "type"), String.class); + assertEquals(appType, ImmutableList.of(BasicApplication.class.getName())); + + String status = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications/"+id+"/entities/"+id+"/sensors/service.status"); + log.info("STATUS: "+status); + } + + private <T> List<T> parseJsonList(String json, List<String> elements, Class<T> clazz) { + Function<String, List<T>> func = Functionals.chain( + JsonFunctions.asJson(), + JsonFunctions.forEach(Functionals.chain( + JsonFunctions.walk(elements), + JsonFunctions.cast(clazz)))); + return func.apply(json); + } + + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java ---------------------------------------------------------------------- diff --cc usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java index 0000000,34ea94d..ead95ba mode 000000,100644..100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java @@@ -1,0 -1,76 +1,76 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.brooklyn.rest; + + import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.FILTER; + import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.SERVLET; + import static org.apache.brooklyn.rest.BrooklynRestApiLauncher.StartMode.WEB_XML; + + import java.util.concurrent.Callable; + ++import org.apache.brooklyn.test.HttpTestUtils; + import org.apache.http.HttpStatus; + import org.eclipse.jetty.server.Server; + import org.testng.annotations.Test; + + import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; + import org.apache.brooklyn.rest.util.BrooklynRestResourceUtilsTest.SampleNoOpApplication; + import brooklyn.test.Asserts; -import brooklyn.test.HttpTestUtils; + + public class BrooklynRestApiLauncherTest extends BrooklynRestApiLauncherTestFixture { + + @Test + public void testFilterStart() throws Exception { + checkRestCatalogApplications(useServerForTest(baseLauncher().mode(FILTER).start())); + } + + @Test + public void testServletStart() throws Exception { + checkRestCatalogApplications(useServerForTest(baseLauncher().mode(SERVLET).start())); + } + + @Test + public void testWebAppStart() throws Exception { + checkRestCatalogApplications(useServerForTest(baseLauncher().mode(WEB_XML).start())); + } + + private BrooklynRestApiLauncher baseLauncher() { + return BrooklynRestApiLauncher.launcher() + .securityProvider(AnyoneSecurityProvider.class) + .forceUseOfDefaultCatalogWithJavaClassPath(true); + } + + private static void checkRestCatalogApplications(Server server) throws Exception { + final String rootUrl = "http://localhost:"+server.getConnectors()[0].getLocalPort(); + int code = Asserts.succeedsEventually(new Callable<Integer>() { + @Override + public Integer call() throws Exception { + int code = HttpTestUtils.getHttpStatusCode(rootUrl+"/v1/catalog/applications"); + if (code == HttpStatus.SC_FORBIDDEN) { + throw new RuntimeException("Retry request"); + } else { + return code; + } + } + }); + HttpTestUtils.assertHealthyStatusCode(code); + HttpTestUtils.assertContentContainsText(rootUrl+"/v1/catalog/applications", SampleNoOpApplication.class.getSimpleName()); + } + + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java ---------------------------------------------------------------------- diff --cc usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java index 0000000,c72339b..9d05dea mode 000000,100644..100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java @@@ -1,0 -1,598 +1,598 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.brooklyn.rest.resources; + + import static com.google.common.collect.Iterables.find; + import static org.testng.Assert.assertEquals; + import static org.testng.Assert.assertNotNull; + import static org.testng.Assert.assertTrue; + + import java.io.IOException; + import java.net.URI; + import java.util.Collection; + import java.util.Map; + import java.util.Set; + import java.util.concurrent.TimeoutException; + + import javax.ws.rs.core.MediaType; + import javax.ws.rs.core.MultivaluedMap; + import javax.ws.rs.core.Response; + ++import org.apache.brooklyn.test.HttpTestUtils; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import org.testng.Assert; + import org.testng.annotations.Test; + + import com.google.common.base.Predicate; + import com.google.common.base.Predicates; + import com.google.common.collect.ImmutableMap; + import com.google.common.collect.ImmutableSet; + import com.google.common.collect.Iterables; + import com.google.common.collect.Maps; + import com.sun.jersey.api.client.ClientResponse; + import com.sun.jersey.api.client.GenericType; + import com.sun.jersey.api.client.UniformInterfaceException; + import com.sun.jersey.api.client.WebResource; + import com.sun.jersey.core.util.MultivaluedMapImpl; + + import brooklyn.entity.Application; + import brooklyn.entity.basic.Attributes; + import brooklyn.entity.basic.BasicApplication; + import brooklyn.entity.basic.BasicEntity; + import brooklyn.entity.basic.Entities; + import brooklyn.entity.basic.EntityFunctions; + import brooklyn.entity.basic.EntityLocal; + import brooklyn.entity.basic.EntityPredicates; + import brooklyn.entity.basic.Lifecycle; + import brooklyn.location.basic.AbstractLocation; + import brooklyn.location.basic.LocationConfigKeys; + import brooklyn.location.basic.LocationInternal; + import brooklyn.location.geo.HostGeoInfo; + import org.apache.brooklyn.rest.domain.ApiError; + import org.apache.brooklyn.rest.domain.ApplicationSpec; + import org.apache.brooklyn.rest.domain.ApplicationSummary; + import org.apache.brooklyn.rest.domain.EffectorSummary; + import org.apache.brooklyn.rest.domain.EntityConfigSummary; + import org.apache.brooklyn.rest.domain.EntitySpec; + import org.apache.brooklyn.rest.domain.EntitySummary; + import org.apache.brooklyn.rest.domain.PolicySummary; + import org.apache.brooklyn.rest.domain.SensorSummary; + import org.apache.brooklyn.rest.domain.Status; + import org.apache.brooklyn.rest.domain.TaskSummary; + import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; + import org.apache.brooklyn.rest.testing.mocks.CapitalizePolicy; + import org.apache.brooklyn.rest.testing.mocks.NameMatcherGroup; + import org.apache.brooklyn.rest.testing.mocks.RestMockApp; + import org.apache.brooklyn.rest.testing.mocks.RestMockAppBuilder; + import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; + import brooklyn.test.Asserts; -import brooklyn.test.HttpTestUtils; + import brooklyn.util.collections.CollectionFunctionals; + import brooklyn.util.exceptions.Exceptions; + import brooklyn.util.time.Duration; + + @Test(singleThreaded = true) + public class ApplicationResourceTest extends BrooklynRestResourceTest { + + /* + * In simpleSpec, not using EverythingGroup because caused problems! The group is a child of the + * app, and the app is a member of the group. It failed in jenkins with: + * BasicApplicationImpl{id=GSPjBCe4} GSPjBCe4 + * service.isUp: true + * service.problems: {service-lifecycle-indicators-from-children-and-members=Required entity not healthy: EverythingGroupImpl{id=KQ4mSEOJ}} + * service.state: on-fire + * service.state.expected: running @ 1412003485617 / Mon Sep 29 15:11:25 UTC 2014 + * EverythingGroupImpl{id=KQ4mSEOJ} KQ4mSEOJ + * service.isUp: true + * service.problems: {service-lifecycle-indicators-from-children-and-members=Required entities not healthy: BasicApplicationImpl{id=GSPjBCe4}, EverythingGroupImpl{id=KQ4mSEOJ}} + * service.state: on-fire + * I'm guessing there's a race: the app was not yet healthy because EverythingGroup hadn't set itself to running; + * but then the EverythingGroup would never transition to healthy because one of its members was not healthy. + */ + + private static final Logger log = LoggerFactory.getLogger(ApplicationResourceTest.class); + + private final ApplicationSpec simpleSpec = ApplicationSpec.builder().name("simple-app") + .entities(ImmutableSet.of( + new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()), + new EntitySpec("simple-group", NameMatcherGroup.class.getName(), ImmutableMap.of("namematchergroup.regex", "simple-ent")) + )) + .locations(ImmutableSet.of("localhost")) + .build(); + + // Convenience for finding an EntitySummary within a collection, based on its name + private static Predicate<EntitySummary> withName(final String name) { + return new Predicate<EntitySummary>() { + public boolean apply(EntitySummary input) { + return name.equals(input.getName()); + } + }; + } + + // Convenience for finding a Map within a collection, based on the value of one of its keys + private static Predicate<? super Map<?,?>> withValueForKey(final Object key, final Object value) { + return new Predicate<Object>() { + public boolean apply(Object input) { + if (!(input instanceof Map)) return false; + return value.equals(((Map<?, ?>) input).get(key)); + } + }; + } + + @Test + public void testGetUndefinedApplication() { + try { + client().resource("/v1/applications/dummy-not-found").get(ApplicationSummary.class); + } catch (UniformInterfaceException e) { + assertEquals(e.getResponse().getStatus(), 404); + } + } + + private static void assertRegexMatches(String actual, String patternExpected) { + if (actual==null) Assert.fail("Actual value is null; expected "+patternExpected); + if (!actual.matches(patternExpected)) { + Assert.fail("Text '"+actual+"' does not match expected pattern "+patternExpected); + } + } + + @Test + public void testDeployApplication() throws Exception { + ClientResponse response = clientDeploy(simpleSpec); + + HttpTestUtils.assertHealthyStatusCode(response.getStatus()); + assertEquals(getManagementContext().getApplications().size(), 1); + assertRegexMatches(response.getLocation().getPath(), "/v1/applications/.*"); + // Object taskO = response.getEntity(Object.class); + TaskSummary task = response.getEntity(TaskSummary.class); + log.info("deployed, got " + task); + assertEquals(task.getEntityId(), getManagementContext().getApplications().iterator().next().getApplicationId()); + + waitForApplicationToBeRunning(response.getLocation()); + } + + @Test(dependsOnMethods = { "testDeleteApplication" }) + // this must happen after we've deleted the main application, as testLocatedLocations assumes a single location + public void testDeployApplicationImpl() throws Exception { + ApplicationSpec spec = ApplicationSpec.builder() + .type(RestMockApp.class.getCanonicalName()) + .name("simple-app-impl") + .locations(ImmutableSet.of("localhost")) + .build(); + + ClientResponse response = clientDeploy(spec); + assertTrue(response.getStatus() / 100 == 2, "response is " + response); + + // Expect app to be running + URI appUri = response.getLocation(); + waitForApplicationToBeRunning(response.getLocation()); + assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-impl"); + } + + @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" }) + public void testDeployApplicationFromInterface() throws Exception { + ApplicationSpec spec = ApplicationSpec.builder() + .type(BasicApplication.class.getCanonicalName()) + .name("simple-app-interface") + .locations(ImmutableSet.of("localhost")) + .build(); + + ClientResponse response = clientDeploy(spec); + assertTrue(response.getStatus() / 100 == 2, "response is " + response); + + // Expect app to be running + URI appUri = response.getLocation(); + waitForApplicationToBeRunning(response.getLocation()); + assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-interface"); + } + + @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" }) + public void testDeployApplicationFromBuilder() throws Exception { + ApplicationSpec spec = ApplicationSpec.builder() + .type(RestMockAppBuilder.class.getCanonicalName()) + .name("simple-app-builder") + .locations(ImmutableSet.of("localhost")) + .build(); + + ClientResponse response = clientDeploy(spec); + assertTrue(response.getStatus() / 100 == 2, "response is " + response); + + // Expect app to be running + URI appUri = response.getLocation(); + waitForApplicationToBeRunning(response.getLocation(), Duration.TEN_SECONDS); + assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-builder"); + + // Expect app to have the child-entity + Set<EntitySummary> entities = client().resource(appUri.toString() + "/entities") + .get(new GenericType<Set<EntitySummary>>() {}); + assertEquals(entities.size(), 1); + assertEquals(Iterables.getOnlyElement(entities).getName(), "child1"); + assertEquals(Iterables.getOnlyElement(entities).getType(), RestMockSimpleEntity.class.getCanonicalName()); + } + + @Test(dependsOnMethods = { "testDeployApplication", "testLocatedLocation" }) + public void testDeployApplicationYaml() throws Exception { + String yaml = "{ name: simple-app-yaml, location: localhost, services: [ { serviceType: "+BasicApplication.class.getCanonicalName()+" } ] }"; + + ClientResponse response = client().resource("/v1/applications") + .entity(yaml, "application/x-yaml") + .post(ClientResponse.class); + assertTrue(response.getStatus()/100 == 2, "response is "+response); + + // Expect app to be running + URI appUri = response.getLocation(); + waitForApplicationToBeRunning(response.getLocation()); + assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-yaml"); + } + + @SuppressWarnings("deprecation") + @Test + public void testReferenceCatalogEntity() throws Exception { + getManagementContext().getCatalog().addItem(BasicEntity.class); + + String yaml = "{ name: simple-app-yaml, location: localhost, services: [ { serviceType: " + BasicEntity.class.getName() + " } ] }"; + + ClientResponse response = client().resource("/v1/applications") + .entity(yaml, "application/x-yaml") + .post(ClientResponse.class); + assertTrue(response.getStatus()/100 == 2, "response is "+response); + + // Expect app to be running + URI appUri = response.getLocation(); + waitForApplicationToBeRunning(response.getLocation()); + assertEquals(client().resource(appUri).get(ApplicationSummary.class).getSpec().getName(), "simple-app-yaml"); + + ClientResponse response2 = client().resource(appUri.getPath()) + .delete(ClientResponse.class); + assertEquals(response2.getStatus(), Response.Status.ACCEPTED.getStatusCode()); + } + + @Test + public void testDeployWithInvalidEntityType() { + try { + clientDeploy(ApplicationSpec.builder() + .name("invalid-app") + .entities(ImmutableSet.of(new EntitySpec("invalid-ent", "not.existing.entity"))) + .locations(ImmutableSet.of("localhost")) + .build()); + + } catch (UniformInterfaceException e) { + ApiError error = e.getResponse().getEntity(ApiError.class); + assertEquals(error.getMessage(), "Undefined type 'not.existing.entity'"); + } + } + + @Test + public void testDeployWithInvalidLocation() { + try { + clientDeploy(ApplicationSpec.builder() + .name("invalid-app") + .entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))) + .locations(ImmutableSet.of("3423")) + .build()); + + } catch (UniformInterfaceException e) { + ApiError error = e.getResponse().getEntity(ApiError.class); + assertEquals(error.getMessage(), "Undefined location '3423'"); + } + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testListEntities() { + Set<EntitySummary> entities = client().resource("/v1/applications/simple-app/entities") + .get(new GenericType<Set<EntitySummary>>() {}); + + assertEquals(entities.size(), 2); + + EntitySummary entity = Iterables.find(entities, withName("simple-ent"), null); + EntitySummary group = Iterables.find(entities, withName("simple-group"), null); + Assert.assertNotNull(entity); + Assert.assertNotNull(group); + + client().resource(entity.getLinks().get("self")).get(ClientResponse.class); + + Set<EntitySummary> children = client().resource(entity.getLinks().get("children")) + .get(new GenericType<Set<EntitySummary>>() {}); + assertEquals(children.size(), 0); + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testListApplications() { + Set<ApplicationSummary> applications = client().resource("/v1/applications") + .get(new GenericType<Set<ApplicationSummary>>() { }); + log.info("Applications listed are: " + applications); + for (ApplicationSummary app : applications) { + if (simpleSpec.getName().equals(app.getSpec().getName())) return; + } + Assert.fail("simple-app not found in list of applications: "+applications); + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testGetApplicationOnFire() { + Application app = Iterables.find(manager.getApplications(), EntityPredicates.displayNameEqualTo(simpleSpec.getName())); + Lifecycle origState = app.getAttribute(Attributes.SERVICE_STATE_ACTUAL); + + ApplicationSummary summary = client().resource("/v1/applications/"+app.getId()) + .get(ApplicationSummary.class); + assertEquals(summary.getStatus(), Status.RUNNING); + + ((EntityLocal)app).setAttribute(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE); + try { + ApplicationSummary summary2 = client().resource("/v1/applications/"+app.getId()) + .get(ApplicationSummary.class); + log.info("Application: " + summary2); + assertEquals(summary2.getStatus(), Status.ERROR); + + } finally { + ((EntityLocal)app).setAttribute(Attributes.SERVICE_STATE_ACTUAL, origState); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test(dependsOnMethods = "testDeployApplication") + public void testFetchApplicationsAndEntity() { + Collection apps = client().resource("/v1/applications/fetch").get(Collection.class); + log.info("Applications fetched are: " + apps); + + Map app = null; + for (Object appI : apps) { + Object name = ((Map) appI).get("name"); + if ("simple-app".equals(name)) { + app = (Map) appI; + } + if (ImmutableSet.of("simple-ent", "simple-group").contains(name)) + Assert.fail(name + " should not be listed at high level: " + apps); + } + + Assert.assertNotNull(app); + Collection children = (Collection) app.get("children"); + Assert.assertEquals(children.size(), 2); + + Map entitySummary = (Map) Iterables.find(children, withValueForKey("name", "simple-ent"), null); + Map groupSummary = (Map) Iterables.find(children, withValueForKey("name", "simple-group"), null); + Assert.assertNotNull(entitySummary); + Assert.assertNotNull(groupSummary); + + String itemIds = app.get("id") + "," + entitySummary.get("id") + "," + groupSummary.get("id"); + Collection entities = client().resource("/v1/applications/fetch?items="+itemIds) + .get(Collection.class); + log.info("Applications+Entities fetched are: " + entities); + + Assert.assertEquals(entities.size(), apps.size() + 2); + Map entityDetails = (Map) Iterables.find(entities, withValueForKey("name", "simple-ent"), null); + Map groupDetails = (Map) Iterables.find(entities, withValueForKey("name", "simple-group"), null); + Assert.assertNotNull(entityDetails); + Assert.assertNotNull(groupDetails); + + Assert.assertEquals(entityDetails.get("parentId"), app.get("id")); + Assert.assertNull(entityDetails.get("children")); + Assert.assertEquals(groupDetails.get("parentId"), app.get("id")); + Assert.assertNull(groupDetails.get("children")); + + Collection entityGroupIds = (Collection) entityDetails.get("groupIds"); + Assert.assertNotNull(entityGroupIds); + Assert.assertEquals(entityGroupIds.size(), 1); + Assert.assertEquals(entityGroupIds.iterator().next(), groupDetails.get("id")); + + Collection groupMembers = (Collection) groupDetails.get("members"); + Assert.assertNotNull(groupMembers); + + for (Application appi : getManagementContext().getApplications()) { + Entities.dumpInfo(appi); + } + log.info("MEMBERS: " + groupMembers); + + Assert.assertEquals(groupMembers.size(), 1); + Map entityMemberDetails = (Map) Iterables.find(groupMembers, withValueForKey("name", "simple-ent"), null); + Assert.assertNotNull(entityMemberDetails); + Assert.assertEquals(entityMemberDetails.get("id"), entityDetails.get("id")); + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testListSensors() { + Set<SensorSummary> sensors = client().resource("/v1/applications/simple-app/entities/simple-ent/sensors") + .get(new GenericType<Set<SensorSummary>>() { }); + assertTrue(sensors.size() > 0); + SensorSummary sample = Iterables.find(sensors, new Predicate<SensorSummary>() { + @Override + public boolean apply(SensorSummary sensorSummary) { + return sensorSummary.getName().equals(RestMockSimpleEntity.SAMPLE_SENSOR.getName()); + } + }); + assertEquals(sample.getType(), "java.lang.String"); + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testListConfig() { + Set<EntityConfigSummary> config = client().resource("/v1/applications/simple-app/entities/simple-ent/config") + .get(new GenericType<Set<EntityConfigSummary>>() { }); + assertTrue(config.size() > 0); + System.out.println(("CONFIG: " + config)); + } + + @Test(dependsOnMethods = "testListConfig") + public void testListConfig2() { + Set<EntityConfigSummary> config = client().resource("/v1/applications/simple-app/entities/simple-ent/config") + .get(new GenericType<Set<EntityConfigSummary>>() {}); + assertTrue(config.size() > 0); + System.out.println(("CONFIG: " + config)); + } + + @Test(dependsOnMethods = "testDeployApplication") + public void testListEffectors() { + Set<EffectorSummary> effectors = client().resource("/v1/applications/simple-app/entities/simple-ent/effectors") + .get(new GenericType<Set<EffectorSummary>>() {}); + + assertTrue(effectors.size() > 0); + + EffectorSummary sampleEffector = find(effectors, new Predicate<EffectorSummary>() { + @Override + public boolean apply(EffectorSummary input) { + return input.getName().equals("sampleEffector"); + } + }); + assertEquals(sampleEffector.getReturnType(), "java.lang.String"); + } + + @Test(dependsOnMethods = "testListSensors") + public void testTriggerSampleEffector() throws InterruptedException, IOException { + ClientResponse response = client() + .resource("/v1/applications/simple-app/entities/simple-ent/effectors/"+RestMockSimpleEntity.SAMPLE_EFFECTOR.getName()) + .type(MediaType.APPLICATION_JSON_TYPE) + .post(ClientResponse.class, ImmutableMap.of("param1", "foo", "param2", 4)); + + assertEquals(response.getStatus(), Response.Status.ACCEPTED.getStatusCode()); + + String result = response.getEntity(String.class); + assertEquals(result, "foo4"); + } + + @Test(dependsOnMethods = "testListSensors") + public void testTriggerSampleEffectorWithFormData() throws InterruptedException, IOException { + MultivaluedMap<String, String> data = new MultivaluedMapImpl(); + data.add("param1", "foo"); + data.add("param2", "4"); + ClientResponse response = client() + .resource("/v1/applications/simple-app/entities/simple-ent/effectors/"+RestMockSimpleEntity.SAMPLE_EFFECTOR.getName()) + .type(MediaType.APPLICATION_FORM_URLENCODED_TYPE) + .post(ClientResponse.class, data); + + assertEquals(response.getStatus(), Response.Status.ACCEPTED.getStatusCode()); + + String result = response.getEntity(String.class); + assertEquals(result, "foo4"); + } + + @Test(dependsOnMethods = "testTriggerSampleEffector") + public void testBatchSensorValues() { + WebResource resource = client().resource("/v1/applications/simple-app/entities/simple-ent/sensors/current-state"); + Map<String, Object> sensors = resource.get(new GenericType<Map<String, Object>>() {}); + assertTrue(sensors.size() > 0); + assertEquals(sensors.get(RestMockSimpleEntity.SAMPLE_SENSOR.getName()), "foo4"); + } + + @Test(dependsOnMethods = "testBatchSensorValues") + public void testReadEachSensor() { + Set<SensorSummary> sensors = client().resource("/v1/applications/simple-app/entities/simple-ent/sensors") + .get(new GenericType<Set<SensorSummary>>() {}); + + Map<String, String> readings = Maps.newHashMap(); + for (SensorSummary sensor : sensors) { + try { + readings.put(sensor.getName(), client().resource(sensor.getLinks().get("self")).accept(MediaType.TEXT_PLAIN).get(String.class)); + } catch (UniformInterfaceException uie) { + if (uie.getResponse().getStatus() == 204) { // no content + readings.put(sensor.getName(), null); + } else { + Exceptions.propagate(uie); + } + } + } + + assertEquals(readings.get(RestMockSimpleEntity.SAMPLE_SENSOR.getName()), "foo4"); + } + + @Test(dependsOnMethods = "testTriggerSampleEffector") + public void testPolicyWhichCapitalizes() { + String policiesEndpoint = "/v1/applications/simple-app/entities/simple-ent/policies"; + Set<PolicySummary> policies = client().resource(policiesEndpoint).get(new GenericType<Set<PolicySummary>>(){}); + assertEquals(policies.size(), 0); + + ClientResponse response = client().resource(policiesEndpoint) + .queryParam("type", CapitalizePolicy.class.getCanonicalName()) + .type(MediaType.APPLICATION_JSON_TYPE) + .post(ClientResponse.class, Maps.newHashMap()); + assertEquals(response.getStatus(), 200); + PolicySummary policy = response.getEntity(PolicySummary.class); + assertNotNull(policy.getId()); + String newPolicyId = policy.getId(); + log.info("POLICY CREATED: " + newPolicyId); + policies = client().resource(policiesEndpoint).get(new GenericType<Set<PolicySummary>>() {}); + assertEquals(policies.size(), 1); + + Lifecycle status = client().resource(policiesEndpoint + "/" + newPolicyId).get(Lifecycle.class); + log.info("POLICY STATUS: " + status); + + response = client().resource(policiesEndpoint+"/"+newPolicyId+"/start") + .post(ClientResponse.class); + assertEquals(response.getStatus(), 204); + status = client().resource(policiesEndpoint + "/" + newPolicyId).get(Lifecycle.class); + assertEquals(status, Lifecycle.RUNNING); + + response = client().resource(policiesEndpoint+"/"+newPolicyId+"/stop") + .post(ClientResponse.class); + assertEquals(response.getStatus(), 204); + status = client().resource(policiesEndpoint + "/" + newPolicyId).get(Lifecycle.class); + assertEquals(status, Lifecycle.STOPPED); + + response = client().resource(policiesEndpoint+"/"+newPolicyId+"/destroy") + .post(ClientResponse.class); + assertEquals(response.getStatus(), 204); + + response = client().resource(policiesEndpoint+"/"+newPolicyId).get(ClientResponse.class); + log.info("POLICY STATUS RESPONSE AFTER DESTROY: " + response.getStatus()); + assertEquals(response.getStatus(), 404); + + policies = client().resource(policiesEndpoint).get(new GenericType<Set<PolicySummary>>() {}); + assertEquals(0, policies.size()); + } + + @SuppressWarnings({ "rawtypes" }) + @Test(dependsOnMethods = "testDeployApplication") + public void testLocatedLocation() { + log.info("starting testLocatedLocations"); + testListApplications(); + + LocationInternal l = (LocationInternal) getManagementContext().getApplications().iterator().next().getLocations().iterator().next(); + if (l.config().getLocalRaw(LocationConfigKeys.LATITUDE).isAbsent()) { + log.info("Supplying fake locations for localhost because could not be autodetected"); + ((AbstractLocation) l).setHostGeoInfo(new HostGeoInfo("localhost", "localhost", 50, 0)); + } + Map result = client().resource("/v1/locations/usage/LocatedLocations") + .get(Map.class); + log.info("LOCATIONS: " + result); + Assert.assertEquals(result.size(), 1); + Map details = (Map) result.values().iterator().next(); + assertEquals(details.get("leafEntityCount"), 2); + } + + @Test(dependsOnMethods = {"testListEffectors", "testFetchApplicationsAndEntity", "testTriggerSampleEffector", "testListApplications","testReadEachSensor","testPolicyWhichCapitalizes","testLocatedLocation"}) + public void testDeleteApplication() throws TimeoutException, InterruptedException { + waitForPageFoundResponse("/v1/applications/simple-app", ApplicationSummary.class); + Collection<Application> apps = getManagementContext().getApplications(); + log.info("Deleting simple-app from " + apps); + int size = apps.size(); + + ClientResponse response = client().resource("/v1/applications/simple-app") + .delete(ClientResponse.class); + + assertEquals(response.getStatus(), Response.Status.ACCEPTED.getStatusCode()); + TaskSummary task = response.getEntity(TaskSummary.class); + assertTrue(task.getDescription().toLowerCase().contains("destroy"), task.getDescription()); + assertTrue(task.getDescription().toLowerCase().contains("simple-app"), task.getDescription()); + + waitForPageNotFoundResponse("/v1/applications/simple-app", ApplicationSummary.class); + + log.info("App appears gone, apps are: " + getManagementContext().getApplications()); + // more logging above, for failure in the check below + + Asserts.eventually( + EntityFunctions.applications(getManagementContext()), + Predicates.compose(Predicates.equalTo(size-1), CollectionFunctionals.sizeFunction()) ); + } + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java ---------------------------------------------------------------------- diff --cc usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java index 0000000,6f46679..27dd701 mode 000000,100644..100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/EntityResourceTest.java @@@ -1,0 -1,190 +1,191 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.brooklyn.rest.resources; + + import java.util.Collection; + import java.util.List; + import java.util.Map; + + import javax.annotation.Nullable; + import javax.ws.rs.core.MediaType; + ++import org.apache.brooklyn.test.HttpTestUtils; + import org.codehaus.jackson.map.ObjectMapper; + import org.codehaus.jackson.type.TypeReference; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import org.testng.Assert; + import org.testng.annotations.BeforeClass; + import org.testng.annotations.Test; + + import brooklyn.entity.Entity; + import brooklyn.entity.basic.BasicApplication; + import brooklyn.entity.basic.Entities; + import brooklyn.entity.basic.EntityInternal; + import org.apache.brooklyn.rest.domain.ApplicationSpec; + import org.apache.brooklyn.rest.domain.EntitySpec; + import org.apache.brooklyn.rest.domain.TaskSummary; + import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; + import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; -import brooklyn.test.HttpTestUtils; ++import org.apache.brooklyn.test.HttpTestUtils; + import brooklyn.test.entity.TestEntity; + import brooklyn.util.collections.MutableList; + import brooklyn.util.exceptions.Exceptions; + + import com.google.common.base.Predicate; + import com.google.common.collect.ImmutableSet; + import com.google.common.collect.Iterables; + import com.sun.jersey.api.client.ClientResponse; + + @Test(singleThreaded = true) + public class EntityResourceTest extends BrooklynRestResourceTest { + + private static final Logger log = LoggerFactory.getLogger(EntityResourceTest.class); + + private final ApplicationSpec simpleSpec = ApplicationSpec.builder() + .name("simple-app") + .entities(ImmutableSet.of(new EntitySpec("simple-ent", RestMockSimpleEntity.class.getName()))) + .locations(ImmutableSet.of("localhost")) + .build(); + + private EntityInternal entity; + + private static final String entityEndpoint = "/v1/applications/simple-app/entities/simple-ent"; + + @BeforeClass(alwaysRun = true) + @Override + public void setUp() throws Exception { + super.setUp(); + + // Deploy application + ClientResponse deploy = clientDeploy(simpleSpec); + waitForApplicationToBeRunning(deploy.getLocation()); + + // Add tag + entity = (EntityInternal) Iterables.find(getManagementContext().getEntityManager().getEntities(), new Predicate<Entity>() { + @Override + public boolean apply(@Nullable Entity input) { + return "RestMockSimpleEntity".equals(input.getEntityType().getSimpleName()); + } + }); + } + + @Test + public void testTagsSanity() throws Exception { + entity.tags().addTag("foo"); + + ClientResponse response = client().resource(entityEndpoint + "/tags") + .accept(MediaType.APPLICATION_JSON_TYPE) + .get(ClientResponse.class); + String data = response.getEntity(String.class); + + try { + List<Object> tags = new ObjectMapper().readValue(data, new TypeReference<List<Object>>() {}); + Assert.assertTrue(tags.contains("foo")); + Assert.assertFalse(tags.contains("bar")); + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + throw new IllegalStateException("Error with deserialization of tags list: "+e+"\n"+data, e); + } + } + + @Test + public void testRename() throws Exception { + try { + ClientResponse response = client().resource(entityEndpoint + "/name") + .queryParam("name", "New Name") + .post(ClientResponse.class); + + HttpTestUtils.assertHealthyStatusCode(response.getStatus()); + Assert.assertTrue(entity.getDisplayName().equals("New Name")); + } finally { + // restore it for other tests! + entity.setDisplayName("simple-ent"); + } + } + + @Test + public void testAddChild() throws Exception { + try { + // to test in GUI: + // services: [ { type: brooklyn.entity.basic.BasicEntity }] + ClientResponse response = client().resource(entityEndpoint + "/children?timeout=10s") + .entity("services: [ { type: "+TestEntity.class.getName()+" }]", "application/yaml") + .post(ClientResponse.class); + + HttpTestUtils.assertHealthyStatusCode(response.getStatus()); + Assert.assertEquals(entity.getChildren().size(), 1); + Entity child = Iterables.getOnlyElement(entity.getChildren()); + Assert.assertTrue(Entities.isManaged(child)); + + TaskSummary task = response.getEntity(TaskSummary.class); + Assert.assertEquals(task.getResult(), MutableList.of(child.getId())); + + } finally { + // restore it for other tests + Collection<Entity> children = entity.getChildren(); + if (!children.isEmpty()) Entities.unmanage(Iterables.getOnlyElement(children)); + } + } + + @Test + public void testTagsDoNotSerializeTooMuch() throws Exception { + entity.tags().addTag("foo"); + entity.tags().addTag(entity.getParent()); + + ClientResponse response = client().resource(entityEndpoint + "/tags") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + String raw = response.getEntity(String.class); + log.info("TAGS raw: "+raw); + HttpTestUtils.assertHealthyStatusCode(response.getStatus()); + + Assert.assertTrue(raw.contains(entity.getParent().getId()), "unexpected app tag, does not include ID: "+raw); + + Assert.assertTrue(raw.length() < 1000, "unexpected app tag, includes too much mgmt info (len "+raw.length()+"): "+raw); + + Assert.assertFalse(raw.contains(entity.getManagementContext().getManagementNodeId()), "unexpected app tag, includes too much mgmt info: "+raw); + Assert.assertFalse(raw.contains("managementContext"), "unexpected app tag, includes too much mgmt info: "+raw); + Assert.assertFalse(raw.contains("localhost"), "unexpected app tag, includes too much mgmt info: "+raw); + Assert.assertFalse(raw.contains("catalog"), "unexpected app tag, includes too much mgmt info: "+raw); + + @SuppressWarnings("unchecked") + List<Object> tags = mapper().readValue(raw, List.class); + log.info("TAGS are: "+tags); + + Assert.assertEquals(tags.size(), 2, "tags are: "+tags); + + Assert.assertTrue(tags.contains("foo")); + Assert.assertFalse(tags.contains("bar")); + + MutableList<Object> appTags = MutableList.copyOf(tags); + appTags.remove("foo"); + Object appTag = Iterables.getOnlyElement( appTags ); + + // it's a map at this point, because there was no way to make it something stronger than Object + Assert.assertTrue(appTag instanceof Map, "Should have deserialized an entity: "+appTag); + // let's re-serialize it as an entity + appTag = mapper().readValue(mapper().writeValueAsString(appTag), Entity.class); + + Assert.assertTrue(appTag instanceof Entity, "Should have deserialized an entity: "+appTag); + Assert.assertEquals( ((Entity)appTag).getId(), entity.getApplicationId(), "Wrong ID: "+appTag); + Assert.assertTrue(appTag instanceof BasicApplication, "Should have deserialized BasicApplication: "+appTag); + } + + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/2aac052f/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java ---------------------------------------------------------------------- diff --cc usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java index 0000000,c61c327..4262384 mode 000000,100644..100644 --- a/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java +++ b/usage/rest-server/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceIntegrationTest.java @@@ -1,0 -1,83 +1,84 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.apache.brooklyn.rest.resources; + + import java.net.URI; + ++import org.apache.brooklyn.test.HttpTestUtils; + import org.apache.http.client.HttpClient; + import org.eclipse.jetty.server.Server; + import org.testng.Assert; + import org.testng.annotations.BeforeClass; + import org.testng.annotations.Test; + + import brooklyn.entity.Entity; + import brooklyn.entity.basic.BasicApplication; + import brooklyn.entity.basic.EntityInternal; + import brooklyn.entity.basic.EntityPredicates; + import brooklyn.entity.proxying.EntitySpec; + import brooklyn.management.ManagementContext; + import org.apache.brooklyn.rest.BrooklynRestApiLauncher; + import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; + import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; -import brooklyn.test.HttpTestUtils; ++import org.apache.brooklyn.test.HttpTestUtils; + import brooklyn.test.entity.LocalManagementContextForTests; + import brooklyn.util.collections.MutableList; + import brooklyn.util.http.HttpTool; + import brooklyn.util.http.HttpToolResponse; + import brooklyn.util.net.Urls; + + import com.google.common.collect.ImmutableMap; + import com.google.common.collect.Iterables; + + public class SensorResourceIntegrationTest extends BrooklynRestApiLauncherTestFixture { + + private Server server; + private ManagementContext mgmt; + private BasicApplication app; + + @BeforeClass(alwaysRun = true) + protected void setUp() { + mgmt = LocalManagementContextForTests.newInstance(); + server = useServerForTest(BrooklynRestApiLauncher.launcher() + .managementContext(mgmt) + .withoutJsgui() + .start()); + app = mgmt.getEntityManager().createEntity(EntitySpec.create(BasicApplication.class).displayName("simple-app") + .child(EntitySpec.create(Entity.class, RestMockSimpleEntity.class).displayName("simple-ent"))); + mgmt.getEntityManager().manage(app); + app.start(MutableList.of(mgmt.getLocationRegistry().resolve("localhost"))); + } + + // marked integration because of time + @Test(groups = "Integration") + public void testSensorBytes() throws Exception { + EntityInternal entity = (EntityInternal) Iterables.find(mgmt.getEntityManager().getEntities(), EntityPredicates.displayNameEqualTo("simple-ent")); + SensorResourceTest.addAmphibianSensor(entity); + + String baseUri = getBaseUri(server); + URI url = URI.create(Urls.mergePaths(baseUri, SensorResourceTest.SENSORS_ENDPOINT, SensorResourceTest.SENSOR_NAME)); + + // Uses explicit "application/json" because failed on jenkins as though "text/plain" was the default on Ubuntu jenkins! + HttpClient client = HttpTool.httpClientBuilder().uri(baseUri).build(); + HttpToolResponse response = HttpTool.httpGet(client, url, ImmutableMap.<String, String>of("Accept", "application/json")); + HttpTestUtils.assertHealthyStatusCode(response.getResponseCode()); + Assert.assertEquals(response.getContentAsString(), "\"12345 frogs\""); + } + + }
