Repository: brooklyn-docs
Updated Branches:
  refs/heads/master 78ee70537 -> 7e8166fa1


BROOKLYN-286: docs for entity-config merging


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-docs/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-docs/commit/c422a10f
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-docs/tree/c422a10f
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-docs/diff/c422a10f

Branch: refs/heads/master
Commit: c422a10fb3867783b1b98cf9d1e59af949e6e723
Parents: 74a25d1
Author: Aled Sage <aled.s...@gmail.com>
Authored: Mon Jun 6 15:16:20 2016 +0100
Committer: Aled Sage <aled.s...@gmail.com>
Committed: Mon Jun 6 23:44:49 2016 +0100

----------------------------------------------------------------------
 guide/yaml/entity-configuration.md | 303 ++++++++++++++++++++++++++++++++
 guide/yaml/index.md                |   1 +
 2 files changed, 304 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-docs/blob/c422a10f/guide/yaml/entity-configuration.md
----------------------------------------------------------------------
diff --git a/guide/yaml/entity-configuration.md 
b/guide/yaml/entity-configuration.md
new file mode 100644
index 0000000..fcd0511
--- /dev/null
+++ b/guide/yaml/entity-configuration.md
@@ -0,0 +1,303 @@
+---
+title: Entity Configuration
+layout: website-normal
+toc: ../guide_toc.json
+categories: [use, guide, defining-applications]
+---
+
+Within a blueprint or catalog item, entities can be configured. The rules for 
setting this 
+configuration, including when composing and extending existing entities, is 
described in this 
+section. 
+
+
+### Basic Configuration
+
+Within a YAML file, entity configuration should be supplied within a 
`brooklyn.config` map. It is 
+also possible to supply configuration at the top-level of the entity. However, 
that approach is
+discouraged as it can sometimes be ambiguous (e.g. if the config key is called 
"name" or "type"), 
+and also it does not work in all contexts such as for an enricher's 
configuration.
+
+A simple example is shown below:
+
+{% highlight yaml %}
+services:
+- type: org.apache.brooklyn.entity.webapp.tomcat.TomcatServer
+  brooklyn.config:
+    webapp.enabledProtocols: http
+    http.port: 9080
+    wars.root: 
http://search.maven.org/remotecontent?filepath=org/apache/brooklyn/example/brooklyn-example-hello-world-webapp/0.9.0/brooklyn-example-hello-world-webapp-0.9.0.war
+{% endhighlight %}
+
+If no config value is supplied, the default for that config key will be used. 
For example, 
+`http.port` would default to 8080 if not explicitly supplied.
+
+Some config keys also have a short-form (e.g. `httpPort` instead of 
`http.port` would also work 
+in the YAML example above). However, that approach is discouraged as it does 
not work in all contexts
+such as for inheriting configuration from a parent entity.
+
+
+### Configuration in a Catalog Item
+
+When defining an entity in the catalog, it can include configuration values 
like any other 
+blueprint. It can also explicitly declare config keys. For details of how to 
write and add
+catalog items, see [Catalog]({{ site.path.guide }}/ops/catalog/). For more 
details of 
+declaring config keys, see the section ["Declaring New Config Keys" in Custom 
Entities](custom-entities.html).
+
+The example below illustrates the principles:
+
+{% highlight yaml %}
+brooklyn.catalog:
+  items:
+  - id: entity-config-example
+    displayName: Entity Config Example
+    item:
+      type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess
+      brooklyn.parameters:
+      - name: custom.message
+        type: string
+        default: Hello
+      brooklyn.config:
+        shell.env:
+          MESSAGE: $brooklyn:config("custom.message")
+        launch.command: |
+          echo "My example launch command: $MESSAGE"
+        checkRunning.command: |
+          echo "My example checkRunning command: $MESSAGE"
+{% endhighlight %}
+
+Once added to the catalog, it can be used with the simple blueprint below 
(substituting the location
+of your choice). Because no configuration has been overridden, this will use 
the default value
+for `custom.message`, and will use the given values for `launch.command` and 
`checkRunning.command`:
+
+{% highlight yaml %}
+location: aws-ec2:us-east-1
+services:
+- type: entity-config-example
+{% endhighlight %}
+
+
+### Inheriting Configuration from a Parent Entity
+
+Configuration passed to an entity is inherited by all child entities, unless 
explicitly overridden.
+This can simplify some blueprints, but also care should be taken to ensure 
default values are not 
+accidentally overridden.
+
+In the example below, the `wars.root` config key is inherited by all 
TomcatServer entities created
+under the cluster, so they will use that war:
+
+{% highlight yaml %}
+services:
+- type: org.apache.brooklyn.entity.group.DynamicCluster
+  brooklyn.config:
+    wars.root: 
http://search.maven.org/remotecontent?filepath=org/apache/brooklyn/example/brooklyn-example-hello-world-webapp/0.9.0/brooklyn-example-hello-world-webapp-0.9.0.war
+    memberSpec:
+      $brooklyn:entitySpec:
+        type: org.apache.brooklyn.entity.webapp.tomcat.TomcatServer
+{% endhighlight %}
+
+
+### Inheriting Configuration from Super-type
+
+When using an entity from the catalog, its configuration values can be 
overridden. For example,
+consider the `entity-config-example` added to the catalog in the section 
"Configuration in a 
+Catalog Item". We can override these values:
+
+{% highlight yaml %}
+location: aws-ec2:us-east-1
+services:
+- type: entity-config-example
+  brooklyn.config:
+    custom.message: Goodbye
+    launch.command: |
+      echo "Different example launch command: $MESSAGE"
+{% endhighlight %}
+
+If not overridden, then the existing values from the super-type will be used.
+
+
+### Configuration Precedence
+
+There are several places that a configuration value can come from. If 
different values are 
+specified in multiple places, then the order of precedence is as listed below:
+
+1. Configuration on the entity itself
+2. Inherited configuration from the super-type
+3. Inherited configuration from the parent entity (or grandparent, etc)
+4. The config key's default value
+
+
+### Merging Configuration Values
+
+For some configuration values, the most logical behaviour is to merge the 
configuration value
+with that in the super-type. This depends on the type and meaning of the 
config key, and is thus 
+an option when defining the config key.
+
+Currently it is only supported for merging config keys of type Map.
+
+Some common config keys will default to merging the values from the 
super-type. These config keys  
+include those below. The value is merged with that of its super-type (but will 
not be merged with 
+the value on a parent entity):
+
+* `shell.env`: a map of environment variables to pass to the runtime shell
+* `files.preinstall`: a mapping of files, to be copied before install, to 
destination name relative to installDir
+* `templates.preinstall`: a mapping of templates, to be filled in and copied 
before pre-install, to destination name relative to installDir 
+* `files.install`: a mapping of files, to be copied before install, to 
destination name relative to installDir 
+* `templates.install`: a mapping of templates, to be filled in and copied 
before install, to destination name relative to installDir 
+* `files.runtime`: a mapping of files, to be copied before customisation, to 
destination name relative to runDir 
+* `templates.runtime`: a mapping of templates, to be filled in and copied 
before customisation, to destination name relative to runDir 
+* `provisioning.properties`: custom properties to be passed in when 
provisioning a new machine
+
+A simple example of merging `shell.env` is shown below (building on the 
`entity-config-example` in 
+the previous section). The environment variables will include the `MESSAGE` 
set in the super-type 
+and the `MESSAGE2` set here:
+
+{% highlight yaml %}
+location: aws-ec2:us-east-1
+services:
+- type: entity-config-example
+  brooklyn.config:
+    shell.env:
+      MESSAGE2: Goodbye
+    launch.command: |
+      echo "Different example launch command: $MESSAGE and $MESSAGE2"
+{% endhighlight %}
+
+To explicitly remove a value from the super-type's map (rather than adding to 
it), a blank entry
+can be defined. 
+
+When defining a new config key, the exact semantics for inheritance can be 
defined. There are 
+separate options for `inheritance.type` and `inheritance.parent` (the former 
determines how
+config inheritance from the super-type is handles; the latter determines how 
inheritance 
+from the parent entity is handled. The possible values are:
+
+* `deep_merge`: the inherited and the given value should be merged; maps 
within the map will also be merged
+* `always`: the inherited value should be used, unless explicitly overridden 
by the entity
+* `none`: the value should not be inherited; if there is no explicit value on 
the entity then the default value will be used
+
+Below is a (contrived!) example of inheriting the `example.map` config key. 
When using this entity
+in a blueprint, the entity's config will be merged with that defined in the 
super-type, and the 
+parent entity's value will never be inherited:
+
+{% highlight yaml %}
+brooklyn.catalog:
+  items:
+  - id: entity-config-example
+    version: 1.1.0-SNAPSHOT
+    displayName: Entity Config Example
+    item:
+      type: org.apache.brooklyn.entity.machine.MachineEntity
+      brooklyn.parameters:
+      - name: example.map
+        type: java.util.Map
+        inheritance.type: deep_merge
+        inheritance.parent: none
+        default:
+          MESSAGE_IN_DEFAULT: InDefault
+      brooklyn.config:
+        example.map:
+          MESSAGE: Hello
+{% endhighlight %}
+
+The blueprints below demonstrate the various permutations for setting 
configuration for the
+config `example.map`. This can be inspected by looking at the entity's config. 
The config
+we see for app1 is the inherited `{MESSAGE: "Hello"}`; in app2 we define 
additional configuration,
+which will be merged to give `{MESSAGE: "Hello", MESSAGE_IN_CHILD: 
"InChild"}`; in app3, the 
+config from the parent is not inherited because there is an explicit 
inheritance.parent of "none",
+so it just has the value `{MESSAGE: "Hello"}`; in app4 again the parent's 
config is ignored,
+with the super-type and entity's config being merged to give  `{MESSAGE: 
"Hello", MESSAGE_IN_CHILD: "InChild"}`.
+
+{% highlight yaml %}
+location: aws-ec2:us-east-1
+services:
+- type: org.apache.brooklyn.entity.stock.BasicApplication
+  name: app1
+  brooklyn.children:
+  - type: entity-config-example
+
+- type: org.apache.brooklyn.entity.stock.BasicApplication
+  name: app2
+  brooklyn.children:
+  - type: entity-config-example
+    brooklyn.config:
+      example.map:
+        MESSAGE_IN_CHILD: InChild
+
+- type: org.apache.brooklyn.entity.stock.BasicApplication
+  name: app3
+  brooklyn.config:
+    example.map:
+      MESSAGE_IN_PARENT: InParent
+  brooklyn.children:
+  - type: entity-config-example
+
+- type: org.apache.brooklyn.entity.stock.BasicApplication
+  name: app4
+  brooklyn.config:
+    example.map:
+      MESSAGE_IN_PARENT: InParent
+  brooklyn.children:
+  - type: entity-config-example
+    brooklyn.config:
+      example.map:
+        MESSAGE_IN_CHILD: InChild
+{% endhighlight %}
+
+A limitations of `inheritance.parent` is when inheriting values from parent 
and grandparent 
+entities: a value specified on the parent will override (rather than be merged 
with) the
+value on the grandparent.
+
+
+### Entity provisioning.properties: Overriding and Merging
+
+An entity (which extends `SoftwareProcess`) can define a map of 
`provisioning.properties`. If 
+the entity then provisions a location, it passes this map of properties to the 
location for
+obtaining the machine. These properties will override and augment the 
configuration on the location
+itself.
+
+When deploying to a jclouds location, one can specify `templateOptions` (of 
type map). Rather than
+overriding, these will be merged with any templateOptions defined on the 
location.
+
+In the example below, the VM will be provisioned with minimum 2G ram and 
minimum 2 cores. It will 
+also use the merged template options value of 
+`{placementGroup: myPlacementGroup, securityGroupIds: sg-000c3a6a}`:
+
+{% highlight yaml %}
+location:
+  aws-ec2:us-east-1:
+    minRam: 2G
+    templateOptions:
+      placementGroup: myPlacementGroup
+services:
+- type: org.apache.brooklyn.entity.machine.MachineEntity
+  brooklyn.config:
+    provisioning.properties:
+      minCores: 2
+      templateOptions:
+        securityGroupIds: sg-000c3a6a
+{% endhighlight %}
+
+The merging of `templateOptions` is shallow (i.e. maps within the 
`templateOptions` are not merged). 
+In the example below, the `userMetadata` value within `templateOptions` will 
be overridden by the 
+entity's value, rather than the maps being merged; the value used when 
provisioning will be 
+`{key2: val2}`:
+
+{% highlight yaml %}
+location:
+  aws-ec2:us-east-1:
+    templateOptions:
+      userMetadata:
+        key1: val1
+services:
+- type: org.apache.brooklyn.entity.machine.MachineEntity
+  brooklyn.config:
+    provisioning.properties:
+      userMetadata:
+        key2: val2
+{% endhighlight %}
+
+
+
+### Merging Location, Policy and Enricher Configuration Values
+
+A current limitation is that `inheritance.type` is not supported for 
configuration of locations,
+policies and enrichers. The current behaviour is that config is not inherited.

http://git-wip-us.apache.org/repos/asf/brooklyn-docs/blob/c422a10f/guide/yaml/index.md
----------------------------------------------------------------------
diff --git a/guide/yaml/index.md b/guide/yaml/index.md
index 43d3b25..def24c1 100644
--- a/guide/yaml/index.md
+++ b/guide/yaml/index.md
@@ -7,6 +7,7 @@ children:
 - configuring-vms.md
 - clusters.md
 - multiple-services.md
+- entity-configuration.md
 - clusters-and-policies.md
 - blueprinting-tips.md
 - custom-entities.md

Reply via email to