This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 48e3cf17f93a98e0c41f81e914b952bcae3a5c16 Merge: e10cf842c1 ead3e69868 Author: Alex Heneveld <[email protected]> AuthorDate: Mon Jun 27 16:55:28 2022 +0100 Merge branch 'master' into tidy-instantiation Conflicts: camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java Think above merged correctly, but still needs testing. .gitignore | 1 + .mvn/jvm.config | 1 - server-cli/LICENSE => DEPENDENCIES | 998 ++++++++++++++++----- Jenkinsfile | 4 +- LICENSE | 735 +-------------- NOTICE | 485 +--------- README.md | 3 +- api/pom.xml | 14 +- .../brooklyn/api/catalog/BrooklynCatalog.java | 81 +- .../apache/brooklyn/api/catalog/CatalogItem.java | 10 +- .../brooklyn/api/entity/EntityInitializer.java | 8 +- .../org/apache/brooklyn/api/entity/EntitySpec.java | 23 +- .../brooklyn/api/framework/FrameworkLookup.java | 8 +- .../api/internal/AbstractBrooklynObjectSpec.java | 41 +- .../api/internal/BrooklynLoggingCategories.java | 23 +- .../brooklyn/api/location/MachineLocation.java | 7 + .../api/location/MachineManagementMixins.java | 39 +- .../apache/brooklyn/api/location/OsDetails.java | 2 +- .../apache/brooklyn/api/mgmt/EntityManager.java | 34 +- .../api/mgmt/ha/HighAvailabilityManager.java | 5 + .../ha/ManagementPlaneSyncRecordPersister.java | 3 + .../mgmt/rebind/PersistenceExceptionHandler.java | 7 + .../brooklyn/api/mgmt/rebind/RebindManager.java | 9 +- .../rebind/mementos/BrooklynMementoPersister.java | 12 +- .../api/mgmt/rebind/mementos/EntityMemento.java | 2 +- .../mgmt/rebind/mementos/ManagedBundleMemento.java | 6 + .../brooklyn/api/mgmt/rebind/mementos/Memento.java | 5 +- .../apache/brooklyn/api/objs/BrooklynObject.java | 14 +- .../brooklyn/api/objs/BrooklynObjectType.java | 2 +- .../apache/brooklyn/api/objs/EntityAdjunct.java | 4 +- .../brooklyn/api/typereg/BrooklynTypeRegistry.java | 6 +- .../apache/brooklyn/api/typereg/ManagedBundle.java | 5 +- .../brooklyn/api/typereg/OsgiBundleWithUrl.java | 4 + camp/camp-base/pom.xml | 12 +- .../apache/brooklyn/camp/BasicCampPlatform.java | 2 +- .../resolve/interpret/PlanInterpretationNode.java | 2 +- camp/camp-brooklyn/pom.xml | 14 +- .../camp/brooklyn/BrooklynCampConstants.java | 7 +- .../BrooklynAssemblyTemplateInstantiator.java | 12 +- .../BrooklynComponentTemplateResolver.java | 248 +++-- .../creation/BrooklynEntityDecorationResolver.java | 194 ++-- .../spi/creation/BrooklynEntityMatcher.java | 2 +- .../spi/creation/BrooklynYamlTypeInstantiator.java | 22 +- .../camp/brooklyn/spi/creation/CampResolver.java | 159 +++- .../spi/creation/CampTypePlanTransformer.java | 92 +- .../spi/creation/EntitySpecConfiguration.java | 2 +- .../camp/brooklyn/spi/dsl/AppGroupTraverser.java | 139 +++ .../spi/dsl/BrooklynDslDeferredSupplier.java | 22 +- .../brooklyn/spi/dsl/BrooklynDslInterpreter.java | 29 +- .../brooklyn/spi/dsl/DslDeferredFunctionCall.java | 34 +- .../spi/dsl/DslDeferredPropertyAccess.java | 152 ++++ .../brooklyn/camp/brooklyn/spi/dsl/DslUtils.java | 93 ++ .../spi/dsl/methods/BrooklynDslCommon.java | 254 +++++- .../brooklyn/spi/dsl/methods/DslComponent.java | 229 +++-- .../spi/dsl/methods/DslToStringHelpers.java | 2 +- .../camp/brooklyn/spi/dsl/parse/DslParser.java | 131 ++- .../brooklyn/spi/dsl/parse/PropertyAccess.java | 24 +- ...apache.brooklyn.core.plan.PlanToSpecTransformer | 4 + ...ooklyn.core.typereg.BrooklynTypePlanTransformer | 4 + .../camp/brooklyn/AbstractJcloudsStubYamlTest.java | 7 +- .../camp/brooklyn/AbstractWindowsYamlTest.java | 2 +- .../camp/brooklyn/AbstractYamlRebindTest.java | 11 +- .../brooklyn/camp/brooklyn/AbstractYamlTest.java | 29 +- .../camp/brooklyn/AddChildrenEffectorYamlTest.java | 133 ++- .../brooklyn/AddChildrenInitializerYamlTest.java | 139 +++ .../camp/brooklyn/ApplicationsYamlTest.java | 5 +- .../camp/brooklyn/ByonLocationsYamlTest.java | 4 +- .../camp/brooklyn/ConfigParametersYamlTest.java | 377 +++++--- .../camp/brooklyn/ConfigTypeCoercionYamlTest.java | 16 +- .../brooklyn/camp/brooklyn/ConfigYamlTest.java | 208 +++++ .../brooklyn/CustomTypeConfigYamlOsgiTest.java | 58 ++ .../camp/brooklyn/CustomTypeConfigYamlTest.java | 367 ++++++++ .../brooklyn/CustomTypeInitializerYamlTest.java | 354 ++++++++ .../brooklyn/DynamicMultiGroupYamlRebindTest.java | 173 ++++ .../brooklyn/camp/brooklyn/EntitiesYamlTest.java | 188 +++- .../brooklyn/camp/brooklyn/LocationsYamlTest.java | 67 ++ .../camp/brooklyn/MapReferenceYamlTest.java | 1 + .../camp/brooklyn/MultiLocationYamlTest.java | 2 +- .../brooklyn/camp/brooklyn/ObjectsYamlTest.java | 53 ++ .../brooklyn/camp/brooklyn/RebindOsgiTest.java | 2 +- .../camp/brooklyn/ReferencedOsgiYamlTest.java | 2 +- .../camp/brooklyn/ReferencingYamlTestEntity.java | 6 + ...a => TestSensorAndEffectorInitializerBase.java} | 73 +- .../brooklyn/ValidationMissingTypeYamlTest.java | 76 +- .../camp/brooklyn/WindowsYamlLiveTest.java | 165 +++- .../catalog/CatalogMakeOsgiBundleTest.java | 5 +- .../CatalogOsgiVersionMoreEntityRebindTest.java | 31 +- .../catalog/CatalogOsgiVersionMoreEntityTest.java | 2 +- .../catalog/CatalogOsgiYamlEntityTest.java | 194 +++- .../catalog/CatalogOsgiYamlLocationTest.java | 4 +- .../catalog/CatalogOsgiYamlPolicyTest.java | 8 +- .../catalog/CatalogOsgiYamlTemplateTest.java | 38 +- .../camp/brooklyn/catalog/CatalogScanOsgiTest.java | 113 ++- .../camp/brooklyn/catalog/CatalogYamlAppTest.java | 8 +- .../brooklyn/catalog/CatalogYamlCombiTest.java | 10 +- .../CatalogYamlEntityOsgiTypeRegistryTest.java | 100 ++- .../brooklyn/catalog/CatalogYamlEntityTest.java | 171 +++- .../brooklyn/catalog/CatalogYamlLocationTest.java | 12 +- .../brooklyn/catalog/CatalogYamlPolicyTest.java | 12 +- .../brooklyn/catalog/CatalogYamlTemplateTest.java | 8 +- .../catalog/CatalogYamlVersioningTest.java | 26 +- .../brooklyn/catalog/GetFileContentsEffector.java | 12 +- .../catalog/SpecParameterParsingOsgiTest.java | 3 +- .../brooklyn/policy/GroupsChangePolicyTest.java | 440 +++++++++ .../camp/brooklyn/rebind/RebindMiscTest.java | 166 ++++ .../brooklyn/spi/dsl/AppGroupTraverserTest.java | 154 ++++ .../brooklyn/spi/dsl/DslParseComponentsTest.java | 12 + .../camp/brooklyn/spi/dsl/DslParseTest.java | 97 +- .../brooklyn/spi/dsl/DslSerializationTest.java | 177 ++++ .../camp/brooklyn/spi/dsl/DslYamlTest.java | 116 ++- .../camp/brooklyn/spi/dsl/TagsYamlTest.java | 67 +- .../brooklyn/spi/dsl/methods/DslTestObjects.java | 20 +- .../camp/brooklyn/test/lite/CampYamlLiteTest.java | 2 +- .../test/policy/failover/ElectPrimaryTest.java | 15 +- .../rebind/misc-guava-2021-12-entity-hrxo4j0dcs | 192 ++++ ...illa-bash-netcat-w-client-and-effector-ui.yaml} | 28 +- .../resources/vanilla-bash-netcat-w-client.yaml | 2 +- .../src/test/yaml/python-webserver.bom | 2 +- camp/camp-server/pom.xml | 9 +- .../apache/brooklyn/camp/server/RestApiSetup.java | 2 +- camp/pom.xml | 2 +- core/pom.xml | 53 +- .../brooklyn/core/BrooklynFeatureEnablement.java | 7 +- .../org/apache/brooklyn/core/BrooklynLogging.java | 1 + .../org/apache/brooklyn/core/BrooklynVersion.java | 16 +- .../brooklyn/core/catalog/CatalogPredicates.java | 11 +- .../catalog/internal/BasicBrooklynCatalog.java | 804 ++++++++++------- .../core/catalog/internal/CatalogBundleDto.java | 14 +- .../core/catalog/internal/CatalogBundleLoader.java | 18 +- .../core/catalog/internal/CatalogClasspathDo.java | 4 +- .../catalog/internal/CatalogInitialization.java | 142 ++- .../core/catalog/internal/CatalogItemBuilder.java | 1 + .../catalog/internal/CatalogItemDtoAbstract.java | 3 +- .../catalog/internal/CatalogUpgradeScanner.java | 8 +- .../core/catalog/internal/CatalogUtils.java | 46 +- .../brooklyn/core/config/BasicConfigKey.java | 39 +- .../brooklyn/core/config/ConfigConstraints.java | 261 ++++-- .../apache/brooklyn/core/config/ConfigUtils.java | 23 + .../core/config/ConstraintViolationException.java | 190 +++- .../apache/brooklyn/core/config/MapConfigKey.java | 30 +- .../org/apache/brooklyn/core/config/Sanitizer.java | 247 ++++- .../PropertiesFileExternalConfigSupplier.java | 5 +- .../external/UrlsExternalConfigSupplier.java | 2 +- .../vault/VaultExternalConfigSupplier.java | 66 +- .../vault/VaultUserPassExternalConfigSupplier.java | 16 +- .../internal/AbstractCollectionConfigKey.java | 17 +- .../config/internal/AbstractConfigMapImpl.java | 135 ++- .../internal/AbstractStructuredConfigKey.java | 5 +- .../config/internal/LazyContainerAndKeyValue.java | 19 +- .../core/effector/AddChildrenEffector.java | 98 +- .../core/effector/AddDeploySensorsInitializer.java | 98 ++ .../apache/brooklyn/core/effector/AddEffector.java | 94 +- .../effector/AddEffectorInitializerAbstract.java | 71 ++ ...va => AddEffectorInitializerAbstractProto.java} | 86 +- .../apache/brooklyn/core/effector/AddSensor.java | 87 +- .../core/effector/AddSensorInitializer.java | 112 +++ .../AddSensorInitializerAbstractProto.java | 55 ++ .../brooklyn/core/effector/BasicParameterType.java | 7 +- .../brooklyn/core/effector/CompositeEffector.java | 18 +- .../brooklyn/core/effector/ProxyEffector.java | 12 +- .../core/effector/http/HttpCommandEffector.java | 17 +- .../core/effector/ssh/SshCommandEffector.java | 20 +- .../core/effector/ssh/SshEffectorTasks.java | 7 +- .../brooklyn/core/enricher/AbstractEnricher.java | 3 +- .../core/enricher/EnricherDynamicType.java | 2 +- .../brooklyn/core/entity/AbstractApplication.java | 37 +- .../brooklyn/core/entity/AbstractEntity.java | 122 ++- .../core/entity/AddChildrenInitializer.java | 61 ++ .../brooklyn/core/entity/BrooklynConfigKeys.java | 6 + .../org/apache/brooklyn/core/entity/Dumper.java | 4 +- .../org/apache/brooklyn/core/entity/Entities.java | 73 +- .../brooklyn/core/entity/EntityAdjuncts.java | 47 + .../brooklyn/core/entity/EntityDynamicType.java | 14 +- .../brooklyn/core/entity/EntityInitializers.java | 159 +++- .../brooklyn/core/entity/EntityInternal.java | 3 + .../core/entity/EntityPostInitializable.java | 22 +- .../brooklyn/core/entity/EntityPredicates.java | 23 + .../brooklyn/core/entity/StartableApplication.java | 4 + .../core/entity/internal/ConfigUtilsInternal.java | 55 ++ .../core/entity/internal/EntityConfigMap.java | 7 + .../internal/EntityTransientCopyInternal.java | 16 +- .../core/entity/lifecycle/ServiceStateLogic.java | 30 +- .../core/entity/trait/StartableMethods.java | 13 +- .../apache/brooklyn/core/feed/AbstractFeed.java | 3 +- .../brooklyn/core/feed/AttributePollHandler.java | 27 +- .../java/org/apache/brooklyn/core/feed/Poller.java | 14 +- .../core/internal/BrooklynPropertiesImpl.java | 2 +- .../brooklyn/core/location/AbstractLocation.java | 11 +- .../core/location/AbstractMachineLocation.java | 4 + .../core/location/BasicLocationRegistry.java | 76 +- .../core/location/BasicMachineMetadata.java | 25 +- .../brooklyn/core/location/BasicOsDetails.java | 9 +- .../apache/brooklyn/core/location/Locations.java | 6 +- .../core/location/MachineLifecycleUtils.java | 288 ++++++ .../location/access/PortForwardManagerImpl.java | 21 +- .../core/location/internal/LocationConfigMap.java | 16 +- .../location/internal/LocationDynamicType.java | 2 +- .../apache/brooklyn/core/mgmt/BrooklynTags.java | 277 +++++- .../brooklyn/core/mgmt/BrooklynTaskTags.java | 37 +- .../brooklyn/core/mgmt/EntityManagementUtils.java | 86 +- .../OsgiBrooklynClassLoadingContext.java | 23 +- .../entitlement/EntitlementManagerAdapter.java | 13 + .../core/mgmt/entitlement/Entitlements.java | 104 ++- .../mgmt/entitlement/WebEntitlementContext.java | 16 +- ...r.java => BrooklynBomOsgiArchiveInstaller.java} | 596 +++++++----- .../core/mgmt/ha/HighAvailabilityManagerImpl.java | 135 ++- ...ementPlaneSyncRecordPersisterToObjectStore.java | 33 +- .../apache/brooklyn/core/mgmt/ha/OsgiManager.java | 177 ++-- .../mgmt/internal/AbstractManagementContext.java | 10 +- .../mgmt/internal/AbstractSubscriptionManager.java | 10 + .../internal/AsyncCollectionChangeAdapter.java | 21 +- .../BasicExternalConfigSupplierRegistry.java | 5 +- .../mgmt/internal/BrooklynGarbageCollector.java | 171 +++- .../mgmt/internal/CollectionChangeListener.java | 6 + .../mgmt/internal/EntityManagementSupport.java | 125 ++- .../core/mgmt/internal/EntityManagerInternal.java | 13 +- .../core/mgmt/internal/LocalEntityManager.java | 312 +++++-- .../core/mgmt/internal/LocalLocationManager.java | 26 +- .../mgmt/internal/LocalSubscriptionManager.java | 18 +- .../core/mgmt/internal/LocalUsageManager.java | 20 +- .../mgmt/internal/NonDeploymentEntityManager.java | 13 +- .../internal/NonDeploymentManagementContext.java | 21 +- .../BrooklynMementoPersisterToObjectStore.java | 232 +++-- .../mgmt/persist/BrooklynPersistenceUtils.java | 20 +- .../mgmt/persist/RetryingMementoSerializer.java | 11 +- .../core/mgmt/persist/XmlMementoSerializer.java | 79 +- .../AbstractBrooklynObjectRebindSupport.java | 9 +- .../core/mgmt/rebind/BasicEntityRebindSupport.java | 3 +- .../mgmt/rebind/PeriodicDeltaChangeListener.java | 55 +- .../rebind/PersistenceExceptionHandlerImpl.java | 18 +- .../core/mgmt/rebind/RebindContextImpl.java | 8 +- .../mgmt/rebind/RebindExceptionHandlerImpl.java | 66 +- .../brooklyn/core/mgmt/rebind/RebindIteration.java | 658 ++++++++------ .../core/mgmt/rebind/RebindManagerImpl.java | 157 +++- .../core/mgmt/rebind/dto/AbstractMemento.java | 6 +- .../mgmt/rebind/dto/BasicManagedBundleMemento.java | 43 +- .../core/mgmt/rebind/dto/MementosGenerators.java | 14 +- .../core/network/AbstractOnNetworkEnricher.java | 2 +- .../brooklyn/core/objs/AbstractBrooklynObject.java | 4 + .../objs/AbstractConfigurationSupportInternal.java | 41 +- .../brooklyn/core/objs/AbstractEntityAdjunct.java | 37 +- .../brooklyn/core/objs/AdjunctConfigMap.java | 6 + .../org/apache/brooklyn/core/objs/AdjunctType.java | 62 +- .../core/objs/BasicEntityTypeRegistry.java | 4 + .../brooklyn/core/objs/BasicSpecParameter.java | 81 +- .../brooklyn/core/objs/BrooklynDynamicType.java | 40 +- .../brooklyn/core/objs/BrooklynObjectInternal.java | 5 + ...l.java => AbstractBrooklynObjectProxyImpl.java} | 184 ++-- .../core/objs/proxy/EntityAdjunctProxyImpl.java | 83 ++ .../brooklyn/core/objs/proxy/EntityProxyImpl.java | 195 +--- .../core/objs/proxy/InternalEntityFactory.java | 357 +++++--- .../brooklyn/core/plan/PlanToSpecFactory.java | 9 +- .../brooklyn/core/policy/AbstractPolicy.java | 3 +- .../brooklyn/core/policy/PolicyDynamicType.java | 2 +- .../resolve/entity/CatalogEntitySpecResolver.java | 6 +- .../entity/DelegatingEntitySpecResolver.java | 5 +- .../resolve/jackson/AsPropertyIfAmbiguous.java | 272 ++++++ .../jackson/BeanWithTypePlanTransformer.java | 94 ++ .../core/resolve/jackson/BeanWithTypeUtils.java | 275 ++++++ .../jackson/BrooklynJacksonSerializationUtils.java | 269 ++++++ .../core/resolve/jackson/BrooklynJacksonType.java | 196 ++++ ...BrooklynRegisteredTypeJacksonSerialization.java | 293 ++++++ .../resolve/jackson/CommonTypesSerialization.java | 460 ++++++++++ .../JacksonBetterDelegatingDeserializer.java | 170 ++++ .../jackson/JsonSymbolDependentDeserializer.java | 151 ++++ .../jackson/ObjectReferencingSerialization.java | 179 ++++ .../core/resolve/jackson/WrappedValue.java | 139 +++ .../jackson/WrappedValuesSerialization.java | 257 ++++++ .../core/sensor/AbstractAddSensorFeed.java | 4 +- .../core/sensor/DependentConfiguration.java | 24 +- .../brooklyn/core/sensor/DurationSinceSensor.java | 35 +- .../brooklyn/core/sensor/MaxConcurrencySensor.java | 19 +- .../apache/brooklyn/core/sensor/StaticSensor.java | 33 +- .../core/sensor/function/FunctionSensor.java | 12 +- .../core/sensor/http/HttpRequestSensor.java | 44 +- .../core/sensor/password/CreatePasswordSensor.java | 28 +- .../brooklyn/core/sensor/ssh/SshCommandSensor.java | 183 +++- .../brooklyn/core/server/BrooklynServerConfig.java | 16 +- .../typereg/AbstractCatalogBundleResolver.java | 286 ++++++ .../core/typereg/AbstractTypePlanTransformer.java | 150 +++- .../core/typereg/BasicBrooklynTypeRegistry.java | 144 +-- .../brooklyn/core/typereg/BasicManagedBundle.java | 81 +- .../core/typereg/BasicOsgiBundleWithUrl.java | 16 +- .../BrooklynBomBundleCatalogBundleResolver.java | 80 ++ .../BrooklynBomYamlCatalogBundleResolver.java | 148 +++ .../typereg/BrooklynCatalogBundleResolver.java | 168 ++++ .../typereg/BrooklynCatalogBundleResolvers.java | 221 +++++ .../core/typereg/BrooklynTypePlanTransformer.java | 26 +- .../typereg/JavaClassNameTypePlanTransformer.java | 52 +- .../typereg/ReferencedUnresolvedTypeException.java | 2 +- .../typereg/RegisteredTypeLoadingContexts.java | 20 +- .../brooklyn/core/typereg/RegisteredTypes.java | 13 +- ...pePlanException.java => TypePlanException.java} | 13 +- .../core/typereg/TypePlanTransformers.java | 84 +- ...java => UnsupportedCatalogBundleException.java} | 10 +- .../core/typereg/UnsupportedTypePlanException.java | 3 +- .../apache/brooklyn/enricher/stock/Enrichers.java | 8 +- .../enricher/stock/MathAggregatorFunctions.java | 4 +- .../enricher/stock/PercentageEnricher.java | 3 +- .../enricher/stock/PropagateToMembers.java | 92 ++ .../brooklyn/enricher/stock/Transformer.java | 50 +- .../stock/YamlTimeWeightedDeltaEnricher.java | 4 +- .../enricher/stock/aggregator/AggregationJob.java | 2 + .../stock/aggregator/DashboardAggregator.java | 10 +- .../brooklyn/entity/group/AbstractGroupImpl.java | 10 +- .../brooklyn/entity/group/DynamicClusterImpl.java | 10 +- .../brooklyn/entity/group/DynamicGroupImpl.java | 10 +- .../brooklyn/entity/group/DynamicMultiGroup.java | 8 + .../entity/group/DynamicMultiGroupImpl.java | 13 +- .../brooklyn/entity/group/GroupsChangePolicy.java | 236 +++++ .../group/SshCommandMembershipTrackingPolicy.java | 2 +- .../entity/stock/AsyncApplicationImpl.java | 2 +- .../java/org/apache/brooklyn/feed/ssh/SshFeed.java | 34 +- .../location/byon/ByonLocationResolver.java | 10 +- .../LocalhostMachineProvisioningLocation.java | 18 +- .../brooklyn/location/ssh/SshMachineLocation.java | 28 +- .../policy/AbstractInvokeEffectorPolicy.java | 2 +- .../policy/InvokeEffectorOnSensorChange.java | 39 +- .../brooklyn/util/core/BrooklynEntityUtils.java | 106 +++ .../brooklyn/util/core/ClassLoaderUtils.java | 117 ++- .../apache/brooklyn/util/core/ResourceUtils.java | 22 + .../brooklyn/util/core/config/ConfigBag.java | 45 +- .../util/core/config/ResolvingConfigBag.java | 4 +- .../brooklyn/util/core/crypto/FluentKeySigner.java | 16 + .../brooklyn/util/core/file/ArchiveBuilder.java | 8 +- .../brooklyn/util/core/file/ArchiveUtils.java | 3 + .../core/flags/BrooklynTypeNameResolution.java | 412 +++++++++ .../brooklyn/util/core/flags/MethodCoercions.java | 12 +- .../brooklyn/util/core/flags/TypeCoercions.java | 111 ++- .../util/core/internal/ssh/SshAbstractTool.java | 38 +- .../internal/ssh/sshj/SshjClientConnection.java | 2 +- .../util/core/internal/ssh/sshj/SshjTool.java | 8 + .../brooklyn/util/core/json/BidiSerialization.java | 25 +- .../util/core/json/BrooklynObjectsJsonMapper.java | 10 +- ...blyStrictPreferringFieldsVisibilityChecker.java | 8 +- .../util/core/logbook/BrooklynLogEntry.java | 151 ++++ .../util/core/logbook/DelegatingLogStore.java | 129 +++ .../util/core/logbook/LogBookQueryParams.java | 124 +++ .../brooklyn/util/core/logbook/LogStore.java | 69 ++ .../brooklyn/util/core/logbook/LogbookConfig.java | 28 +- .../util/core/logbook/file/FileLogStore.java | 267 ++++++ .../opensearch/BrooklynOpenSearchModel.java | 120 +++ .../logbook/opensearch/OpenSearchLogStore.java | 320 +++++++ .../brooklyn/util/core/osgi/BundleMaker.java | 3 +- .../org/apache/brooklyn/util/core/osgi/Osgis.java | 23 +- .../util/core/predicates/DslPredicates.java | 550 ++++++++++++ .../util/core/task/BasicExecutionContext.java | 111 ++- .../util/core/task/BasicExecutionManager.java | 997 +++++++++++++------- .../apache/brooklyn/util/core/task/BasicTask.java | 37 +- .../brooklyn/util/core/task/DeferredSupplier.java | 4 +- .../util/core/task/DynamicSequentialTask.java | 14 +- .../core/task/InterruptingImmediateSupplier.java | 3 +- .../brooklyn/util/core/task/ScheduledTask.java | 21 +- .../apache/brooklyn/util/core/task/TaskTags.java | 3 +- .../org/apache/brooklyn/util/core/task/Tasks.java | 188 ++-- .../brooklyn/util/core/task/ValueResolver.java | 277 +++--- .../ssh/internal/AbstractSshExecTaskFactory.java | 79 +- .../task/ssh/internal/PlainSshExecTaskFactory.java | 3 + .../util/core/task/system/ProcessTaskFactory.java | 3 +- .../util/core/task/system/ProcessTaskStub.java | 5 +- .../util/core/task/system/ProcessTaskWrapper.java | 60 +- .../internal/AbstractProcessTaskFactory.java | 8 +- .../system/internal/SystemProcessTaskFactory.java | 3 +- .../brooklyn/util/core/text/TemplateProcessor.java | 296 ++++-- .../brooklyn/util/core/units/AbstractUnit.java | 80 ++ .../core/units/ByteSize.java} | 39 +- .../util/core/units/DurationOrBoolean.java | 72 ++ .../core/units/Frequency.java} | 39 +- .../org/apache/brooklyn/util/core/units/Range.java | 76 ++ .../util/core/xstream/HashMultimapConverter.java | 120 +++ .../util/core/xstream/LambdaPreventionMapper.java | 117 +++ .../util/core/xstream/MutableListConverter.java | 77 ++ .../util/core/xstream/MutableSetConverter.java | 12 + .../util/core/xstream/StringKeyMapConverter.java | 21 +- .../brooklyn/util/core/xstream/XmlSerializer.java | 92 +- ...rooklyn.api.internal.ApiObjectsFactoryInterface | 4 + ...g.apache.brooklyn.api.location.LocationResolver | 4 + ...apache.brooklyn.core.plan.PlanToSpecTransformer | 4 + ...brooklyn.core.resolve.entity.EntitySpecResolver | 4 + ...lyn.core.typereg.BrooklynCatalogBundleResolver} | 7 +- ...ooklyn.core.typereg.BrooklynTypePlanTransformer | 5 + .../resources/OSGI-INF/blueprint/blueprint.xml | 18 + core/src/main/resources/catalog.bom | 68 +- .../persist/deserializingClassRenames.properties | 3 +- .../internal/StaticTypePlanTransformer.java | 19 +- .../core/config/ConfigKeyConstraintTest.java | 41 +- .../core/config/ConfigKeyDeprecationTest.java | 13 +- .../MapListAndOtherStructuredConfigKeyTest.java | 63 +- .../apache/brooklyn/core/config/SanitizerTest.java | 32 +- .../PropertiesFileExternalConfigSupplierTest.java | 9 +- .../vault/VaultExternalConfigSupplierLiveTest.java | 1 - .../core/effector/CompositeEffectorTest.java | 9 +- .../brooklyn/core/effector/ProxyEffectorTest.java | 6 +- .../core/effector/SampleManyTasksEffector.java | 14 +- .../effector/http/HttpCommandEffectorTest.java | 8 +- .../core/entity/ApplicationLoggingTest.java | 87 +- .../brooklyn/core/entity/DynamicEntityTest.java | 14 +- .../brooklyn/core/entity/EntityAssertsTest.java | 8 +- .../brooklyn/core/entity/EntityConfigTest.java | 263 +++++- .../core/entity/EntityInitializersTest.java | 47 + .../brooklyn/core/entity/EntitySpecTest.java | 3 + .../core/entity/OwnedChildrenDeprecatedTest.java | 38 +- .../core/entity/proxying/EntityManagerTest.java | 75 +- .../entity/proxying/InternalEntityFactoryTest.java | 10 +- .../brooklyn/core/location/BasicOsDetailsTest.java | 59 ++ .../core/location/LocationManagementTest.java | 2 +- .../brooklyn/core/location/SimulatedLocation.java | 18 +- .../brooklyn/core/mgmt/DeployFailureTest.java | 5 +- .../core/mgmt/entitlement/EntitlementsTest.java | 80 ++ ...va => BrooklynBomOsgiArchiveInstallerTest.java} | 22 +- .../ha/HighAvailabilityManagerTestFixture.java | 4 +- .../brooklyn/core/mgmt/ha/HotStandbyTest.java | 114 ++- .../mgmt/internal/EntityExecutionManagerTest.java | 223 ++++- .../core/mgmt/osgi/OsgiStandaloneTest.java | 5 +- .../core/mgmt/osgi/OsgiVersionMoreEntityTest.java | 2 +- .../BrooklynMementoPersisterTestFixture.java | 2 +- .../XmlMementoSerializerPerformanceTest.java | 5 +- .../mgmt/persist/XmlMementoSerializerTest.java | 36 +- .../core/mgmt/rebind/ManagementPlaneIdTest.java | 6 +- .../core/mgmt/rebind/RebindEntityTest.java | 21 +- .../rebind/RebindHistoricSshCommandSensorTest.java | 14 +- .../rebind/RebindManagerExceptionHandlerTest.java | 16 +- .../brooklyn/core/mgmt/rebind/RebindOptions.java | 6 + .../core/mgmt/rebind/RebindTestFixture.java | 16 +- .../brooklyn/core/mgmt/rebind/RebindTestUtils.java | 11 +- .../transformer/CompoundTransformerTest.java | 2 +- .../core/objs/BasicSpecParameterFromListTest.java | 29 + .../core/policy/basic/BasicPolicyTest.java | 93 +- .../resolve/jackson/BrooklynJacksonTypeTest.java | 61 ++ .../BrooklynMiscJacksonSerializationTest.java | 221 +++++ ...klynRegisteredTypeJacksonSerializationTest.java | 170 ++++ .../resolve/jackson/LoggingSerializationTest.java | 56 ++ .../core/resolve/jackson/MapperTestFixture.java | 107 +++ .../resolve/jackson/PerverseSerializationTest.java | 147 +++ .../jackson/WrappedValuesSerializationTest.java | 162 ++++ .../ssh/SshCommandSensorIntegrationTest.java | 36 +- .../core/test/BrooklynMgmtUnitTestSupport.java | 2 + .../brooklyn/core/test/entity/TestApplication.java | 4 + .../core/test/entity/TestApplicationImpl.java | 2 +- .../brooklyn/core/test/entity/TestEntity.java | 2 + .../typereg/ExampleXmlTypePlanTransformer.java | 22 +- .../core/typereg/RegisteredTypeNamingTest.java | 6 +- .../enricher/stock/PropagateToMembersTest.java | 184 ++++ .../enricher/stock/TransformingEnricherTest.java | 39 +- .../YamlRollingTimeWindowMeanEnricherTest.java | 20 +- .../stock/YamlTimeWeightedDeltaEnricherTest.java | 18 +- .../entity/group/DynamicMultiGroupRebindTest.java | 44 + .../entity/group/DynamicMultiGroupTest.java | 4 + .../brooklyn/entity/group/SequenceGroupTest.java | 12 +- .../brooklyn/feed/ssh/SshFeedIntegrationTest.java | 7 +- .../location/ssh/SshMachineLocationTest.java | 6 +- ...nvokeEffectorOnSensorChangeIntegrationTest.java | 74 +- .../brooklyn/util/core/ClassLoaderUtilsTest.java | 81 +- .../util/core/crypto/SecureKeysAndSignerTest.java | 2 +- .../core/flags/BrooklynTypeNameResolutionTest.java | 62 ++ .../util/core/internal/TypeCoercionsTest.java | 120 ++- .../util/core/internal/ssh/RecordingSshTool.java | 8 +- .../util/core/logbook/file/FileLogStoreTest.java | 512 +++++++++++ .../logbook/opensearch/OpenSearchLogStoreTest.java | 187 ++++ .../core/predicates/DslPredicateEntityTest.java | 117 +++ .../util/core/predicates/DslPredicateTest.java | 223 +++++ .../util/core/task/ScheduledExecutionTest.java | 248 +++-- .../brooklyn/util/core/task/ValueResolverTest.java | 20 +- .../util/core/text/TemplateProcessorTest.java | 24 + .../core/xstream/CompilerCompatibilityTest.java | 3 +- .../util/core/xstream/ConverterTestFixture.java | 39 +- .../core/xstream/HashMultimapConverterTest.java | 140 +++ .../core/xstream/TransformedMapConverterTest.java | 107 +++ .../util/core/xstream/XmlSerializerTest.java | 106 ++- .../brooklyn/util/core/logbook/file/log-sample.txt | 31 + core/src/test/resources/catalog.bom | 2 +- .../test/resources/ssh-command-sensor-command.sh | 4 +- karaf/commands/pom.xml | 4 +- .../apache/brooklyn/karaf/commands/EntityInfo.java | 2 +- karaf/features/README.md | 54 ++ karaf/features/pom.xml | 85 +- karaf/features/src/main/feature/feature.xml | 432 ++++++--- karaf/httpcomponent-extension/pom.xml | 2 +- karaf/init/pom.xml | 2 +- .../brooklyn/launcher/osgi/OsgiLauncherImpl.java | 213 ++++- karaf/init/src/main/resources/catalog.bom | 10 +- karaf/jetty-config/pom.xml | 2 +- karaf/jetty-config/src/main/resources/jetty.xml | 12 - karaf/pom.xml | 9 +- karaf/start/pom.xml | 2 +- launcher-common/pom.xml | 2 +- .../brooklyn/launcher/common/BasicLauncher.java | 18 +- launcher/pom.xml | 23 +- .../apache/brooklyn/launcher/BrooklynLauncher.java | 19 +- .../camp/BrooklynCampPlatformLauncher.java | 20 +- .../AbstractBrooklynLauncherRebindTest.java | 8 +- .../BrooklynLauncherHighAvailabilityTest.java | 6 +- .../BrooklynLauncherRebindCatalogOsgiTest.java | 13 +- ...ncherRebindManagementNodeStateListenerTest.java | 2 +- .../brooklyn/launcher/BrooklynLauncherTest.java | 112 ++- .../BrooklynLauncherUpgradeCatalogOsgiTest.java | 6 +- .../brooklyn/launcher/BrooklynViewerLauncher.java | 22 +- .../launcher/blueprints/AbstractBlueprintTest.java | 209 ++++- .../launcher/blueprints/SimpleBlueprintTest.java | 48 + locations/container/pom.xml | 47 +- .../brooklyn/container/entity/helm/HelmEntity.java | 93 ++ .../container/entity/helm/HelmEntityImpl.java | 364 ++++++++ .../location/kubernetes/ImageChooser.java | 6 +- .../location/kubernetes/KubernetesCerts.java | 2 +- .../kubernetes/KubernetesClientRegistryImpl.java | 67 +- .../location/kubernetes/KubernetesLocation.java | 684 +++++++------- .../kubernetes/KubernetesLocationConfig.java | 1 + .../machine/KubernetesMachineLocation.java | 6 +- .../location/openshift/OpenShiftLocation.java | 4 +- ...g.apache.brooklyn.api.location.LocationResolver | 4 + .../container/entity/helm/HelmEntityLiveTest.java | 157 ++++ .../location/kubernetes/ImageChooserTest.java | 37 +- .../kubernetes/KubernetesLocationLiveTest.java | 4 +- .../kubernetes/KubernetesLocationYamlLiveTest.java | 80 +- .../test/resources/generic-application.tests.bom | 2 +- .../container/src/test/resources/generic.tests.bom | 2 +- .../src/test/resources/nginx-2-deployment.yaml | 23 +- .../src/test/resources/nginx-2-service.yaml | 14 +- locations/jclouds/pom.xml | 32 +- .../jclouds/DefaultConnectivityResolver.java | 20 +- .../brooklyn/location/jclouds/JcloudsLocation.java | 149 ++- .../location/jclouds/JcloudsMachineLocation.java | 10 +- .../jclouds/JcloudsSshMachineLocation.java | 12 +- .../location/jclouds/JcloudsTypeCoercions.java | 5 +- .../brooklyn/location/jclouds/JcloudsUtil.java | 2 +- .../jclouds/api/JcloudsLocationPublic.java | 2 +- .../templates/customize/TemplateOptionsOption.java | 2 +- ...g.apache.brooklyn.api.location.LocationResolver | 4 + .../core/mgmt/persist/jclouds/BlobStoreTest.java | 4 +- .../JcloudsBlobStoreBasedObjectStoreTest.java | 6 +- .../jclouds/DefaultConnectivityResolverTest.java | 6 +- .../jclouds/JcloudsLocationMetadataTest.java | 6 +- ...tionReachabilityPredicateInstantiationTest.java | 8 +- ...cloudsLocationSuspendResumeMachineLiveTest.java | 46 +- .../jclouds/JcloudsStubTemplateBuilder.java | 4 +- .../JcloudsTypeCoercionsWithBuilderTest.java | 2 +- .../JcloudsReachableAddressStubbedTest.java | 2 +- .../jclouds/provider/AwsEc2LocationLiveTest.java | 15 +- logging/logback-includes/pom.xml | 2 +- .../resources/brooklyn/logback-appender-file.xml | 6 +- .../brooklyn/logback-appender-jclouds.xml | 3 +- .../resources/brooklyn/logback-appender-stdout.xml | 4 +- .../resources/brooklyn/logback-logger-excludes.xml | 13 +- logging/logback-xml/pom.xml | 2 +- parent/pom.xml | 536 +---------- policy/pom.xml | 2 +- .../action/AbstractScheduledEffectorPolicy.java | 44 +- .../policy/action/PeriodicEffectorPolicy.java | 1 + .../policy/autoscaling/AutoScalerPolicy.java | 16 + .../policy/failover/ElectPrimaryEffector.java | 19 +- .../policy/failover/ElectPrimaryPolicy.java | 39 +- .../policy/failover/PrimaryRunningEnricher.java | 5 + policy/src/main/resources/catalog.bom | 22 +- .../policy/action/PeriodicEffectorPolicyTest.java | 8 + .../policy/enricher/DeltaEnrichersTests.java | 22 +- .../policy/enricher/RollingMeanEnricherTest.java | 6 +- .../RollingTimeWindowMeanEnricherTest.java | 20 +- .../enricher/TimeFractionDeltaEnricherTest.java | 6 +- .../loadbalancing/LoadBalancingModelTest.java | 2 +- .../loadbalancing/LoadBalancingPolicyTest.java | 4 +- pom.xml | 778 ++++++++++++++-- rest/rest-api/pom.xml | 18 +- .../org/apache/brooklyn/rest/api/AccessApi.java | 16 +- .../org/apache/brooklyn/rest/api/ActivityApi.java | 38 +- .../org/apache/brooklyn/rest/api/AdjunctApi.java | 71 +- .../apache/brooklyn/rest/api/ApplicationApi.java | 219 ++++- .../org/apache/brooklyn/rest/api/BundleApi.java | 154 +++- .../org/apache/brooklyn/rest/api/CatalogApi.java | 254 ++++-- .../org/apache/brooklyn/rest/api/EffectorApi.java | 12 +- .../org/apache/brooklyn/rest/api/EntityApi.java | 204 ++++- .../apache/brooklyn/rest/api/EntityConfigApi.java | 70 +- .../org/apache/brooklyn/rest/api/LocationApi.java | 44 +- .../rest/api/{ScriptApi.java => LogbookApi.java} | 42 +- .../org/apache/brooklyn/rest/api/LogoutApi.java | 24 +- .../org/apache/brooklyn/rest/api/PolicyApi.java | 2 +- .../apache/brooklyn/rest/api/PolicyConfigApi.java | 2 +- .../org/apache/brooklyn/rest/api/ScriptApi.java | 10 +- .../org/apache/brooklyn/rest/api/SensorApi.java | 66 +- .../org/apache/brooklyn/rest/api/ServerApi.java | 159 +++- .../java/org/apache/brooklyn/rest/api/TypeApi.java | 49 +- .../org/apache/brooklyn/rest/api/UsageApi.java | 25 +- .../apache/brooklyn/rest/domain/AdjunctDetail.java | 10 +- .../apache/brooklyn/rest/domain/BundleSummary.java | 11 +- .../rest/domain/HighAvailabilitySummary.java | 8 +- .../brooklyn/rest/domain/RelationSummary.java | 72 ++ .../apache/brooklyn/rest/domain/RelationType.java | 79 ++ rest/rest-resources/pom.xml | 30 +- .../org/apache/brooklyn/rest/BrooklynRestApi.java | 42 +- .../org/apache/brooklyn/rest/BrooklynRestApp.java | 2 +- .../apache/brooklyn/rest/BrooklynWebConfig.java | 29 +- .../BrooklynSecurityProviderFilterHelper.java | 101 ++- .../BrooklynSecurityProviderFilterJavax.java | 35 +- .../BrooklynSecurityProviderFilterJersey.java | 10 +- .../brooklyn/rest/filter/CsrfTokenFilter.java | 9 +- .../rest/filter/EntitlementContextFilter.java | 35 +- .../rest/filter/HaHotCheckHelperAbstract.java | 23 +- .../rest/filter/HaHotCheckResourceFilter.java | 43 +- .../rest/filter/LoggingResourceFilter.java | 29 +- .../resources/AbstractBrooklynRestResource.java | 64 +- .../brooklyn/rest/resources/AdjunctResource.java | 11 +- .../brooklyn/rest/resources/ApidocResource.java | 30 +- .../rest/resources/ApplicationResource.java | 216 +++-- .../brooklyn/rest/resources/BundleResource.java | 102 ++- .../brooklyn/rest/resources/CatalogResource.java | 131 ++- .../brooklyn/rest/resources/EffectorResource.java | 6 +- .../rest/resources/EntityConfigResource.java | 56 +- .../brooklyn/rest/resources/EntityResource.java | 133 ++- .../brooklyn/rest/resources/LocationResource.java | 3 + .../brooklyn/rest/resources/LogbookResource.java | 60 ++ .../brooklyn/rest/resources/PolicyResource.java | 27 +- .../brooklyn/rest/resources/ScriptResource.java | 2 +- .../brooklyn/rest/resources/SensorResource.java | 24 +- .../brooklyn/rest/resources/ServerResource.java | 232 ++++- .../brooklyn/rest/resources/TypeResource.java | 21 +- .../provider/DelegatingSecurityProvider.java | 29 +- .../security/provider/LdapSecurityProvider.java | 209 ++++- .../rest/transform/ApplicationTransformer.java | 6 +- .../transform/HighAvailabilityTransformer.java | 2 +- .../brooklyn/rest/transform/SensorTransformer.java | 3 +- .../brooklyn/rest/transform/TaskTransformer.java | 5 +- .../brooklyn/rest/transform/TypeTransformer.java | 86 +- .../brooklyn/rest/util/DefaultExceptionMapper.java | 6 +- .../brooklyn/rest/util/EntityAttributesUtils.java | 49 + .../brooklyn/rest/util/EntityRelationUtils.java | 49 + .../rest/util/MultiSessionAttributeAdapter.java | 356 ++++++-- .../brooklyn/rest/util/ScannerInjectHelper.java | 6 +- .../brooklyn/rest/util/WebResourceUtils.java | 5 +- .../main/resources/OSGI-INF/blueprint/service.xml | 2 + .../brooklyn/rest/resources/ActivityRestTest.java | 47 +- .../rest/resources/AdjunctResourceTest.java | 50 +- .../rest/resources/ApidocResourceTest.java | 2 +- .../rest/resources/ApplicationResourceTest.java | 82 +- .../rest/resources/BundleAndTypeResourcesTest.java | 41 +- .../rest/resources/CatalogResourceTest.java | 23 +- .../rest/resources/EffectorResourceTest.java | 4 +- .../rest/resources/EffectorUtilsRestTest.java | 2 +- .../rest/resources/EntityConfigResourceTest.java | 76 +- .../resources/EntityRelationsResourceTest.java | 162 ++++ .../rest/resources/EntityResourceTest.java | 44 +- .../rest/resources/LocationResourceTest.java | 51 ++ .../rest/resources/LogbookResourceTest.java | 219 +++++ .../rest/resources/SensorResourceTest.java | 33 +- .../provider/LdapSecurityProviderLiveTest.java | 88 ++ .../provider/LdapSecurityProviderTest.java | 55 ++ .../brooklyn/rest/testing/BrooklynRestApiTest.java | 16 +- .../rest/testing/BrooklynRestResourceTest.java | 25 +- .../rest/testing/mocks/RestMockSimpleEntity.java | 3 + .../util/json/BrooklynJacksonSerializerTest.java | 332 ++++++- .../test/resources/localhost.default.location.zip | Bin 0 -> 19629 bytes .../src/test/resources/logbook.log.sample | 5 + rest/rest-server/pom.xml | 18 +- .../org/apache/brooklyn/rest/RestApiSetup.java | 2 +- .../brooklyn/rest/filter/HaMasterCheckFilter.java | 21 +- rest/rest-server/src/main/webapp/WEB-INF/web.xml | 1 + .../rest/BrooklynRestApiLauncherTestFixture.java | 5 + .../brooklyn/rest/api/ApplicationApiTest.java | 89 ++ server-cli/{LICENSE => DEPENDENCIES} | 953 +++++++++++++++----- server-cli/LICENSE | 794 +--------------- server-cli/NOTICE | 550 +----------- server-cli/pom.xml | 9 +- .../java/org/apache/brooklyn/cli/AbstractMain.java | 10 +- .../org/apache/brooklyn/cli/CloudExplorer.java | 4 +- .../java/org/apache/brooklyn/cli/ItemLister.java | 4 + .../main/java/org/apache/brooklyn/cli/Main.java | 2 +- software/base/pom.xml | 14 +- .../brooklyn/entity/brooklynnode/BrooklynNode.java | 2 +- .../entity/brooklynnode/BrooklynNodeImpl.java | 4 +- .../entity/brooklynnode/BrooklynNodeSshDriver.java | 6 +- .../entity/java/JavaSoftwareProcessSshDriver.java | 2 +- .../brooklyn/entity/java/JmxAttributeSensor.java | 29 +- .../apache/brooklyn/entity/java/JmxSupport.java | 6 +- .../brooklyn/entity/java/JmxmpSslSupport.java | 2 +- .../entity/java/VanillaJavaAppSshDriver.java | 5 +- .../brooklyn/entity/machine/AddMachineMetrics.java | 4 +- .../base/AbstractSoftwareProcessSshDriver.java | 6 +- .../base/AbstractSoftwareProcessWinRmDriver.java | 38 +- .../SameServerDriverLifecycleEffectorTasks.java | 3 +- ...oftwareProcessDriverLifecycleEffectorTasks.java | 52 +- .../entity/software/base/SoftwareProcessImpl.java | 3 - .../lifecycle/MachineLifecycleEffectorTasks.java | 239 +++-- .../software/base/lifecycle/ScriptHelper.java | 6 +- .../base/lifecycle/WinRmExecuteHelper.java | 44 +- .../org/apache/brooklyn/feed/jmx/JmxHelper.java | 7 + .../brooklyn/tasks/kubectl/ContainerCommons.java | 52 ++ .../tasks/kubectl/ContainerTaskFactory.java | 139 +++ .../brooklyn/tasks/kubectl/DockerEffector.java | 82 ++ .../brooklyn/tasks/kubectl/DockerSensor.java | 102 +++ .../apache/brooklyn/tasks/kubectl/JobBuilder.java | 400 +++++++++ ...g.apache.brooklyn.api.location.LocationResolver | 4 + ...brooklyn.core.resolve.entity.EntitySpecResolver | 4 + software/base/src/main/resources/catalog.bom | 19 +- .../OnTheFlyDynamicLocationPatternRebindTest.java} | 8 +- .../OnTheFlyDynamicLocationPatternTest.java} | 6 +- .../{clocker => onthefly}/StubAttributes.java | 2 +- .../{clocker => onthefly}/StubContainer.java | 2 +- .../{clocker => onthefly}/StubContainerImpl.java | 2 +- .../StubContainerLocation.java | 2 +- .../dynamic/{clocker => onthefly}/StubHost.java | 2 +- .../{clocker => onthefly}/StubHostImpl.java | 2 +- .../{clocker => onthefly}/StubHostLocation.java | 2 +- .../{clocker => onthefly}/StubInfrastructure.java | 2 +- .../StubInfrastructureImpl.java | 2 +- .../StubInfrastructureLocation.java | 2 +- .../{clocker => onthefly}/StubResolver.java | 2 +- .../{clocker => onthefly}/StubResolverTest.java | 2 +- .../dynamic/{clocker => onthefly}/StubUtils.java | 2 +- .../base/AbstractSoftwareProcessStreamsTest.java | 35 +- .../SoftwareProcessEntityHttpFeedRebindTest.java | 2 +- ...nillaSoftwareProcessStreamsIntegrationTest.java | 14 +- .../base/VanillaSoftwareProcessStreamsTest.java | 146 +++ .../VanillaWindowsProcessWinrmStreamsLiveTest.java | 4 +- .../SoftwareProcessLocationUnmanageTest.java | 4 +- .../base/test/location/WindowsTestFixture.java | 5 +- .../test/mysql/DynamicToyMySqlEntityBuilder.java | 7 +- .../brooklyn/tasks/kubectl/DockerEffectorTest.java | 112 +++ .../brooklyn/tasks/kubectl/DockerSensorTest.java | 125 +++ .../brooklyn/tasks/kubectl/JobBuilderTest.java | 159 ++++ .../org/apache/brooklyn/kubectl/sample-both.yaml | 38 + .../brooklyn/kubectl/sample-effector-dev.yaml | 34 + .../apache/brooklyn/kubectl/sample-effector.yaml | 32 + .../org/apache/brooklyn/kubectl/sample-sensor.yaml | 30 + software/winrm/pom.xml | 7 +- .../core/sensor/windows/WinRmCommandSensor.java | 51 +- .../windows/WindowsPerformanceCounterSensors.java | 23 +- .../location/winrm/PlainWinRmExecTaskFactory.java | 100 +++ .../location/winrm/WinRmMachineLocation.java | 147 ++- .../location/winrm/WinRmPutTaskFactory.java | 120 +++ .../brooklyn/location/winrm/WinRmPutTaskStub.java | 68 ++ .../location/winrm/WinRmPutTaskWrapper.java | 185 ++++ .../apache/brooklyn/location/winrm/WinRmTasks.java | 57 ++ .../util/core/internal/winrm/WinRmTool.java | 4 +- .../internal/winrm/winrm4j/PrettyXmlWriter.java | 146 +++ .../core/internal/winrm/winrm4j/Winrm4jTool.java | 38 +- .../feed/windows/WinRmCommandSensorTest.java | 21 +- .../brooklyn/feed/windows/WinRmFeedLiveTest.java | 7 +- .../WindowsPerformanceCounterSensorsTest.java | 6 +- .../winrm/winrm4j/PrettyXmlWriterTest.java | 187 ++++ test-framework/pom.xml | 2 +- test-framework/src/main/resources/catalog.bom | 2 +- .../LoopOverGroupMembersTestCaseTest.java | 7 +- .../test/framework/TestEndpointReachableTest.java | 6 +- .../example-catalog-test.bom | 2 +- .../test-framework-examples/example-catalog.bom | 2 +- test-support/pom.xml | 2 +- .../java/org/apache/brooklyn/test/LogWatcher.java | 80 +- .../META-INF/services/org.testng.ITestNGListener | 24 +- .../dependencies/osgi/{entities => beans}/pom.xml | 10 +- .../org/apache/brooklyn/test/osgi/SampleBean.java | 10 +- .../osgi/beans/src/main}/resources/catalog.bom | 8 +- .../dependencies/osgi/com-example-entities/pom.xml | 2 +- utils/common/dependencies/osgi/entities/pom.xml | 2 +- .../dependencies/osgi/more-entities-v1/pom.xml | 2 +- .../osgi/more-entities-v2-evil-twin/pom.xml | 2 +- .../dependencies/osgi/more-entities-v2/pom.xml | 2 +- utils/common/pom.xml | 16 +- .../java/org/apache/brooklyn/config/ConfigMap.java | 8 +- .../core/validation/BrooklynValidation.java | 116 +++ .../java/org/apache/brooklyn/test/Asserts.java | 129 ++- .../util/collections/CollectionFunctionals.java | 40 +- .../brooklyn/util/collections/MutableList.java | 56 +- .../brooklyn/util/collections/MutableMap.java | 22 +- .../brooklyn/util/collections/MutableSet.java | 12 +- .../brooklyn/util/exceptions/Exceptions.java | 2 +- .../util/exceptions/ReferenceWithError.java | 2 +- .../exceptions/RuntimeInterruptedException.java | 12 +- .../brooklyn/util/guava/EmptyImmutableBiMap.java | 133 +++ .../java/org/apache/brooklyn/util/guava/Maybe.java | 267 +++++- .../org/apache/brooklyn/util/guava/TypeTokens.java | 134 ++- .../java/org/apache/brooklyn/util/io/FileUtil.java | 18 + .../org/apache/brooklyn/util/javalang/Boxing.java | 3 +- .../brooklyn/util/javalang/JavaClassNames.java | 3 +- .../apache/brooklyn/util/javalang/Reflections.java | 17 +- .../javalang/coerce/CommonAdaptorTryCoercions.java | 13 +- .../coerce/CommonAdaptorTypeCoercions.java | 71 +- .../coerce/PrimitiveStringTypeCoercions.java | 66 +- .../javalang/coerce/TypeCoercerExtensible.java | 26 +- .../org/apache/brooklyn/util/net/Networking.java | 4 +- .../brooklyn/util/net/UserAndHostAndPort.java | 2 +- .../main/java/org/apache/brooklyn/util/os/Os.java | 17 + .../apache/brooklyn/util/osgi/OsgiActivator.java | 11 + .../apache/brooklyn/util/osgi/VersionedName.java | 2 +- .../org/apache/brooklyn/util/ssh/BashCommands.java | 29 +- .../brooklyn/util/stream/InputStreamSource.java | 109 +++ .../brooklyn/util/stream/InputStreamSupplier.java | 51 -- .../apache/brooklyn/util/stream/StreamGobbler.java | 86 +- .../brooklyn/util/text/BrooklynVersionSyntax.java | 6 +- .../apache/brooklyn/util/text/StringFunctions.java | 10 +- .../org/apache/brooklyn/util/text/Strings.java | 81 +- .../apache/brooklyn/util/text/WildcardGlobs.java | 6 +- .../org/apache/brooklyn/util/time/Duration.java | 18 +- .../java/org/apache/brooklyn/util/time/Time.java | 249 +++-- .../org/apache/brooklyn/util/time/Timestamp.java | 57 ++ .../java/org/apache/brooklyn/util/yaml/Yamls.java | 81 +- .../core/validation/BrooklynValidationTest.java | 152 ++++ .../collections/CollectionFunctionalsTest.java | 28 +- .../apache/brooklyn/util/guava/TypeTokensTest.java | 47 + .../org/apache/brooklyn/util/io/FileUtilTest.java | 44 +- .../javalang/coerce/TypeCoercerExtensibleTest.java | 3 +- .../util/javalang/coerce/TypeCoercionsTest.java | 31 +- .../brooklyn/util/maven/MavenArtifactTest.java | 4 +- .../brooklyn/util/net/UserAndHostAndPortTest.java | 4 +- .../brooklyn/util/osgi/OsgiTestResources.java | 6 +- .../brooklyn/util/stream/StreamGobblerTest.java | 74 +- .../util/text/BrooklynVersionSyntaxTest.java | 5 +- .../org/apache/brooklyn/util/text/StringsTest.java | 11 + .../apache/brooklyn/util/time/DurationTest.java | 21 +- .../org/apache/brooklyn/util/time/TimeTest.java | 35 +- .../org/apache/brooklyn/util/yaml/YamlsTest.java | 10 +- .../brooklyn/files/testNoJava-0.1.0-SNAPSHOT.jar | Bin 0 -> 1636 bytes .../brooklyn/files/testWithJava-0.1.0-SNAPSHOT.jar | Bin 0 -> 4436 bytes .../brooklyn/osgi/brooklyn-osgi-test-a_0.1.0.txt | 2 +- .../brooklyn/osgi/brooklyn-test-osgi-beans.jar | Bin 0 -> 11696 bytes ...st-a_0.1.0.txt => brooklyn-test-osgi-beans.txt} | 8 +- .../brooklyn/osgi/brooklyn-test-osgi-entities.txt | 4 +- .../brooklyn-test-osgi-more-entities_0.1.0.txt | 4 +- .../brooklyn-test-osgi-more-entities_0.2.0.txt | 4 +- ...lyn-test-osgi-more-entities_evil-twin_0.2.0.txt | 4 +- utils/groovy/pom.xml | 2 +- utils/jmx/jmxmp-ssl-agent/pom.xml | 2 +- .../apache/brooklyn/util/jmx/jmxmp/JmxmpAgent.java | 5 +- .../brooklyn/util/jmx/jmxmp/JmxmpAgentSslTest.java | 4 +- utils/jmx/jmxrmi-agent/pom.xml | 2 +- utils/rest-swagger/pom.xml | 14 +- .../rest/apidoc/RestApiResourceScanner.java | 115 ++- utils/rt-felix/pom.xml | 6 +- .../brooklyn/rt/felix/EmbeddedFelixFramework.java | 23 +- .../org.apache.brooklyn.util.osgi.SystemFramework | 4 + .../rt/felix/EmbeddedFelixFrameworkTest.java | 15 +- utils/test-support/pom.xml | 2 +- .../brooklyn/test/support/VerboseReporter.java | 11 +- .../resources/brooklyn/logback-appender-file.xml | 3 +- .../src/main/resources/logback-test.xml | 3 + 832 files changed, 41278 insertions(+), 11613 deletions(-) diff --cc camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java index f261bcaba2,ca96826a9b..f094e8a6cc --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java @@@ -79,9 -80,13 +80,14 @@@ public class BrooklynAssemblyTemplateIn CampPlatform platform, BrooklynClassLoadingContext loader, Set<String> encounteredTypeSymbolicNames) { - // during catalog install, the ID is an unhelpful random ID. but logging added there now tells us more. - // in most cases the ID is meaningful however, and useful for context for subsequent errors. - log.debug("CAMP creating application instance for {} ({})", template.getId(), template); ++ + if (BasicBrooklynCatalog.currentlyResolvingType.get()!=null) { + if (log.isTraceEnabled()) { + log.trace("CAMP instantiating application to resolve {} ({} / {})", BasicBrooklynCatalog.currentlyResolvingType.get(), template.getId(), CampResolver.currentlyCreatingSpec.get()); + } + } else { + log.debug("CAMP instantiating application for {} ({})", template.getId(), CampResolver.currentlyCreatingSpec.get()); + } // AssemblyTemplates created via PDP, _specifying_ then entities to put in diff --cc core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java index 846a2879bf,304f90d93c..ade47e671d --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java @@@ -131,14 -116,15 +116,18 @@@ public class BasicBrooklynCatalog imple /** Header on bundle indicating it is a wrapped BOM with no other resources */ public static final String BROOKLYN_WRAPPED_BOM_BUNDLE = "Brooklyn-Wrapped-BOM"; + @VisibleForTesting public static final boolean AUTO_WRAP_CATALOG_YAML_AS_BUNDLE = true; - + + /** key within brooklyn.catalog containing a map of items used to generate headers if an OSGi bundle is being produced by wrapping the YAML */ + public static final String CATALOG_OSGI_WRAP_HEADERS = "catalog.osgi.wrap.headers"; + private static final Logger log = LoggerFactory.getLogger(BasicBrooklynCatalog.class); + private static boolean ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS = true; + private static boolean ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS = true; + public static class BrooklynLoaderTracker { public static final ThreadLocal<BrooklynClassLoadingContext> loader = new ThreadLocal<BrooklynClassLoadingContext>(); @@@ -791,8 -751,11 +755,12 @@@ log.warn("Name property will be ignored due to the existence of displayName and at least one of id, symbolicName"); } - log.debug("Processing "+Arrays.asList(id, symbolicName, displayName, name, "anonymous item").stream().filter(Strings::isNonBlank).findFirst()+" for catalog addition"); - PlanInterpreterGuessingType planInterpreter = new PlanInterpreterGuessingType(null, item, sourceYaml, itemType, libraryBundles, resultLegacyFormat).reconstruct(); + CharSequence loggedId = Strings.firstNonBlank(id, symbolicName, displayName, "<unidentified>"); + log.debug("Analyzing item " + loggedId + " for addition to catalog"); + PlanInterpreterInferringType planInterpreter = new PlanInterpreterInferringType(id, item, sourceYaml, itemType, format, + (containingBundle instanceof CatalogBundle ? ((CatalogBundle)containingBundle) : null), libraryBundles, + null, resultLegacyFormat).resolve(); ++ Exception resolutionError = null; if (!planInterpreter.isResolved()) { // don't throw yet, we may be able to add it in an unresolved state @@@ -998,10 -969,16 +974,16 @@@ sourcePlanYaml = planInterpreter.itemYaml; } - BasicRegisteredType type = createYetUnsavedRegisteredTypeInstance(RegisteredTypeKind.UNRESOLVED, symbolicName, version, - BasicTypeImplementationPlan plan = new BasicTypeImplementationPlan(format, sourcePlanYaml); - BasicRegisteredType type = (BasicRegisteredType) RegisteredTypes.newInstance( ++ ++ BasicRegisteredType type = createYetUnsavedRegisteredTypeInstance( + BrooklynObjectType.of(planInterpreter.catalogItemType).getSpecType()!=null ? RegisteredTypeKind.SPEC + : planInterpreter.catalogItemType==CatalogItemType.BEAN ? RegisteredTypeKind.BEAN + : RegisteredTypeKind.UNRESOLVED, - symbolicName, version, plan, - superTypes, aliases, tags, containingBundle==null ? null : containingBundle.getVersionedName().toString(), - MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles), - displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled); - RegisteredTypes.notePlanEquivalentToThis(type, plan); ++ symbolicName, version, + containingBundle, libraryBundles, + displayName, description, catalogIconUrl, catalogDeprecated, sourcePlanYaml, + tags, aliases, catalogDisabled, superTypes, format); ++ // record original source in case it was changed RegisteredTypes.notePlanEquivalentToThis(type, new BasicTypeImplementationPlan(format, sourceYaml)); @@@ -1029,25 -1008,49 +1013,67 @@@ } } + private BasicRegisteredType createYetUnsavedRegisteredTypeInstance( - RegisteredTypeKind kind, - String symbolicName, String version, - ManagedBundle containingBundle, Collection<CatalogBundle> libraryBundles, - String displayName, String description, - String catalogIconUrl, final Boolean catalogDeprecated, String sourcePlanYaml, Set<Object> tags, List<String> aliases, - Boolean catalogDisabled, MutableList<Object> superTypes, String format) - { ++ RegisteredTypeKind kind, ++ String symbolicName, String version, ++ ManagedBundle containingBundle, Collection<CatalogBundle> libraryBundles, ++ String displayName, String description, ++ String catalogIconUrl, final Boolean catalogDeprecated, String sourcePlanYaml, Set<Object> tags, List<String> aliases, ++ Boolean catalogDisabled, MutableList<Object> superTypes, String format) { + BasicTypeImplementationPlan plan = new BasicTypeImplementationPlan(format, sourcePlanYaml); + BasicRegisteredType type = (BasicRegisteredType) RegisteredTypes.newInstance( - kind, - symbolicName, version, plan, - superTypes, aliases, tags, containingBundle==null ? null : containingBundle.getVersionedName().toString(), - MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles), - displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled); ++ kind, ++ symbolicName, version, plan, ++ superTypes, aliases, tags, containingBundle == null ? null : containingBundle.getVersionedName().toString(), ++ MutableList.<OsgiBundleWithUrl>copyOf(libraryBundles), ++ displayName, description, catalogIconUrl, catalogDeprecated, catalogDisabled); + RegisteredTypes.notePlanEquivalentToThis(type, plan); + return type; + } + + private void addLegacyScannedAnnotations(ManagedBundle containingBundle, List<CatalogItemDtoAbstract<?, ?>> resultLegacyFormat, Map<RegisteredType, RegisteredType> resultNewFormat, int depth, Map<Object, Object> catalogMetadata, Collection<CatalogBundle> librariesAddedHereBundles, Collection<CatalogBundle> libraryBundles) { + log.warn("Deprecated use of scanJavaAnnotations" + (containingBundle != null ? " in bundle " + containingBundle.getVersionedName() : "")); + + if (isNoBundleOrSimpleWrappingBundle(mgmt, containingBundle)) { + Collection<CatalogItemDtoAbstract<?, ?>> scanResult; + // BOMs wrapped in JARs, or without JARs, have special treatment + if (isLibrariesMoreThanJustContainingBundle(librariesAddedHereBundles, containingBundle)) { + // legacy mode, since 0.12.0, scan libraries referenced in a legacy non-bundle BOM + log.warn("Deprecated use of scanJavaAnnotations to scan other libraries ("+ librariesAddedHereBundles +"); libraries should declare they scan themselves"); + scanResult = scanAnnotationsLegacyInListOfLibraries(mgmt, librariesAddedHereBundles, catalogMetadata, containingBundle); + } else if (!isLibrariesMoreThanJustContainingBundle(libraryBundles, containingBundle)) { + // for default catalog, no libraries declared, we want to scan local classpath + // bundle should be named "brooklyn-default-catalog" + if (containingBundle !=null && !containingBundle.getSymbolicName().contains("brooklyn-default-catalog")) { + // a user uplaoded a BOM trying to tell us to do a local java scan; previously supported but becoming unsupported + log.warn("Deprecated use of scanJavaAnnotations in non-Java BOM outwith the default catalog setup"); + } else if (depth >0) { + // since 0.12.0, require this to be right next to where libraries are defined, or at root + log.warn("Deprecated use of scanJavaAnnotations declared in item; should be declared at the top level of the BOM"); + } + scanResult = scanAnnotationsFromLocalNonBundleClasspath(mgmt, catalogMetadata, containingBundle); + } else { + throw new IllegalStateException("Cannot scan for Java catalog items when libraries declared on an ancestor; scanJavaAnnotations should be specified alongside brooklyn.libraries (or ideally those libraries should specify to scan)"); + } + if (scanResult!=null && !scanResult.isEmpty()) { + if (resultLegacyFormat !=null) { + resultLegacyFormat.addAll( scanResult ); + } else { + // not returning a result; we need to add here, as type + for (CatalogItem item: scanResult) { + RegisteredType replacedInstance = mgmt.getTypeRegistry().get(item.getSymbolicName(), item.getVersion()); + mgmt.getCatalog().addItem(item); + RegisteredType newInstance = mgmt.getTypeRegistry().get(item.getSymbolicName(), item.getVersion()); + updateResultNewFormat(resultNewFormat, replacedInstance, newInstance); + } + } + } + } else { + throw new IllegalArgumentException("Scanning for Java annotations is not supported in BOMs in bundles; " + + "entries should be listed explicitly in the catalog.bom"); + } + } + private void updateResultNewFormat(Map<RegisteredType, RegisteredType> resultNewFormat, RegisteredType replacedInstance, RegisteredType newInstance) { if (resultNewFormat!=null) { @@@ -1283,26 -1298,179 +1321,179 @@@ this.itemsDefinedSoFar = itemsDefinedSoFar; } - public PlanInterpreterGuessingType reconstruct() { - if (catalogItemType==CatalogItemType.TEMPLATE) { - // template *must* be explicitly defined, and if so, none of the other calls apply - attemptType(CatalogItemType.TEMPLATE, null, true); - - } else { - // try all types; attemptTpe will ignore non-matches if catalogItemType is already specified - attemptType(CatalogItemType.ENTITY, "services", true); - attemptType(CatalogItemType.POLICY, POLICIES_KEY, false); - attemptType(CatalogItemType.ENRICHER, ENRICHERS_KEY, false); - attemptType(CatalogItemType.LOCATION, LOCATIONS_KEY, false); + public PlanInterpreterInferringType resolve() { + try { + currentlyResolvingType.set(Strings.isBlank(itemId) ? itemYaml : itemId); + + Maybe<Object> transformedResult = attemptPlanTranformer(); + boolean onlyNewStyleTransformer = format != null || catalogItemType == CatalogItemType.BEAN; + if (transformedResult.isPresent() || onlyNewStyleTransformer) { + planYaml = itemYaml; + resolved = transformedResult.isPresent() || catalogItemType == CatalogItemType.TEMPLATE; + if (!resolved) { + errors.add(Maybe.Absent.getException(transformedResult)); + } + if (resolved && catalogItemType != CatalogItemType.BEAN && catalogItemType != CatalogItemType.TEMPLATE && + (format==null || !"brooklyn-camp".equals(format))) { + // for spec types, _also_ run the legacy resolution because it is better at spotting some types of errors (recursive ones); + // note this code will also run if there was an error when format was specified (other than bean-with-type) and we couldn't determine it was a bean + resolved = false; + attemptLegacySpecTransformersForVariousSpecTypes(); + } + return this; + } + + // for now, these are the lowest-priority errors (reported after the others) + transformerErrors.add(((Maybe.Absent) transformedResult).getException()); + + if (catalogItemType == CatalogItemType.TEMPLATE) { + // template *must* be explicitly specified as item type, and if so, the "various" methods below don't apply, + // and we always mark it as resolved. (probably not necessary to do any of the transformers!) - attemptLegacySpecTransformersForType(null, CatalogItemType.TEMPLATE); ++ attemptLegacySpecTransformersForType(CatalogItemType.TEMPLATE); + if (!resolved) { + // anything goes, for an explicit template, because we can't easily recurse into the types + planYaml = itemYaml; + resolved = true; + } + return this; + } + + // couldn't resolve it with the plan transformers; retry with legacy "spec" transformers. + // TODO this legacy path is still needed where an entity is declared with nice abbreviated 'type: xxx' syntax, not the full-camp 'services: [ { type: xxx } ]' syntax. + // would be nice to move that logic internally to CAMP and see if we can remove this altogether. + // (see org.apache.brooklyn.camp.brooklyn.spi.creation.CampResolver.createEntitySpecFromServicesBlock ) + if (format == null) { + attemptLegacySpecTransformersForVariousSpecTypes(); + } + + return this; + } finally { + currentlyResolvingType.remove(); } - - if (!resolved && catalogItemType==CatalogItemType.TEMPLATE) { - // anything goes, for an explicit template, because we can't easily recurse into the types - planYaml = itemYaml; - resolved = true; + } + + private void attemptLegacySpecTransformersForVariousSpecTypes() { - attemptLegacySpecTransformersForType(null, CatalogItemType.ENTITY); ++ attemptLegacySpecTransformersForType(CatalogItemType.ENTITY); + + List<Exception> oldEntityErrors = MutableList.copyOf(entityErrors); + // try with services key - attemptLegacySpecTransformersForType("services", CatalogItemType.ENTITY); ++ attemptLegacySpecTransformersForType(CatalogItemType.ENTITY, "services", false); + entityErrors.removeAll(oldEntityErrors); + entityErrors.addAll(oldEntityErrors); + // errors when wrapped in services block are better currently + // as we parse using CAMP and need that + // so prefer those for now (may change with YOML) + - attemptLegacySpecTransformersForType(POLICIES_KEY, CatalogItemType.POLICY, true); - attemptLegacySpecTransformersForType(ENRICHERS_KEY, CatalogItemType.ENRICHER, true); - attemptLegacySpecTransformersForType(LOCATIONS_KEY, CatalogItemType.LOCATION, true); ++ attemptLegacySpecTransformersForType(CatalogItemType.POLICY, POLICIES_KEY, true); ++ attemptLegacySpecTransformersForType(CatalogItemType.ENRICHER, ENRICHERS_KEY, true); ++ attemptLegacySpecTransformersForType(CatalogItemType.LOCATION, LOCATIONS_KEY, true); + } + + boolean suspicionOfABean = false; + + private Maybe<Object> attemptPlanTranformer() { + MutableSet<Throwable> exceptions = MutableSet.<Throwable>of(); + try { + suspicionOfABean = false; + + Set<? extends OsgiBundleWithUrl> searchBundles = MutableSet.copyOf(libraryBundles) + .putIfNotNull(containingBundle); + BrooklynClassLoadingContext loader = new OsgiBrooklynClassLoadingContext(mgmt, null, searchBundles); + if (catalogItemType == null) { + // attempt to detect whether it is a bean + Object type = item.get("type"); + if (type!=null && type instanceof String) { + TypeToken<?> clz = new BrooklynTypeNameResolver((String)type, loader, false, true) + .findTypeToken((String) type).orNull(); + if (clz!=null) { + if (!BrooklynObject.class.isAssignableFrom(TypeTokens.getRawRawType(clz))) { + suspicionOfABean = true; + } + } + } + } + + if (constraint==null) { + constraint = RegisteredTypeLoadingContexts.loaderAlreadyEncountered(loader, null, itemId); + } else { + constraint = RegisteredTypeLoadingContexts.withLoader(constraint, loader); + constraint = RegisteredTypeLoadingContexts.withEncounteredItem(constraint, itemId); + } + + Object t = null; + boolean triedBean = false; + // try as bean first if signs are auspicious + if (catalogItemType == CatalogItemType.BEAN || suspicionOfABean) { + try { + triedBean = true; + t = mgmt.getTypeRegistry().createBeanFromPlan(format, itemYaml, constraint, null); + catalogItemType = CatalogItemType.BEAN; + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + exceptions.add(e); + } + } + + // then try as spec unless known to be a bean + if (catalogItemType != CatalogItemType.BEAN && t==null) { + try { + t = mgmt.getTypeRegistry().createSpecFromPlan(format, itemYaml, constraint, + BrooklynObjectType.of(catalogItemType).getSpecType()); + if (catalogItemType == null) { + catalogItemType = CatalogItemType.ofSpecClass(BrooklynObjectType.of(t.getClass()).getSpecType()); + } + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + exceptions.add(e); + } + } + + // lastly try as bean if we haven't already and it is not known to be a spec (ie if item type is unknown) + if (catalogItemType==null && t==null && !triedBean) { + try { + triedBean = true; + t = mgmt.getTypeRegistry().createBeanFromPlan(format, itemYaml, constraint, null); + if (format==null && isDubiousBeanType(t)) { + // doesn't look like a bean + // probably we want to set this - but was omitted previously; added 2022-05 + t = null; + } else { + catalogItemType = CatalogItemType.BEAN; + } + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + if (!exceptions.isEmpty() + && Exceptions.getFirstThrowableOfType(exceptions.iterator().next(), UnsupportedTypePlanException.class)!=null + && Exceptions.getFirstThrowableOfType(e, UnsupportedTypePlanException.class)==null) { + // put it first if spec is unsupported but bean is supported + MutableSet<Throwable> e2 = MutableSet.<Throwable>of(e).putAll(exceptions); + exceptions.clear(); + exceptions.addAll(e2); + } else { + exceptions.add(e); + } + } + } + + if (t!=null) { + resolved = true; + return Maybe.of(t); + } + + + } catch (Exception e) { + Exceptions.propagateIfFatal(e); + exceptions.add(e); } - - return this; + + if (exceptions.isEmpty()) exceptions.add(new IllegalStateException("Type registry creation returned null")); + + return Maybe.absent( + () -> + Exceptions.create("Unable to transform definition of "+ + (itemId!=null ? itemId : "plan:\n"+itemYaml+"\n"), + exceptions) + ); } public boolean isResolved() { return resolved; } @@@ -1321,29 -1496,31 +1519,28 @@@ public String getPlanYaml() { return planYaml; } -- - private boolean attemptType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml, boolean tryWithoutOptionalKey) { - if (resolved) { - return false; - } - if (catalogItemType!=null && catalogItemType!=candidateCiType) { - return false; - } - - private boolean attemptLegacySpecTransformersForType(String key, CatalogItemType candidateCiType) { - return attemptLegacySpecTransformersForType(key, candidateCiType, false); - } + - private boolean attemptLegacySpecTransformersForType(String key, CatalogItemType candidateCiType, boolean requireKeyAdded) { ++ private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType) { ++ return attemptLegacySpecTransformersForType(candidateCiType, null, false); ++ } ++ private boolean attemptLegacySpecTransformersForType(CatalogItemType candidateCiType, String optionalKeyForModifyingYaml, boolean tryWithoutOptionalKey) { + if (resolved) return false; + if (catalogItemType!=null && catalogItemType!=candidateCiType) return false; + - final String candidateYaml; - boolean keyAdded = false; - if (key==null) { - candidateYaml = itemYaml; - } else if (item.containsKey(key)) { - candidateYaml = itemYaml; - } else { - candidateYaml = key + ":\n" + makeAsIndentedList(itemYaml); - keyAdded = true; + String candidateYamlWithKeyAdded = null;; + if (optionalKeyForModifyingYaml!=null) { + /* often when added to a catalog we simply say "type: xxx" for the definition; + * the services: parent key at root (or brooklyn.policies, etc) needed by the camp parser + * are implicit, and added here */ + if (item.containsKey(optionalKeyForModifyingYaml)) { + optionalKeyForModifyingYaml = null; + tryWithoutOptionalKey = true; + } else { + candidateYamlWithKeyAdded = optionalKeyForModifyingYaml + ":\n" + makeAsIndentedList(itemYaml); + } } - + String type = (String) item.get("type"); - if (type!=null && requireKeyAdded && !keyAdded) { - return false; - } - if (itemsDefinedSoFar!=null) { // first look in collected items, if a key is given @@@ -1361,87 -1538,16 +1558,86 @@@ } } + if (tryWithoutOptionalKey || candidateYamlWithKeyAdded==null) { + if (attemptTypeInstantiation("normal", candidateCiType, itemYaml, false, null, type)) { + return true; + } + + // also try legacy + if (attemptTypeInstantiation("legacy", candidateCiType, itemYaml, true, null, type)) { + return true; + } - + } + + if (candidateYamlWithKeyAdded!=null) { + // try with services key (or other key) + + // this gives better errors, so put these first + // (it is only possible that this block and the above block both run if it is ENTITY type; + // so safe to assume entityErrors here) + MutableList<Exception> oldEntityErrors = MutableList.copyOf(entityErrors); + entityErrors.clear(); + + if (attemptTypeInstantiation("normal with key '"+optionalKeyForModifyingYaml+"'", candidateCiType, candidateYamlWithKeyAdded, false, optionalKeyForModifyingYaml, type)) { + return true; + } + + // try legacy + if (attemptTypeInstantiation("legacy with key '"+optionalKeyForModifyingYaml+"'", candidateCiType, candidateYamlWithKeyAdded, true, optionalKeyForModifyingYaml, type)) { + return true; + } + + entityErrors.addAll(oldEntityErrors); + } + + return false; + } + + private boolean attemptTypeInstantiation(String context, CatalogItemType candidateCiType, String candidateYaml, boolean tryAsLegacy, String optionalKeyForModifyingYaml, String typeIfOptionalKeySupplied) { + // then try parsing plan - this will use loader + // first use transformer approach try { - @SuppressWarnings("rawtypes") - CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION) - .plan(candidateYaml) - .libraries(libraryBundles) - .build(); - @SuppressWarnings("unchecked") - AbstractBrooklynObjectSpec<?, ?> spec = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true); - if (spec!=null) { + Object itemToAttemptO = null; + Object itemSpecInstantiated = null; + + if (tryAsLegacy) { + if (ATTEMPT_INSTANTIATION_WITH_LEGACY_PLAN_TO_SPEC_CONVERTERS) { + // deprecated old style + @SuppressWarnings("rawtypes") + CatalogItem itemToAttempt = createItemBuilder(candidateCiType, getIdWithRandomDefault(), DEFAULT_VERSION) + .plan(candidateYaml) + .libraries(libraryBundles) + .build(); + itemToAttemptO = itemToAttempt; + + itemSpecInstantiated = internalCreateSpecLegacy(mgmt, itemToAttempt, MutableSet.<String>of(), true); + + if (ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS) { + log.warn("Instantiation of this blueprint was only possible with legacy plan-to-spec converter, will likely not be supported in future versions:\n"+candidateYaml); + } + } + + } else { + if (ATTEMPT_INSTANTIATION_WITH_TYPE_PLAN_TRANSFORMERS) { + // preferred, new style + BasicRegisteredType itemToAttempt = createYetUnsavedRegisteredTypeInstance( + // RegisteredTypeKind + RegisteredTypeKind.SPEC, getIdWithRandomDefault(), DEFAULT_VERSION, + /* containing bundle */ null, libraryBundles, + // displayName, description, catalogIconUrl, deprecated, yaml + null, null, null, false, candidateYaml, + // tags, aliases, catalogDisabled, superTypes, format + null, null, false, MutableList.of(BrooklynObjectType.of(candidateCiType).getInterfaceType()), null + ); + itemToAttemptO = itemToAttempt; + + itemSpecInstantiated = mgmt.getTypeRegistry().create(itemToAttempt, null, null); + } + + } + + if (itemSpecInstantiated!=null) { catalogItemType = candidateCiType; planYaml = candidateYaml; resolved = true; @@@ -1851,11 -1911,15 +2037,17 @@@ // but do not allow this to run if we are expanding a nested definition as that may fail to find recursive loops // (the legacy routines this uses don't support that type of context) String yaml = RegisteredTypes.getImplementationDataStringForSpec(typeToValidate); + log.trace("Validating {}: \n{}", typeToValidate, yaml); + - PlanInterpreterGuessingType guesser = new PlanInterpreterGuessingType(typeToValidate.getSymbolicName(), Iterables.getOnlyElement( Yamls.parseAll(yaml) ), - yaml, null, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), null); - guesser.reconstruct(); + CatalogBundle bundle = typeToValidate.getContainingBundle() != null ? CatalogItemDtoAbstract.parseLibraries(Arrays.asList(typeToValidate.getContainingBundle())).iterator().next() : null; + CatalogItemType itemType = boType!=null ? CatalogItemType.ofTargetClass(boType.getInterfaceType()) : null; + if (itemType==null && typeToValidate.getKind() == RegisteredTypeKind.BEAN) { + itemType = CatalogItemType.BEAN; + } + String format = typeToValidate.getPlan().getPlanFormat(); + PlanInterpreterInferringType guesser = new PlanInterpreterInferringType(typeToValidate.getSymbolicName(), Iterables.getOnlyElement( Yamls.parseAll(yaml) ), + yaml, itemType, format, bundle, CatalogItemDtoAbstract.parseLibraries( typeToValidate.getLibraries() ), constraint, null); + guesser.resolve(); guesserErrors.addAll(guesser.getErrors()); if (guesser.isResolved()) { @@@ -1889,9 -1952,8 +2081,9 @@@ } if (changedSomething) { + log.debug("Re-resolving "+resultT+" following detection of change"); // try again with new plan or supertype info - return resolve(resultT, constraint); + return validateResolve(resultT, constraint); } else if (Objects.equal(boType, BrooklynObjectType.of(ciType))) { if (specError==null) { @@@ -1915,8 -1977,7 +2107,8 @@@ if (resultO!=null && resultT!=null) { if (resultO instanceof BrooklynObject) { // if it was a bean that points at a BO then switch it to a spec and try to re-validate + log.debug("Re-resolving "+resultT+" following detection of bean where spec was expected"); - return resolve(RegisteredTypes.copyResolved(RegisteredTypeKind.SPEC, typeToValidate), constraint); + return validateResolve(RegisteredTypes.copyResolved(RegisteredTypeKind.SPEC, typeToValidate), constraint); } Class<?> resultS; if (resultT.getKind() == RegisteredTypeKind.SPEC) {
