#
# 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.
#
# Creates an application with the following structure, with each entity (including the application) having 
# an enricher with references to all other entities (including itself and the app) via config keys
#
#                              app
#                         (app enricher)
#                               |
#                        -------|-------
#                        |             |
#                     entity1       entity2
#                  (e1 enricher) (e2 enricher)
#                        |
#                 -------|-------
#                 |             |
#               child1        child2
#            (c1 enricher) (c2 enricher)
#                 |
#          -------|-------
#          |             |
#       gchild1       gchild2
#    (g1 enricher) (g2 enricher) 
name: test-referencing-enrichers
description: Test multi-layer application with each entity having an enricher referencing all other entities
origin: https://github.com/apache/incubator-brooklyn
id: app1
brooklyn.enrichers:
  - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
    brooklyn.config:
      test.reference.app: $brooklyn:component("app1")
      test.reference.entity1: $brooklyn:component("e1")
      test.reference.entity2: $brooklyn:component("e2")
      test.reference.child1: $brooklyn:component("c1")
      test.reference.child2: $brooklyn:component("c2")
      test.reference.grandchild1: $brooklyn:component("gc1")
      test.reference.grandchild2: $brooklyn:component("gc2")
services:
- serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
  id: e1
  name: entity 1
  brooklyn.enrichers:
  - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
    brooklyn.config:
      test.reference.app: $brooklyn:component("app1")
      test.reference.entity1: $brooklyn:component("e1")
      test.reference.entity2: $brooklyn:component("e2")
      test.reference.child1: $brooklyn:component("c1")
      test.reference.child2: $brooklyn:component("c2")
      test.reference.grandchild1: $brooklyn:component("gc1")
      test.reference.grandchild2: $brooklyn:component("gc2")
  brooklyn.children:
    - serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
      id: c1
      name: child 1
      brooklyn.enrichers:
      - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
        brooklyn.config:
          test.reference.app: $brooklyn:component("app1")
          test.reference.entity1: $brooklyn:component("e1")
          test.reference.entity2: $brooklyn:component("e2")
          test.reference.child1: $brooklyn:component("c1")
          test.reference.child2: $brooklyn:component("c2")
          test.reference.grandchild1: $brooklyn:component("gc1")
          test.reference.grandchild2: $brooklyn:component("gc2")
      brooklyn.children:
      - serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
        id: gc1
        name: grandchild 1
        brooklyn.enrichers:
        - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
          brooklyn.config:
            test.reference.app: $brooklyn:component("app1")
            test.reference.entity1: $brooklyn:component("e1")
            test.reference.entity2: $brooklyn:component("e2")
            test.reference.child1: $brooklyn:component("c1")
            test.reference.child2: $brooklyn:component("c2")
            test.reference.grandchild1: $brooklyn:component("gc1")
            test.reference.grandchild2: $brooklyn:component("gc2")
      - serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
        id: gc2
        name: grandchild 2
        brooklyn.enrichers:
        - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
          brooklyn.config:
            test.reference.app: $brooklyn:component("app1")
            test.reference.entity1: $brooklyn:component("e1")
            test.reference.entity2: $brooklyn:component("e2")
            test.reference.child1: $brooklyn:component("c1")
            test.reference.child2: $brooklyn:component("c2")
            test.reference.grandchild1: $brooklyn:component("gc1")
            test.reference.grandchild2: $brooklyn:component("gc2") 
    - serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
      id: c2
      name: child 2
      brooklyn.enrichers:
      - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
        brooklyn.config:
          test.reference.app: $brooklyn:component("app1")
          test.reference.entity1: $brooklyn:component("e1")
          test.reference.entity2: $brooklyn:component("e2")
          test.reference.child1: $brooklyn:component("c1")
          test.reference.child2: $brooklyn:component("c2")
          test.reference.grandchild1: $brooklyn:component("gc1")
          test.reference.grandchild2: $brooklyn:component("gc2")
- serviceType: org.apache.brooklyn.camp.brooklyn.ReferencingYamlTestEntity
  id: e2
  name: entity 2
  brooklyn.enrichers:
  - enricherType: org.apache.brooklyn.camp.brooklyn.TestReferencingEnricher
    brooklyn.config:
      test.reference.app: $brooklyn:component("app1")
      test.reference.entity1: $brooklyn:component("e1")
      test.reference.entity2: $brooklyn:component("e2")
      test.reference.child1: $brooklyn:component("c1")
      test.reference.child2: $brooklyn:component("c2")
      test.reference.grandchild1: $brooklyn:component("gc1")
      test.reference.grandchild2: $brooklyn:component("gc2")