Separating renderers into features. 40/15540/8
authorThomas Bachman <tbachman@yahoo.com>
Thu, 19 Feb 2015 20:39:09 +0000 (15:39 -0500)
committerThomas Bachman <tbachman@yahoo.com>
Wed, 25 Feb 2015 13:49:27 +0000 (13:49 +0000)
This patch separates the renderers into their own bundles,
and makes them their own features. This allows per-renderer
installation. This is needed in the near-term in order to
allow multi-renderer development to progress. The renderers
may be combined into a single bundle later, once we've worked
out how multiple renderers can coexist completely.

Change-Id: If15992174ef98298a75a3dc5c4d47d22f207dccb
Signed-off-by: Thomas Bachman <tbachman@yahoo.com>
133 files changed:
commons/parent/pom.xml
distribution-karaf/pom.xml
features/pom.xml
features/src/main/resources/features.xml
groupbasedpolicy/pom.xml
pom.xml
renderers/oc/pom.xml [new file with mode: 0644]
renderers/oc/src/main/java/org/opendaylight/controller/config/yang/config/oc_provider/impl/OcProviderModule.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/oc_provider/impl/OcProviderModule.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/controller/config/yang/config/oc_provider/impl/OcProviderModuleFactory.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/oc_provider/impl/OcProviderModuleFactory.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/L2DomainListener.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/L2DomainListener.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/L2DomainManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/L2DomainManager.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/OcRenderer.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/OcRenderer.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/PolicyManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/PolicyManager.java with 100% similarity]
renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/Utils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/Utils.java with 96% similarity]
renderers/oc/src/main/yang/oc-provider-impl.yang [moved from groupbasedpolicy/src/main/yang/renderer/oc/oc-provider-impl.yang with 100% similarity]
renderers/oc/src/main/yang/oc-provider.yang [moved from groupbasedpolicy/src/main/yang/renderer/oc/oc-provider.yang with 100% similarity]
renderers/oc/src/main/yang/oc.yang [moved from groupbasedpolicy/src/main/yang/renderer/oc/oc.yang with 98% similarity]
renderers/oc/src/test/java/org/opendaylight/groupbasedpolicy/renderer/oc/TestL2DomainManager.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/oc/TestL2DomainManager.java with 100% similarity]
renderers/oc/src/test/java/org/opendaylight/groupbasedpolicy/renderer/oc/TestUtilsStaticMethod.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/oc/TestUtilsStaticMethod.java with 100% similarity]
renderers/ofoverlay/pom.xml [new file with mode: 0644]
renderers/ofoverlay/src/main/java/org/opendaylight/controller/config/yang/config/ofoverlay_provider/impl/OFOverlayProviderModule.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/ofoverlay_provider/impl/OFOverlayProviderModule.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/controller/config/yang/config/ofoverlay_provider/impl/OFOverlayProviderModuleFactory.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/ofoverlay_provider/impl/OFOverlayProviderModuleFactory.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/controller/config/yang/config/openstack_endpoint_provider/impl/OpenstackEndpointProviderModule.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/openstack_endpoint_provider/impl/OpenstackEndpointProviderModule.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/controller/config/yang/config/openstack_endpoint_provider/impl/OpenstackEndpointProviderModuleFactory.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/openstack_endpoint_provider/impl/OpenstackEndpointProviderModuleFactory.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/integration/openstackgbp/OpenstackGbpEndpoint.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/integration/openstackgbp/OpenstackGbpEndpoint.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointListener.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointListener.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointManager.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/PolicyManager.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SwitchListener.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SwitchListener.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SwitchManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SwitchManager.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/ActionComparator.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/ActionComparator.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapper.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapper.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowTable.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowTable.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowUtils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowUtils.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/GroupTable.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/GroupTable.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/OfTable.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/OfTable.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcer.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcer.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PortSecurity.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PortSecurity.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/SourceMapper.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/SourceMapper.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Classifier.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/Classifier.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/EtherTypeClassifier.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/EtherTypeClassifier.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/IpProtoClassifier.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/IpProtoClassifier.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/L4Classifier.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/L4Classifier.java with 100% similarity]
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/SubjectFeatures.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/sf/SubjectFeatures.java with 100% similarity]
renderers/ofoverlay/src/main/yang/integration/openstackgbp/openstackgbp-provider-impl.yang [moved from groupbasedpolicy/src/main/yang/integration/openstackgbp/openstackgbp-provider-impl.yang with 100% similarity]
renderers/ofoverlay/src/main/yang/integration/openstackgbp/openstackgbp.yang [moved from groupbasedpolicy/src/main/yang/integration/openstackgbp/openstackgbp.yang with 100% similarity]
renderers/ofoverlay/src/main/yang/ofoverlay-provider-impl.yang [moved from groupbasedpolicy/src/main/yang/renderer/ofoverlay/ofoverlay-provider-impl.yang with 100% similarity]
renderers/ofoverlay/src/main/yang/ofoverlay-provider.yang [moved from groupbasedpolicy/src/main/yang/renderer/ofoverlay/ofoverlay-provider.yang with 100% similarity]
renderers/ofoverlay/src/main/yang/ofoverlay.yang [moved from groupbasedpolicy/src/main/yang/renderer/ofoverlay/ofoverlay.yang with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockEndpointManager.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockEndpointManager.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockPolicyManager.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockPolicyManager.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockSwitchManager.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/MockSwitchManager.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapperTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapperTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowTableTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/FlowTableTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/GroupTableTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/GroupTableTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/OfTableTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/OfTableTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcerTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcerTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PortSecurityTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PortSecurityTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/SourceMapperTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/SourceMapperTest.java with 100% similarity]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/IndexedTenantTest.java [new file with mode: 0644]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtilsTest.java [new file with mode: 0644]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/MatcherUtilsTest.java [new file with mode: 0644]
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java [new file with mode: 0644]
renderers/opflex/pom.xml [new file with mode: 0644]
renderers/opflex/src/main/java/org/opendaylight/controller/config/yang/config/opflex_provider/impl/OpflexProviderModule.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/opflex_provider/impl/OpflexProviderModule.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/controller/config/yang/config/opflex_provider/impl/OpflexProviderModuleFactory.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/controller/config/yang/config/opflex_provider/impl/OpflexProviderModuleFactory.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointListener.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointListener.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManager.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprContext.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprContext.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprOperation.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprOperation.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/Identity.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/Identity.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L2EprOperation.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L2EprOperation.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L3EprOperation.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L3EprOperation.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/MessageUtils.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/MessageUtils.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/OpflexRenderer.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/OpflexRenderer.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManager.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManager.java with 98% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexAgent.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexAgent.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexConnectionService.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexConnectionService.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexRpcServer.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexRpcServer.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/Role.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/Role.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointDeclareRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointDeclareRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointDeclareResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointDeclareResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointIdentity.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointIdentity.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointResolveRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointResolveRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointResolveResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointResolveResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUndeclareRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUndeclareRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUndeclareResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUndeclareResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUnresolveRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUnresolveRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUnresolveResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUnresolveResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUpdateRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUpdateRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUpdateResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/EndpointUpdateResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/IdentityRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/IdentityRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/IdentityResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/IdentityResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/ManagedObject.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/ManagedObject.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/OpflexError.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/OpflexError.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyIdentity.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyIdentity.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyResolveRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyResolveRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyResolveResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyResolveResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUnresolveRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUnresolveRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUnresolveResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUnresolveResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUpdateRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUpdateRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUpdateResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/PolicyUpdateResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/StateReportRequest.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/StateReportRequest.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/StateReportResponse.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/StateReportResponse.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/AgentOvsMit.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/AgentOvsMit.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/EnumInfo.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/EnumInfo.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/MitLib.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/MitLib.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/OpflexMit.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/OpflexMit.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyClassInfo.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyClassInfo.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyObjectInstance.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyObjectInstance.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyPropertyInfo.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyPropertyInfo.java with 100% similarity]
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyUri.java [moved from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyUri.java with 100% similarity]
renderers/opflex/src/main/yang/opflex-provider-impl.yang [moved from groupbasedpolicy/src/main/yang/renderer/opflex/opflex-provider-impl.yang with 100% similarity]
renderers/opflex/src/main/yang/opflex-provider.yang [moved from groupbasedpolicy/src/main/yang/renderer/opflex/opflex-provider.yang with 100% similarity]
renderers/opflex/src/main/yang/opflex.yang [moved from groupbasedpolicy/src/main/yang/renderer/opflex/opflex.yang with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManagerTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManagerTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprContextTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EprContextTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/IdentityTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/IdentityTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L2EprOperationTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L2EprOperationTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L3EprOperationTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/L3EprOperationTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/MessageUtilsTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/MessageUtilsTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManagerTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManagerTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexConnectionServiceTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexConnectionServiceTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexRpcServerTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/OpflexRpcServerTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/RoleTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/RoleTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/OpflexMessageTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/lib/messages/OpflexMessageTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/EnumInfoTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/EnumInfoTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/MitLibTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/MitLibTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyClassInfoTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyClassInfoTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyPropertyInfoTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyPropertyInfoTest.java with 100% similarity]
renderers/opflex/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyUriTest.java [moved from groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/opflex/mit/PolicyUriTest.java with 100% similarity]
renderers/pom.xml [new file with mode: 0644]

index 82f47fd27545e038fb371aa49167861726fd679a..08001eea923ddc92125ebeeff349c653858c7d32 100644 (file)
@@ -18,7 +18,9 @@
     <java.version.target>1.7</java.version.target>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <controller.distribution.version>0.2.0-SNAPSHOT</controller.distribution.version>
+    <odlparent.features-test.version>1.5.0-SNAPSHOT</odlparent.features-test.version>
     <openflowplugin.distribution.version>0.1.0-SNAPSHOT</openflowplugin.distribution.version>
+    <openflowplugin-nicira.version>0.1.0-SNAPSHOT</openflowplugin-nicira.version>
     <openflowjava.distribution.version>0.6.0-SNAPSHOT</openflowjava.distribution.version>
     <config.configfile.directory>etc/opendaylight/karaf</config.configfile.directory>
     <groupbasedpolicy.project.version>0.2.0-SNAPSHOT</groupbasedpolicy.project.version>
index 07bb3334e89386b388df613c7f46ed2504fae6a0..21301f11937e7edbe8356beff14b7f5ea8a496d0 100644 (file)
           <bootFeatures>
             <feature>standard</feature>
               <feature>standard</feature>
-              <feature>odl-groupbasedpolicy-ofoverlay</feature>
-              <feature>odl-restconf</feature>
+              <feature>odl-groupbasedpolicy-base</feature>
           </bootFeatures>
         </configuration>
         <executions>
index c7d1422229dc11ffd3fdcca685043d3795c5988e..c40eb347b0609a58e0995eec8a8df47e77500a1b 100644 (file)
       <artifactId>groupbasedpolicy</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>oc-renderer</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>opflex-renderer</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>ofoverlay-renderer</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
        <groupId>org.opendaylight.controller</groupId>
        <artifactId>features-base</artifactId>
@@ -69,7 +84,7 @@
     <dependency>
       <groupId>org.opendaylight.odlparent</groupId>
       <artifactId>features-test</artifactId>
-      <version>1.5.0-SNAPSHOT</version>
+      <version>${odlparent.features-test.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
index 5c776df3612e14934229521c0de7722612ca6bb0..43af0689da75a9d1301c4e07d7811d0fd26e0d3a 100644 (file)
 <features name="odl-groupbasedpolicy-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+
+    <!-- Repos needed by all -->
     <repository>mvn:org.opendaylight.yangtools/features-yangtools/${yangtools.version}/xml/features</repository>
     <repository>mvn:org.opendaylight.controller/features-mdsal/${mdsal.version}/xml/features</repository>
+
+    <!-- Repos needed by the OpenFlow Overlay renderer -->
     <repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin/${openflowplugin.distribution.version}/xml/features</repository>
     <repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin-extension/${openflowplugin.distribution.version}/xml/features</repository>
-    <repository>mvn:org.opendaylight.controller/features-base/1.5.0-SNAPSHOT/xml/features</repository>
-    <repository>mvn:org.opendaylight.controller/features-nsf/0.5.0-SNAPSHOT/xml/features</repository>
-    <feature name='odl-groupbasedpolicy-ofoverlay' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: OpenFlow Overlay '>
+
+    <!-- The common GBP components -->
+    <feature name='odl-groupbasedpolicy-base' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: Base Copmonents'>
         <feature version="${mdsal.version}">odl-mdsal-broker</feature>
         <feature version='${yangtools.version}'>odl-yangtools-binding</feature>
         <feature version='${yangtools.version}'>odl-yangtools-models</feature>
-        <feature version="${openflowplugin.distribution.version}">odl-openflowplugin-flow-services</feature>
-        <feature version='${openflowplugin.distribution.version}'>odl-openflowplugin-nxm-extensions</feature>
-        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy/${project.version}</bundle>
         <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version}</bundle>
         <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version}</bundle>
         <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
-        <configfile finalname="${config.configfile.directory}/${config.groupbasedpolicy.ofoverlayconfigfile}">mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-ofoverlay-config/${project.version}/xml/config</configfile>
+        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy/${project.version}</bundle>
     </feature>
 
-    <feature name='odl-groupbasedpolicy-oc' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: Opencontrail'>
-        <feature version="${mdsal.version}">odl-mdsal-broker</feature>
-        <feature>odl-base-all</feature>
-        <feature>odl-nsf-all</feature>
-        <feature version='${yangtools.version}'>odl-yangtools-binding</feature>
-        <feature version='${yangtools.version}'>odl-yangtools-models</feature>
-        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy/${project.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
-        <configfile finalname="${config.configfile.directory}/${config.groupbasedpolicy.occonfigfile}">mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-oc-config/${project.version}/xml/config
-       </configfile>
+    <!--
+        The OpenFlow Overlay renderer.
+
+        This can be added to the base to enable a
+        Network Virtualization behavior using OpenFlow
+    -->
+    <feature name='odl-groupbasedpolicy-ofoverlay' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: OpenFlow Overlay Renderer'>
+        <!--
+        <feature version="${project.version}">odl-groupbasedpolicy-base</feature>
+        -->
+        <feature version="${openflowplugin.distribution.version}">odl-openflowplugin-flow-services</feature>
+        <feature version='${openflowplugin.distribution.version}'>odl-openflowplugin-nxm-extensions</feature>
+        <bundle>mvn:org.opendaylight.groupbasedpolicy/ofoverlay-renderer/${project.version}</bundle>
+        <configfile finalname="${config.configfile.directory}/${config.groupbasedpolicy.ofoverlayconfigfile}">mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-ofoverlay-config/${project.version}/xml/config</configfile>
     </feature>
 
+    <!--
+         The OpenStack Group Based Policy Northbound API.
+
+         This is actually built/packaged with the OpenFlow
+         Overlay renderer at the moment. All that's needed
+         for this package is just the config file that wires
+         things in.
+    -->
     <feature name='odl-groupbasedpolicy-openstackgbp' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: Support OpenStack GBP Endpoints '>
+        <!--
         <feature version="${project.version}">odl-groupbasedpolicy-ofoverlay</feature>
+        -->
         <feature version="${mdsal.version}">odl-mdsal-broker</feature>
-        <bundle>mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy/${project.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version}</bundle>
-        <bundle start="true">mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
         <configfile finalname="${config.configfile.directory}/${config.groupbasedpolicy.openstackendpointconfigfile}">mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-openstackendpoint-config/${project.version}/xml/config</configfile>
     </feature>
+
+    <!--
+         The OpenContrail renderer
+    -->
+    <feature name='odl-groupbasedpolicy-oc' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: Opencontrail'>
+        <feature version="${mdsal.version}">odl-mdsal-broker</feature>
+        <bundle>mvn:org.opendaylight.groupbasedpolicy/oc-renderer/${project.version}</bundle>
+        <configfile finalname="${config.configfile.directory}/${config.groupbasedpolicy.occonfigfile}">mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-oc-config/${project.version}/xml/config
+       </configfile>
+    </feature>
 </features>
 
index 179ead266ec02fe51b4136ac0aa6f4a58084c637..5b54cda6266f322c37d2ba6270d74c77e421d007 100644 (file)
   <packaging>bundle</packaging>
 
   <properties>
-    <openflowplugin-nicira.version>0.1.0-SNAPSHOT</openflowplugin-nicira.version>
   </properties>
 
   <dependencies>
-   <dependency>
-    <groupId>net.juniper.contrail</groupId>
-    <artifactId>juniper-contrail-api</artifactId>
-    <version>1.2</version>
-    </dependency>
-    <dependency>
-     <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-       <version>4.3.2</version>
-      </dependency>
-      <dependency>
-     <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <version>4.3.2</version>
-     </dependency>
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-common</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.openflowplugin</groupId>
-      <artifactId>openflowplugin-extension-nicira</artifactId>
-      <version>${openflowplugin-nicira.version}</version>
-    </dependency>
     <dependency>
       <groupId>org.osgi</groupId>
       <artifactId>org.osgi.core</artifactId>
       <version>1.9.5</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
-      <version>1.5.6</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito</artifactId>
-      <version>1.5.6</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.sfc</groupId>
-      <artifactId>sfc-model</artifactId>
-      <version>${sfc.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.sfc</groupId>
-      <artifactId>sfc-provider</artifactId>
-      <version>${sfc.version}</version>
-    </dependency>
   </dependencies>
 
   <!-- project build -->
              org.opendaylight.controller.config.yang.config.endpoint_provider,
              org.opendaylight.groupbasedpolicy.endpoint,
              org.opendaylight.groupbasedpolicy.resolver,
-             net.juniper.contrail.api.*;version="1.2"
+             org.opendaylight.groupbasedpolicy.util,
            </Export-Package>
           </instructions>
           <manifestLocation>${project.basedir}/META-INF</manifestLocation>
diff --git a/pom.xml b/pom.xml
index e38882dd85db0bcf4e2c604cd4bb1432409ab295..0b4d7ade2711f3c81f85871fe0115f1cc4f6f0aa 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -19,6 +19,7 @@
   <modules>
     <module>commons/parent</module>
     <module>groupbasedpolicy</module>
+    <module>renderers</module>
     <module>groupbasedpolicy-ofoverlay-config</module>
     <module>groupbasedpolicy-oc-config</module>
     <module>groupbasedpolicy-openstackendpoint-config</module>
diff --git a/renderers/oc/pom.xml b/renderers/oc/pom.xml
new file mode 100644 (file)
index 0000000..127d640
--- /dev/null
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy-renderers</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <relativePath>../</relativePath>
+  </parent>
+
+  <artifactId>oc-renderer</artifactId>
+  <packaging>bundle</packaging>
+  <repositories>
+    <repository>
+      <id>juniper-contrail</id>
+      <url>https://github.com/Juniper/contrail-maven/raw/master/releases</url>
+     </repository>
+  </repositories>
+
+  <properties>
+    <juniper.opencontrail.version>1.2</juniper.opencontrail.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>net.juniper.contrail</groupId>
+      <artifactId>juniper-contrail-api</artifactId>
+      <version>${juniper.opencontrail.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.3.2</version>
+    </dependency>
+    <dependency>
+     <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.3.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <version>1.5.6</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <version>1.5.6</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <!-- project build -->
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>
+             org.apache.http.*;version="4.3.2",
+            *;resolution:=optional
+            </Import-Package>
+            <Embed-Dependency>httpclient,httpcore,commons-lang,commons-exec;type=!pom;inline=false</Embed-Dependency>
+            <Export-Package>
+             net.juniper.contrail.api.*;version="1.2"
+           </Export-Package>
+          </instructions>
+          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <phase>generate-sources</phase>
+            <configuration>
+              <sources>
+                <source>target/generated-sources/sal</source>
+                <source>target/generated-sources/config</source>
+                <source>target/generated-resources/</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-jmx-generator-plugin</artifactId>
+            <version>0.3.0-SNAPSHOT</version>
+          </dependency>
+          <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>${yangtools.version}</version>
+            <type>jar</type>
+          </dependency>
+        </dependencies>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate-sources</goal>
+            </goals>
+            <configuration>
+              <codeGenerators>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                  <additionalConfiguration>
+                    <namespaceToPackage1>urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang</namespaceToPackage1>
+                  </additionalConfiguration>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/sal</outputBaseDir>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/site/models</outputBaseDir>
+                </generator>
+              </codeGenerators>
+              <inspectDependencies>true</inspectDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <redirectTestOutputToFile>true</redirectTestOutputToFile>
+        </configuration>
+      </plugin>
+      <plugin>
+       <groupId>org.jacoco</groupId>
+       <artifactId>jacoco-maven-plugin</artifactId>
+       <executions>
+          <execution>
+            <id>pre-unit-test</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>post-unit-test</id>
+            <phase>test</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+            <configuration>
+              <dataFile>${sonar.jacoco.reportPath}</dataFile>
+             <includes>
+               <include>org/opendaylight/groupbasedpolicy/**/*.class</include>
+             </includes>
+            </configuration>
+          </execution>
+       </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
+
similarity index 96%
rename from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/Utils.java
rename to renderers/oc/src/main/java/org/opendaylight/groupbasedpolicy/renderer/oc/Utils.java
index 74da664b800ecb003e3ec1762ad4c5b0fde185f8..76b8f6d8f811156d8c2a24dffb5970ba85953032 100644 (file)
@@ -1,80 +1,80 @@
-/*\r
- * Copyright (c) 2015 Juniper Networks, Inc.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.renderer.oc;\r
-\r
-import java.util.regex.Pattern;\r
-\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-public class Utils {\r
-\r
-    static final Logger LOGGER = LoggerFactory.getLogger(Utils.class);\r
-\r
-    /**\r
-     * Invoked to format the UUID if UUID is not in correct format.\r
-     *\r
-     * @param String\r
-     *            An instance of UUID string.\r
-     *\r
-     * @return Correctly formated UUID string.\r
-     */\r
-    public static String uuidFormater(String uuid) {\r
-        String uuidPattern = null;\r
-        String id1 = uuid.substring(0, 8);\r
-        String id2 = uuid.substring(8, 12);\r
-        String id3 = uuid.substring(12, 16);\r
-        String id4 = uuid.substring(16, 20);\r
-        String id5 = uuid.substring(20, 32);\r
-        uuidPattern = (id1 + "-" + id2 + "-" + id3 + "-" + id4 + "-" + id5);\r
-        return uuidPattern;\r
-    }\r
-\r
-    /**\r
-     * Invoked to check the UUID if UUID is not a valid hexa-decimal number.\r
-     *\r
-     * @param String\r
-     *            An instance of UUID string.\r
-     *\r
-     * @return boolean value.\r
-     */\r
-    public static boolean isValidHexNumber(String uuid) {\r
-        try {\r
-            Pattern hex = Pattern.compile("^[0-9a-f]+$");\r
-            uuid = uuid.replaceAll("-", "");\r
-            boolean valid = hex.matcher(uuid).matches();\r
-            if (uuid.length() != 32) {\r
-                return false;\r
-            }\r
-            if (valid) {\r
-                return true;\r
-            } else {\r
-                return false;\r
-            }\r
-        } catch (NumberFormatException ex) {\r
-            LOGGER.error("Exception :  " + ex);\r
-            return false;\r
-        }\r
-    }\r
-\r
-    /**\r
-     * Invoked to format the UUID/Name in correct format.\r
-     *\r
-     * @param String\r
-     *            An instance of UUID/Name string.\r
-     *\r
-     * @return Correctly formated UUID/name string.\r
-     */\r
-\r
-    public static String uuidNameFormat(String value){\r
-       String[] pattern = value.split("=");\r
-       value = pattern[1].replace("]", "");\r
-       return value;\r
-    }\r
+/*
+ * Copyright (c) 2015 Juniper Networks, Inc.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.oc;
+
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Utils {
+
+    static final Logger LOGGER = LoggerFactory.getLogger(Utils.class);
+
+    /**
+     * Invoked to format the UUID if UUID is not in correct format.
+     *
+     * @param String
+     *            An instance of UUID string.
+     *
+     * @return Correctly formated UUID string.
+     */
+    public static String uuidFormater(String uuid) {
+        String uuidPattern = null;
+        String id1 = uuid.substring(0, 8);
+        String id2 = uuid.substring(8, 12);
+        String id3 = uuid.substring(12, 16);
+        String id4 = uuid.substring(16, 20);
+        String id5 = uuid.substring(20, 32);
+        uuidPattern = (id1 + "-" + id2 + "-" + id3 + "-" + id4 + "-" + id5);
+        return uuidPattern;
+    }
+
+    /**
+     * Invoked to check the UUID if UUID is not a valid hexa-decimal number.
+     *
+     * @param String
+     *            An instance of UUID string.
+     *
+     * @return boolean value.
+     */
+    public static boolean isValidHexNumber(String uuid) {
+        try {
+            Pattern hex = Pattern.compile("^[0-9a-f]+$");
+            uuid = uuid.replaceAll("-", "");
+            boolean valid = hex.matcher(uuid).matches();
+            if (uuid.length() != 32) {
+                return false;
+            }
+            if (valid) {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (NumberFormatException ex) {
+            LOGGER.error("Exception :  " + ex);
+            return false;
+        }
+    }
+
+    /**
+     * Invoked to format the UUID/Name in correct format.
+     *
+     * @param String
+     *            An instance of UUID/Name string.
+     *
+     * @return Correctly formated UUID/name string.
+     */
+
+    public static String uuidNameFormat(String value){
+       String[] pattern = value.split("=");
+       value = pattern[1].replace("]", "");
+       return value;
+    }
 }
\ No newline at end of file
similarity index 98%
rename from groupbasedpolicy/src/main/yang/renderer/oc/oc.yang
rename to renderers/oc/src/main/yang/oc.yang
index 43a9cd3ef76a2afc7a24ebd5f5b9a67e547a2821..cb04e4a3afc78c9903e2dc8fdfb165eb3635d2f6 100644 (file)
@@ -16,7 +16,6 @@ module oc {
 
     import yang-ext {prefix ext; revision-date "2013-07-09";}
 
-    import gbp-common {prefix gbp-common;}
     import endpoint {prefix endpoint;}
 
     description
@@ -84,4 +83,4 @@ module oc {
         ext:augment-identifier "oc-context-input";
         uses endpoint-location;
     }
-}
\ No newline at end of file
+}
diff --git a/renderers/ofoverlay/pom.xml b/renderers/ofoverlay/pom.xml
new file mode 100644 (file)
index 0000000..9ebfcf4
--- /dev/null
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy-renderers</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <relativePath>../</relativePath>
+  </parent>
+
+  <artifactId>ofoverlay-renderer</artifactId>
+  <packaging>bundle</packaging>
+
+  <properties>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin</groupId>
+      <artifactId>openflowplugin-extension-nicira</artifactId>
+      <version>${openflowplugin-nicira.version}</version>
+    </dependency>
+  </dependencies>
+
+  <!-- project build -->
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.7</version>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <!-- here the phase you need -->
+            <phase>validate</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+             <outputDirectory>src/test/java/org/opendaylight/groupbasedpolicy/resolver</outputDirectory>
+              <resources>
+                <resource>
+                 <directory>../../groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver</directory>
+                  <filtering>true</filtering>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>
+             org.apache.http.*;version="4.3.2",
+            *;resolution:=optional
+            </Import-Package>
+            <Embed-Dependency>httpclient,httpcore,commons-lang,commons-exec;type=!pom;inline=false</Embed-Dependency>
+            <Export-Package>
+           </Export-Package>
+          </instructions>
+          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <phase>generate-sources</phase>
+            <configuration>
+              <sources>
+                <source>target/generated-sources/sal</source>
+                <source>target/generated-sources/config</source>
+                <source>target/generated-resources/</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-jmx-generator-plugin</artifactId>
+            <version>0.3.0-SNAPSHOT</version>
+          </dependency>
+          <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>${yangtools.version}</version>
+            <type>jar</type>
+          </dependency>
+        </dependencies>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate-sources</goal>
+            </goals>
+            <configuration>
+              <codeGenerators>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                  <additionalConfiguration>
+                    <namespaceToPackage1>urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang</namespaceToPackage1>
+                  </additionalConfiguration>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/sal</outputBaseDir>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/site/models</outputBaseDir>
+                </generator>
+              </codeGenerators>
+              <inspectDependencies>true</inspectDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <redirectTestOutputToFile>true</redirectTestOutputToFile>
+        </configuration>
+      </plugin>
+      <plugin>
+       <groupId>org.jacoco</groupId>
+       <artifactId>jacoco-maven-plugin</artifactId>
+       <executions>
+          <execution>
+            <id>pre-unit-test</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>post-unit-test</id>
+            <phase>test</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+            <configuration>
+              <dataFile>${sonar.jacoco.reportPath}</dataFile>
+             <includes>
+               <include>org/opendaylight/groupbasedpolicy/**/*.class</include>
+             </includes>
+            </configuration>
+          </execution>
+       </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
+
diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/IndexedTenantTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/IndexedTenantTest.java
new file mode 100644 (file)
index 0000000..1ffc6f9
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.Collection;
+
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2BridgeDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2BridgeDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2FloodDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L2FloodDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L3Context;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.L3ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Subnet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubnetBuilder;
+
+import com.google.common.collect.ImmutableList;
+
+import static org.junit.Assert.*;
+
+public class IndexedTenantTest {
+
+    @Test
+    public void testResolveND() throws Exception {
+        SubnetId sid = new SubnetId("dd25397d-d829-4c8d-8c01-31f129b8de8f");
+        SubnetId sid2 = new SubnetId("c752ba40-40aa-4a47-8138-9b7175b854fa");
+        L3ContextId l3id = new L3ContextId("f2311f52-890f-4095-8b85-485ec8b92b3c");
+        L2BridgeDomainId bdid= new L2BridgeDomainId("70aeb9ea-4ca1-4fb9-9780-22b04b84a0d6");
+        L2FloodDomainId fdid = new L2FloodDomainId("252fbac6-bb6e-4d16-808d-6f56d20e5cca");
+
+        L3Context l3c = new L3ContextBuilder().setId(l3id).build();
+        L2BridgeDomain bd = new L2BridgeDomainBuilder()
+            .setParent(l3id)
+            .setId(bdid).build();
+        L2FloodDomain fd = new L2FloodDomainBuilder()
+            .setParent(bdid)
+            .setId(fdid).build();
+        Subnet s = new SubnetBuilder()
+            .setParent(fdid)
+            .setId(sid).build();
+        Subnet s2 = new SubnetBuilder()
+            .setParent(bdid)
+            .setId(sid2).build();
+        Tenant t = new TenantBuilder()
+            .setSubnet(ImmutableList.of(s, s2))
+            .setL2BridgeDomain(ImmutableList.of(bd))
+            .setL3Context(ImmutableList.of(l3c))
+            .setL2FloodDomain(ImmutableList.of(fd))
+            .build();
+        IndexedTenant it = new IndexedTenant(t);
+
+        assertNotNull(it.getNetworkDomain(sid));
+        Collection<Subnet> sns = it.resolveSubnets(sid);
+        assertTrue(sns.contains(s));
+        assertTrue(sns.contains(s2));
+        assertEquals(l3id, it.resolveL3Context(sid).getId());
+        assertEquals(bdid, it.resolveL2BridgeDomain(sid).getId());
+        assertEquals(fdid, it.resolveL2FloodDomain(sid).getId());
+    }
+}
diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtilsTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtilsTest.java
new file mode 100644 (file)
index 0000000..7f5e577
--- /dev/null
@@ -0,0 +1,1103 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.HashSet;
+import java.util.List;
+
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TargetName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.CapabilityBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Label.InclusionRule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.QualityBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.RequirementBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.Capability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.CapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.Quality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.QualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.Requirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.RequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQuality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Clause;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.SubjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.TargetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ConsumerMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelectorBuilder;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+import static org.junit.Assert.*;
+
+public class InheritanceUtilsTest {
+    // ******
+    // Labels
+    // ******
+    
+    Quality q1 = new QualityBuilder()
+        .setName(new QualityName("q1"))
+        .build();
+    Quality q1Include = new QualityBuilder(q1)
+        .setInclusionRule(InclusionRule.Include)
+        .build();
+    Quality q1Exclude = new QualityBuilder(q1)
+        .setInclusionRule(InclusionRule.Exclude)
+        .build();
+    Quality q2 = new QualityBuilder()
+        .setName(new QualityName("q2"))
+        .build();
+    Quality q2Exclude = new QualityBuilder()
+        .setName(new QualityName("q2"))
+        .setInclusionRule(InclusionRule.Exclude)
+        .build();
+    Quality q3 = new QualityBuilder()
+        .setName(new QualityName("q3"))
+        .build();
+
+    Requirement r1 = new RequirementBuilder()
+        .setName(new RequirementName("r1"))
+        .build();
+    Requirement r2 = new RequirementBuilder()
+        .setName(new RequirementName("r2"))
+        .build();
+    Requirement r1exclude = new RequirementBuilder()
+        .setName(new RequirementName("r1"))
+        .setInclusionRule(InclusionRule.Exclude)
+        .build();
+    Requirement r3 = new RequirementBuilder()
+        .setName(new RequirementName("r3"))
+        .build();
+
+    Capability c1 = new CapabilityBuilder()
+        .setName(new CapabilityName("c1"))
+        .build();
+    Capability c2 = new CapabilityBuilder()
+        .setName(new CapabilityName("c2"))
+        .build();
+    Capability c1exclude = new CapabilityBuilder()
+        .setName(new CapabilityName("c1"))
+        .setInclusionRule(InclusionRule.Exclude)
+        .build();
+    Capability c3 = new CapabilityBuilder()
+        .setName(new CapabilityName("c3"))
+        .build();
+    
+    Condition cond1 = new ConditionBuilder()
+        .setName(new ConditionName("cond1"))
+        .build();
+    Condition cond2 = new ConditionBuilder()
+        .setName(new ConditionName("cond2"))
+        .build();
+    Condition cond2exlude = new ConditionBuilder()
+        .setName(new ConditionName("cond2"))
+        .setInclusionRule(InclusionRule.Exclude)
+        .build();
+
+    // *********
+    // Contracts
+    // *********
+
+    TargetName q2TargetName = new TargetName("q2");
+    Target q2Target = new TargetBuilder()
+        .setName(q2TargetName)
+        .setQuality(ImmutableList.of(q2))
+        .build();
+    
+    TargetName q1ExcludeTargetName = new TargetName("q1_exclude");
+    Target q1ExcludeTarget = new TargetBuilder()
+        .setName(q1ExcludeTargetName)
+        .setQuality(ImmutableList.of(q1Exclude, q2))
+        .build();
+    
+    TargetName q1IncludeTargetName = new TargetName("q1_include");
+    Target q1IncludeTarget = new TargetBuilder()
+        .setName(q1IncludeTargetName)
+        .setQuality(ImmutableList.of(q1Include))
+        .build();
+
+    Target q2PlusTarget = new TargetBuilder()
+        .setName(q2TargetName)
+        .setQuality(ImmutableList.of(q3))
+        .build();
+
+    SubjectName subject1 = new SubjectName("subject1");
+    SubjectName subject2 = new SubjectName("subject2");
+    
+    RequirementMatcher rm_r1 = new RequirementMatcherBuilder()
+        .setName(new RequirementMatcherName("rm_r1"))
+        .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r1)
+                                                    .build()))
+        .build();
+    RequirementMatcher rm_r1_plus = new RequirementMatcherBuilder()
+        .setName(new RequirementMatcherName("rm_r1"))
+        .setMatchType(MatchType.All)
+        .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r2)
+                                                    .build()))
+        .build();
+
+    CapabilityMatcher capm_c1 = new CapabilityMatcherBuilder()
+        .setName(new CapabilityMatcherName("capm_c1"))
+        .setMatcherCapability(ImmutableList.of(new MatcherCapabilityBuilder(c1)
+                                                .build()))
+        .build();
+
+    ConditionMatcher cm_c1 = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("cm_c1"))
+        .setCondition(ImmutableList.of(cond1))
+        .build();
+    ConditionMatcher cm_c2 = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("cm_c2"))
+        .setMatchType(MatchType.All)
+        .setCondition(ImmutableList.of(cond2))
+        .build();
+    ConditionMatcher cm_c2_plus = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("cm_c2"))
+        .setCondition(ImmutableList.of(cond2exlude))
+        .build();
+    
+    ClauseName clauseName1 = new ClauseName("clauseName1");
+    Clause clause1 = new ClauseBuilder()
+        .setName(clauseName1)
+        .setSubjectRefs(ImmutableList.of(subject1))
+        .setProviderMatchers(new ProviderMatchersBuilder()
+            .setCapabilityMatcher(ImmutableList.of(capm_c1))
+            .setConditionMatcher(ImmutableList.of(cm_c1))
+            .build())
+        .setConsumerMatchers(new ConsumerMatchersBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm_r1))
+            .setConditionMatcher(ImmutableList.of(cm_c2))
+            .build())
+        .build();
+
+    Clause clause1plus = new ClauseBuilder()
+        .setName(clauseName1)
+        .setSubjectRefs(ImmutableList.of(subject2))
+        .setConsumerMatchers(new ConsumerMatchersBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm_r1_plus))
+            .setConditionMatcher(ImmutableList.of(cm_c2_plus))
+            .build())
+        .build();
+
+    ActionRef a1 = new ActionRefBuilder()
+        .setName(new ActionName("a1"))
+        .build();
+    ClassifierRef cr1 = new ClassifierRefBuilder()
+        .setName(new ClassifierName("cr1"))
+        .build();
+    Rule rule1 = new RuleBuilder()
+        .setName(new RuleName("r1"))
+        .setActionRef(ImmutableList.of(a1))
+        .setClassifierRef(ImmutableList.of(cr1))
+        .build();
+    Rule rule2 = new RuleBuilder()
+        .setName(new RuleName("r2"))
+        .setOrder(5)
+        .build();
+    Rule rule3 = new RuleBuilder()
+        .setName(new RuleName("r3"))
+        .setOrder(7)
+        .build();
+    Rule rule4 = new RuleBuilder()
+        .setName(new RuleName("r4"))
+        .setOrder(1)
+        .build();
+
+    Subject s1 = new SubjectBuilder()
+        .setName(new SubjectName("s1"))
+        .setRule(ImmutableList.of(rule1, rule2))
+        .build();
+    Subject s1_plus = new SubjectBuilder()
+        .setName(s1.getName())
+        .setRule(ImmutableList.of(rule3, rule4))
+        .setOrder(4)
+        .build();
+    Subject s2 = new SubjectBuilder()
+        .setName(new SubjectName("s2"))
+        .setOrder(5)
+        .build();
+
+    ContractId contractId1 = 
+            new ContractId("e7e6804f-7fcb-46cf-9bc6-abfec0896d95");
+    Contract contract1 = new ContractBuilder()
+        .setId(contractId1)
+        .setQuality(ImmutableList.of(q1))
+        .setTarget(ImmutableList.of(q2Target, 
+                                    q1IncludeTarget, 
+                                    q1ExcludeTarget))
+        .setClause(ImmutableList.of(clause1))
+        .setSubject(ImmutableList.of(s1))
+        .build();
+
+    ContractId contractId2 = 
+            new ContractId("3f56ae44-d1e4-4617-95af-c809dfc50149");
+    Contract contract2 = new ContractBuilder()
+        .setId(contractId2)
+        .setParent(contractId1)
+        .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
+        .setClause(ImmutableList.of(clause1plus))
+        .setSubject(ImmutableList.of(s1_plus, s2))
+        .build();
+
+    ContractId cloop2Id = new ContractId("89700928-7316-4216-a853-a7ea3934b8f4");
+    Contract cloop1 = new ContractBuilder()
+        .setId(new ContractId("56bbce36-e60b-473d-92de-bb63b5a6dbb5"))
+        .setParent(cloop2Id)
+        .setClause(ImmutableList.of(clause1))
+        .setSubject(ImmutableList.of(s1, s2))
+        .build();
+    Contract cloop2 = new ContractBuilder()
+        .setId(cloop2Id)
+        .setParent(cloop1.getId())
+        .build();
+    ContractId cselfloopid = 
+            new ContractId("63edead2-d6f1-4acf-9f78-831595d194ee");
+    Contract cselfloop = new ContractBuilder()
+        .setId(cselfloopid)
+        .setParent(cselfloopid)
+        .build();
+    Contract corphan = new ContractBuilder()
+        .setId(new ContractId("f72c15f3-76ab-4c7e-a817-eb5f6efcb654"))
+        .setParent(new ContractId("eca4d0d5-8c62-4f46-ad42-71c1f4d3da12"))
+        .build();
+    
+    // ***************
+    // Endpoint Groups
+    // ***************
+    
+    SelectorName cnsName1 = new SelectorName("cns1");
+    ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder()
+        .setName(cnsName1)
+        .setContract(ImmutableList.of(contractId1))
+        .setRequirement(ImmutableList.of(r2))
+        .build();
+
+    ConsumerNamedSelector cns1_plus = new ConsumerNamedSelectorBuilder()
+        .setName(cnsName1)
+        .setContract(ImmutableList.of(contractId2))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+    
+    ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder()
+        .setName(cnsName1)
+        .setContract(ImmutableList.of(contractId1))
+        .setCapability(ImmutableList.of(c2))
+        .build();
+
+    ProviderNamedSelector pns1_plus = new ProviderNamedSelectorBuilder()
+        .setName(cnsName1)
+        .setContract(ImmutableList.of(contractId2))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+    
+    QualityMatcher qm_q1_all = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q1_all"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1)
+                                                .build()))
+        .setMatchType(MatchType.All)
+        .build();
+    QualityMatcher qm_q1_any = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q1_any"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1)
+                                            .build()))
+        .setMatchType(MatchType.Any)
+        .build();
+    QualityMatcher qm_q2q3_any = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q2q3_any"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q2)
+                                                .build(),
+                                              new MatcherQualityBuilder(q3)
+                                                .build()))
+        .setMatchType(MatchType.Any)
+        .build();
+
+    QualityMatcher qm_q2tq2 = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q2tq2"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q2)
+                                                .setTargetNamespace(q2TargetName)
+                                                .build()))
+        .setMatchType(MatchType.Any)
+        .build();
+    QualityMatcher qm_q2q3_plus = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q2q3_any"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q3)
+                                                .setTargetNamespace(q2TargetName)
+                                                .build(),
+                                              new MatcherQualityBuilder(q2Exclude)
+                                                .build()))
+        .setMatchType(MatchType.All)
+        .build();
+    QualityMatcher qm_q1_plus = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm_q1_any"))
+        .build();
+    
+    SelectorName ctsName1 = new SelectorName("cts1");
+    ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder()
+        .setName(ctsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
+        .setRequirement(ImmutableList.of(r2))
+        .build();
+    SelectorName ctsName2 = new SelectorName("cts2");
+    ConsumerTargetSelector cts2 = new ConsumerTargetSelectorBuilder()
+        .setName(ctsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
+        .setRequirement(ImmutableList.of(r1exclude, r3))
+        .build();
+    ConsumerTargetSelector cts1_plus = new ConsumerTargetSelectorBuilder()
+        .setName(ctsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_plus,
+                                              qm_q2q3_any, 
+                                              qm_q1_plus))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+    ConsumerTargetSelector cts2_plus = new ConsumerTargetSelectorBuilder()
+        .setName(ctsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2tq2, 
+                                              qm_q2q3_plus))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+    
+    SelectorName ptsName1 = new SelectorName("pts1");
+    ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder()
+        .setName(ptsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
+        .setCapability(ImmutableList.of(c2))
+        .build();
+    SelectorName ptsName2 = new SelectorName("pts2");
+    ProviderTargetSelector pts2 = new ProviderTargetSelectorBuilder()
+        .setName(ptsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
+        .setCapability(ImmutableList.of(c1exclude, c3))
+        .build();
+    ProviderTargetSelector pts1_plus = new ProviderTargetSelectorBuilder()
+        .setName(ptsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_plus,
+                                              qm_q2q3_any, 
+                                              qm_q1_plus))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+    ProviderTargetSelector pts2_plus = new ProviderTargetSelectorBuilder()
+        .setName(ptsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2tq2, 
+                                              qm_q2q3_plus))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+    
+    EndpointGroupId egId1 = 
+            new EndpointGroupId("c0e5edfb-02d2-412b-8757-a77b3daeb5d4");
+    EndpointGroup eg1 = new EndpointGroupBuilder()
+        .setId(egId1)
+        .setRequirement(ImmutableList.of(r1))
+        .setCapability(ImmutableList.of(c1))
+        .setConsumerTargetSelector(ImmutableList.of(cts1, cts2))
+        .setConsumerNamedSelector(ImmutableList.of(cns1))
+        .setProviderTargetSelector(ImmutableList.of(pts1, pts2))
+        .setProviderNamedSelector(ImmutableList.of(pns1))
+        .build();
+    EndpointGroupId egId2 = 
+            new EndpointGroupId("60483327-ad76-43dd-b3bf-54ffb73ef4b8"); 
+    EndpointGroup eg2 = new EndpointGroupBuilder()
+        .setId(egId2)
+        .setParent(egId1)
+        .setConsumerTargetSelector(ImmutableList.of(cts1_plus, cts2_plus))
+        .setConsumerNamedSelector(ImmutableList.of(cns1_plus))
+        .setProviderTargetSelector(ImmutableList.of(pts1_plus, pts2_plus))
+        .setProviderNamedSelector(ImmutableList.of(pns1_plus))
+        .build();
+
+    EndpointGroupId egloop2Id = 
+            new EndpointGroupId("cb5be574-9836-4053-8ec4-4b4a43331d65");
+    EndpointGroup egloop1 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("a33fdd4d-f58b-4741-a69f-08aecab9af2e"))
+        .setParent(egloop2Id)
+        .setConsumerNamedSelector(ImmutableList.of(cns1))
+        .setProviderNamedSelector(ImmutableList.of(pns1))
+        .setConsumerTargetSelector(ImmutableList.of(cts1))
+        .setProviderTargetSelector(ImmutableList.of(pts1))
+        .build();
+    EndpointGroup egloop2 = new EndpointGroupBuilder()
+        .setId(egloop2Id)
+        .setParent(egloop1.getId())
+        .build();
+    EndpointGroupId egselfloopid = 
+            new EndpointGroupId("996ad104-f852-4d77-96cf-cddde5cebb84");
+    EndpointGroup egselfloop = new EndpointGroupBuilder()
+        .setId(egselfloopid)
+        .setParent(egselfloopid)
+        .build();
+    EndpointGroup egorphan = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("feafeac9-ce1a-4b19-8455-8fcc9a4ff013"))
+        .setParent(new EndpointGroupId("aa9dfcf1-610c-42f9-8c3a-f67b43196821"))
+        .build();
+    
+    // *******
+    // Tenants
+    // *******
+    
+    TenantId tenantId1 = new TenantId("0ac5d219-979c-4cca-8f90-83b69bc414ad");
+    Tenant tenant1 = new TenantBuilder()
+        .setId(tenantId1)
+        .setEndpointGroup(ImmutableList.of(eg1, eg2))
+        .setContract(ImmutableList.of(contract1, contract2))
+        .build();
+
+    Tenant malformed = new TenantBuilder()
+        .setId(new TenantId("b26e6b18-8e74-4062-a7d2-e8437132030d"))
+        .setContract(ImmutableList.of(cloop1, cloop2, cselfloop, corphan))
+        .setEndpointGroup(ImmutableList.of(egloop1, egloop2, egselfloop, egorphan))
+        .build();
+    
+    // ****************
+    // Other test state
+    // ****************
+
+    public boolean containsQuality(List<? extends QualityBase> qualities, 
+                                   QualityBase quality) {
+        for (QualityBase q : qualities) {
+            if (q.getName().equals(quality.getName()))
+                return true;
+        }
+        return false;
+    }
+
+    @Test
+    public void testTargetSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        Contract c1 = TenantUtils.findContract(tenant, contractId1);
+
+        // target with a quality directly in the target and one in 
+        // the containing contract
+        Target result = TenantUtils.findTarget(c1, q2TargetName);
+        assertEquals(q2TargetName, result.getName());
+        List<Quality> qualities = result.getQuality();
+        assertTrue(q1.getName() + " found in q2target", 
+                   containsQuality(qualities, q1));
+        assertTrue(q2.getName() + " found in q2target", 
+                   containsQuality(qualities, q2));
+
+        // target with a quality directly in the target with explicit "include"
+        result = TenantUtils.findTarget(c1, q1IncludeTargetName);
+        qualities = result.getQuality();
+        assertTrue(q1.getName() + " found in q1IncludeTargetName", 
+                   containsQuality(qualities, q1));
+        
+        // target with a quality from the containing contract but overridden
+        // in the target
+        result = TenantUtils.findTarget(c1, q1ExcludeTargetName);
+        qualities = result.getQuality();
+        assertFalse(q1.getName() + " found in q1ExcludeTargetName", 
+                    containsQuality(qualities, q1));
+        assertTrue(q2.getName() + " found in q1ExcludeTargetName", 
+                   containsQuality(qualities, q2));
+    }
+
+    @Test
+    public void testTargetInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        Contract c2 = TenantUtils.findContract(tenant, contractId2);
+
+        // hits the q2PlusTarget which should include everything in q2Target
+        // plus q3
+        Target result = TenantUtils.findTarget(c2, q2TargetName);
+        List<Quality> qualities = result.getQuality();
+        assertTrue(q1.getName() + " found in q2target", 
+                   containsQuality(qualities, q1));
+        assertTrue(q2.getName() + " found in q2target", 
+                   containsQuality(qualities, q2));
+        assertTrue(q3.getName() + " found in q2target", 
+                   containsQuality(qualities, q3));
+
+        // Simple case of inheriting the behavior from the base but not messing
+        // it up
+        result = TenantUtils.findTarget(c2, q1IncludeTargetName);
+        qualities = result.getQuality();
+        assertTrue(q1.getName() + " found in q1IncludeTargetName", 
+                   containsQuality(qualities, q1));
+        assertFalse(q2.getName() + " found in q1IncludeTargetName", 
+                   containsQuality(qualities, q2));
+        assertFalse(q3.getName() + " found in q1IncludeTargetName", 
+                    containsQuality(qualities, q3));
+
+        // Inherit a target from the base that isn't found in the child at all
+        result = TenantUtils.findTarget(c2, q1ExcludeTargetName);
+        qualities = result.getQuality();
+        assertFalse(q1.getName() + " found in q1ExcludeTargetName", 
+                    containsQuality(qualities, q1));
+        assertTrue(q2.getName() + " found in q1ExcludeTargetName", 
+                   containsQuality(qualities, q2));
+        assertFalse(q3.getName() + " found in q1ExcludeTargetName", 
+                    containsQuality(qualities, q3));
+    }
+    
+    private boolean containsRequirement(List<? extends RequirementBase> requirements, 
+                                       RequirementBase requirement) {
+        for (RequirementBase r : requirements) {
+            if (r.getName().equals(requirement.getName()))
+                return true;
+        }
+        return false;
+    }
+    
+    private boolean containsCapability(List<? extends CapabilityBase> capabilities, 
+                                      CapabilityBase capability) {
+        for (CapabilityBase r : capabilities) {
+            if (r.getName().equals(capability.getName()))
+                return true;
+        }
+        return false;
+    }
+
+    private boolean containsCondition(List<? extends Condition> conditions, 
+                                      Condition condition) {
+        for (Condition r : conditions) {
+            if (r.getName().equals(condition.getName()))
+                return true;
+        }
+        return false;
+    }
+    
+    @Test
+    public void testConsumerTargetSelectorSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
+        
+        // should get r1 from eg1 and r2 from target selector
+        ConsumerTargetSelector result =
+                TenantUtils.findCts(egResult1, ctsName1);
+        assertEquals(ctsName1, result.getName());
+        List<Requirement> requirements = result.getRequirement();
+        assertTrue(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertTrue(r2.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r2));
+        
+        List<QualityMatcher> matchers = result.getQualityMatcher();
+        assertEquals(2, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.All, m.getMatchType());                
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.Any, m.getMatchType());
+            }
+        }
+
+        // should get r1 from eg1 but excluded in target selector
+        // r3 comes from target selector
+        result = TenantUtils.findCts(egResult1, ctsName2);
+        assertEquals(ctsName2, result.getName());
+        requirements = result.getRequirement();
+        assertFalse(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertFalse(r2.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r2));
+        assertTrue(r3.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r3));
+        
+        matchers = result.getQualityMatcher();
+        assertEquals(1, matchers.size());
+        assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q2));
+        assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q3));
+        assertEquals(MatchType.Any, matchers.get(0).getMatchType());
+    }
+
+    @Test
+    public void testConsumerTargetSelectorInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
+
+        ConsumerTargetSelector result = 
+                TenantUtils.findCts(egResult2, ctsName1);
+
+        List<Requirement> requirements = result.getRequirement();
+        assertTrue(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertTrue(r3.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r3));
+        
+        // should have three matchers, 
+        // (1) qm_q1_all inherited from endpoint group 1
+        // (2) qm_q1_any inherited from endpoint group 1, but overridden in 
+        //     endpoint group 2 with no new semantics
+        // (3) qm_q2q3_any defined in endpoint group 2
+        List<QualityMatcher> matchers = result.getQualityMatcher();
+        assertEquals(3, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
+                assertEquals(1, m.getMatcherQuality().size());
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.All, m.getMatchType());
+            } else if (m.getName().equals(new QualityMatcherName("qm_q1_any"))) {
+                assertEquals(1, m.getMatcherQuality().size());
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.Any, m.getMatchType());
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q2));
+                assertTrue(containsQuality(m.getMatcherQuality(), q3));
+                assertEquals(MatchType.Any, m.getMatchType());
+            }
+        }
+        
+        result = TenantUtils.findCts(egResult2, ctsName2);
+        assertEquals(ctsName2, result.getName());
+        requirements = result.getRequirement();
+        
+        // should get r1 from eg1 but excluded in target selector
+        // r3 comes from target selector
+        assertFalse(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertFalse(r2.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r2));
+        assertTrue(r3.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r3));
+        
+        // Should get 2 matchers: 
+        // (1) qm_q2q2_any inherited from eg1, except that q2 is excluded 
+        //     by qm_q2q3_plus and q3 has a target namespace added 
+        // (2) qm_q2tq2_any newly-defined with a target namespace
+        matchers = result.getQualityMatcher();
+        assertEquals(2, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q2q3_any"))) {
+                assertFalse(containsQuality(m.getMatcherQuality(), q1));
+                assertFalse(containsQuality(m.getMatcherQuality(), q2));
+                assertTrue(containsQuality(m.getMatcherQuality(), q3));
+                for (MatcherQuality mq : m.getMatcherQuality()) {
+                    if (mq.getName().equals(q3.getName())) {
+                        assertEquals(q2TargetName, mq.getTargetNamespace());
+                    } else {
+                        assertNull(mq.getTargetNamespace());
+                    }
+                }
+                assertEquals(MatchType.All, m.getMatchType());
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q2));
+                assertEquals(MatchType.Any, m.getMatchType());
+                assertEquals(1, m.getMatcherQuality().size());
+                assertEquals(q2TargetName,
+                             m.getMatcherQuality().get(0).getTargetNamespace());
+            }
+        }
+    }
+    
+    @Test
+    public void testConsumerNamedSelectorSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
+        
+        // should get r1 from eg1 and r2 from selector
+        ConsumerNamedSelector result =
+                TenantUtils.findCns(egResult1, cnsName1);
+        assertEquals(cnsName1, result.getName());
+        List<Requirement> requirements = result.getRequirement();
+        assertEquals(2, requirements.size());
+        assertTrue(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertTrue(r2.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r2));
+        
+        assertEquals(1, result.getContract().size());
+        HashSet<ContractId> cids = new HashSet<>();
+        cids.addAll(result.getContract());
+        assertEquals(ImmutableSet.of(contractId1), cids);
+    }
+
+    @Test
+    public void testConsumerNamedSelectorInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
+
+        // should get r1 from eg1 and r2 from eg1 selector, 
+        // and r3 from eg2 selector
+        ConsumerNamedSelector result =
+                TenantUtils.findCns(egResult2, cnsName1);
+        assertEquals(cnsName1, result.getName());
+        List<Requirement> requirements = result.getRequirement();
+        assertEquals(3, requirements.size());
+        assertTrue(r1.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r1));
+        assertTrue(r2.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r2));
+        assertTrue(r3.getName() + " found in " + requirements,
+                   containsRequirement(requirements, r3));
+
+        assertEquals(2, result.getContract().size());
+        HashSet<ContractId> cids = new HashSet<>();
+        cids.addAll(result.getContract());
+        assertEquals(ImmutableSet.of(contractId1, contractId2), cids);
+    }
+
+    @Test
+    public void testProviderTargetSelectorSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
+        
+        // should get c1 from eg1 and c2 from target selector
+        ProviderTargetSelector result =
+                TenantUtils.findPts(egResult1, ptsName1);
+        assertEquals(ptsName1, result.getName());
+        List<Capability> capabilities = result.getCapability();
+        assertTrue(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertTrue(c2.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c2));
+        
+        List<QualityMatcher> matchers = result.getQualityMatcher();
+        assertEquals(2, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.All, m.getMatchType());                
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.Any, m.getMatchType());
+            }
+        }
+
+        // should get c1 from eg1 but excluded in target selector
+        // c3 comes from target selector
+        result = TenantUtils.findPts(egResult1, ptsName2);
+        assertEquals(ptsName2, result.getName());
+        capabilities = result.getCapability();
+        assertFalse(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertFalse(c2.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c2));
+        assertTrue(c3.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c3));
+        
+        matchers = result.getQualityMatcher();
+        assertEquals(1, matchers.size());
+        assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q2));
+        assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q3));
+        assertEquals(MatchType.Any, matchers.get(0).getMatchType());
+    }
+
+    @Test
+    public void testProviderTargetSelectorInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
+
+        ProviderTargetSelector result = 
+                TenantUtils.findPts(egResult2, ptsName1);
+
+        List<Capability> capabilities = result.getCapability();
+        assertTrue(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertTrue(c3.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c3));
+        
+        // should have three matchers, 
+        // (1) qm_q1_all inherited from endpoint group 1
+        // (2) qm_q1_any inherited from endpoint group 1, but overridden in 
+        //     endpoint group 2 with no new semantics
+        // (3) qm_q2q3_any defined in endpoint group 2
+        List<QualityMatcher> matchers = result.getQualityMatcher();
+        assertEquals(3, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
+                assertEquals(1, m.getMatcherQuality().size());
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.All, m.getMatchType());
+            } else if (m.getName().equals(new QualityMatcherName("qm_q1_any"))) {
+                assertEquals(1, m.getMatcherQuality().size());
+                assertTrue(containsQuality(m.getMatcherQuality(), q1));
+                assertEquals(MatchType.Any, m.getMatchType());
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q2));
+                assertTrue(containsQuality(m.getMatcherQuality(), q3));
+                assertEquals(MatchType.Any, m.getMatchType());
+            }
+        }
+        
+        result = TenantUtils.findPts(egResult2, ptsName2);
+        assertEquals(ptsName2, result.getName());
+        capabilities = result.getCapability();
+        
+        // should get c1 from eg1 but excluded in target selector
+        // c3 comes from target selector
+        assertFalse(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertFalse(c2.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c2));
+        assertTrue(c3.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c3));
+        
+        // Should get 2 matchers: 
+        // (1) qm_q2q2_any inherited from eg1, except that q2 is excluded 
+        //     by qm_q2q3_plus and q3 has a target namespace added 
+        // (2) qm_q2tq2_any newly-defined with a target namespace
+        matchers = result.getQualityMatcher();
+        assertEquals(2, matchers.size());
+        for (QualityMatcher m : matchers) {
+            if (m.getName().equals(new QualityMatcherName("qm_q2q3_any"))) {
+                assertFalse(containsQuality(m.getMatcherQuality(), q1));
+                assertFalse(containsQuality(m.getMatcherQuality(), q2));
+                assertTrue(containsQuality(m.getMatcherQuality(), q3));
+                for (MatcherQuality mq : m.getMatcherQuality()) {
+                    if (mq.getName().equals(q3.getName())) {
+                        assertEquals(q2TargetName, mq.getTargetNamespace());
+                    } else {
+                        assertNull(mq.getTargetNamespace());
+                    }
+                }
+                assertEquals(MatchType.All, m.getMatchType());
+            } else {
+                assertTrue(containsQuality(m.getMatcherQuality(), q2));
+                assertEquals(MatchType.Any, m.getMatchType());
+                assertEquals(1, m.getMatcherQuality().size());
+                assertEquals(q2TargetName,
+                             m.getMatcherQuality().get(0).getTargetNamespace());
+            }
+        }
+    }
+
+    @Test
+    public void testProviderNamedSelectorSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
+        
+        // should get c1 from eg1 and c2 from selector
+        ProviderNamedSelector result =
+                TenantUtils.findPns(egResult1, cnsName1);
+        assertEquals(cnsName1, result.getName());
+        List<Capability> capabilities = result.getCapability();
+        assertEquals(2, capabilities.size());
+        assertTrue(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertTrue(c2.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c2));
+        
+        assertEquals(1, result.getContract().size());
+        HashSet<ContractId> cids = new HashSet<>();
+        cids.addAll(result.getContract());
+        assertEquals(ImmutableSet.of(contractId1), cids);
+    }
+
+    @Test
+    public void testProviderNamedSelectorInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
+
+        // should get c1 from eg1 and c2 from eg1 selector, 
+        // and c3 from eg2 selector
+        ProviderNamedSelector result =
+                TenantUtils.findPns(egResult2, cnsName1);
+        assertEquals(cnsName1, result.getName());
+        List<Capability> capabilities = result.getCapability();
+        assertEquals(3, capabilities.size());
+        assertTrue(c1.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c1));
+        assertTrue(c2.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c2));
+        assertTrue(c3.getName() + " found in " + capabilities,
+                   containsCapability(capabilities, c3));
+
+        assertEquals(2, result.getContract().size());
+        HashSet<ContractId> cids = new HashSet<>();
+        cids.addAll(result.getContract());
+        assertEquals(ImmutableSet.of(contractId1, contractId2), cids);
+    }
+
+    @Test
+    public void testClauseSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        Contract cresult1 = TenantUtils.findContract(tenant, contractId1);
+        
+        Clause result = TenantUtils.findClause(cresult1, clauseName1);
+        assertEquals(clauseName1, result.getName());
+        
+        // subject refs: subject1 from clause1
+        assertEquals(1, result.getSubjectRefs().size());
+        assertEquals(ImmutableSet.of(subject1), 
+                     ImmutableSet.copyOf(result.getSubjectRefs()));
+
+        assertNotNull(result.getProviderMatchers());
+        List<ConditionMatcher> cm = 
+                result.getProviderMatchers().getConditionMatcher();
+        assertEquals(1, cm.size());
+        assertEquals(1, cm.get(0).getCondition().size());
+        assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
+
+        List<CapabilityMatcher> capm = 
+                result.getProviderMatchers().getCapabilityMatcher();
+        assertEquals(1, capm.size());
+        assertEquals(1, capm.get(0).getMatcherCapability().size());
+        assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
+        
+        assertNotNull(result.getConsumerMatchers());
+        cm = result.getConsumerMatchers().getConditionMatcher();
+        assertEquals(1, cm.size());
+        assertEquals(1, cm.get(0).getCondition().size());
+        assertTrue(containsCondition(cm.get(0).getCondition(), cond2));
+
+        List<RequirementMatcher> pm = 
+                result.getConsumerMatchers().getRequirementMatcher();
+        assertEquals(1, pm.size());
+        assertEquals(1, pm.get(0).getMatcherRequirement().size());
+        assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
+        
+    }
+
+    @Test
+    public void testClauseInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+        Contract cresult2 = TenantUtils.findContract(tenant, contractId2);
+        
+        Clause result = TenantUtils.findClause(cresult2, clauseName1);
+        assertEquals(clauseName1, result.getName());
+        // subject refs: subject1 from clause1, subject2 from clause2
+        assertEquals(2, result.getSubjectRefs().size());
+        assertEquals(ImmutableSet.of(subject1, subject2), 
+                     ImmutableSet.copyOf(result.getSubjectRefs()));
+
+        assertNotNull(result.getProviderMatchers());
+        List<ConditionMatcher> cm = 
+                result.getProviderMatchers().getConditionMatcher();
+        assertEquals(1, cm.size());
+        assertEquals(1, cm.get(0).getCondition().size());
+        assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
+        
+        List<CapabilityMatcher> capm = 
+                result.getProviderMatchers().getCapabilityMatcher();
+        assertEquals(1, capm.size());
+        assertEquals(1, capm.get(0).getMatcherCapability().size());
+        assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
+        
+        assertNotNull(result.getConsumerMatchers());
+        cm = result.getConsumerMatchers().getConditionMatcher();
+        assertEquals(1, cm.size());
+        assertEquals(cm_c2.getName(), cm.get(0).getName());
+        assertEquals(MatchType.All, cm.get(0).getMatchType());
+        assertEquals(0, cm.get(0).getCondition().size());
+
+        List<RequirementMatcher> pm = 
+                result.getConsumerMatchers().getRequirementMatcher();
+        assertEquals(1, pm.size());
+        assertEquals(2, pm.get(0).getMatcherRequirement().size());
+        assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
+        assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r2));
+    }
+
+    @Test
+    public void testSubjectSimple() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+
+        Contract result = TenantUtils.findContract(tenant, contractId1);
+        List<Subject> subjects = result.getSubject();
+        assertEquals(1, subjects.size());
+        
+        assertEquals(s1.getName(), subjects.get(0).getName());
+        List<Rule> rules = subjects.get(0).getRule();
+        assertEquals(2, rules.size());
+        assertEquals(rule2.getName(), rules.get(0).getName());
+        assertEquals(rule1.getName(), rules.get(1).getName());
+    }
+
+    @Test
+    public void testSubjectInheritance() throws Exception {
+        Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
+
+        Contract result = TenantUtils.findContract(tenant, contractId2);
+        List<Subject> subjects = result.getSubject();
+        assertEquals(2, subjects.size());
+        for (Subject s: subjects) {
+            if (s1.getName().equals(s.getName())) {
+                assertEquals(Integer.valueOf(4), s.getOrder());
+                List<Rule> rules = s.getRule();
+                assertEquals(4, rules.size());
+                assertEquals(rule4.getName(), rules.get(0).getName());
+                assertEquals(rule3.getName(), rules.get(1).getName());
+                assertEquals(rule2.getName(), rules.get(2).getName());
+                assertEquals(rule1.getName(), rules.get(3).getName());
+            } else if (s2.getName().equals(s.getName())) {
+                assertEquals(0, s.getRule().size());
+                assertEquals(Integer.valueOf(5), s.getOrder());
+            } else {
+                fail("extra subject?");
+            }
+        }
+    }
+    
+    @Test
+    public void testMalformedPolicy() throws Exception {
+        Tenant tenant = 
+                InheritanceUtils.resolveTenant(malformed);
+        Contract c = TenantUtils.findContract(tenant, cloop2Id);
+        assertEquals(1, c.getClause().size());
+        Clause clause = c.getClause().get(0);
+        assertEquals(1, clause.getConsumerMatchers().getConditionMatcher().size());
+        assertEquals(1, clause.getConsumerMatchers().getRequirementMatcher().size());
+        assertEquals(1, clause.getProviderMatchers().getConditionMatcher().size());
+        assertEquals(1, clause.getProviderMatchers().getCapabilityMatcher().size());
+        assertEquals(2, c.getSubject().size());
+        
+        EndpointGroup eg = TenantUtils.findEndpointGroup(tenant, egloop2Id);
+        assertEquals(1, eg.getConsumerNamedSelector().size());
+        assertEquals(1, eg.getConsumerTargetSelector().size());
+        assertEquals(1, eg.getProviderNamedSelector().size());
+        assertEquals(1, eg.getProviderTargetSelector().size());
+        
+    }
+}
diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/MatcherUtilsTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/MatcherUtilsTest.java
new file mode 100644 (file)
index 0000000..d595362
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import org.junit.Test;
+import org.opendaylight.groupbasedpolicy.resolver.MatcherUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TargetName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.Capability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.CapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.Quality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.QualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.Requirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.RequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQuality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.TargetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelectorBuilder;
+
+import com.google.common.collect.ImmutableList;
+
+import static org.junit.Assert.*;
+
+public class MatcherUtilsTest {
+    
+    @Test
+    public void testApplyQualityMatcher() throws Exception {
+        Quality q1 = new QualityBuilder().setName(new QualityName("q1")).build();
+        Quality q2 = new QualityBuilder().setName(new QualityName("q2")).build();
+        Quality q3 = new QualityBuilder().setName(new QualityName("q3")).build();
+        Quality q4 = new QualityBuilder().setName(new QualityName("q4")).build();
+        
+        Target t1 = new TargetBuilder()
+            .setName(new TargetName("t1"))
+            .setQuality(ImmutableList.of(q1, q2))
+            .build();
+        Target t2 = new TargetBuilder()
+            .setName(new TargetName("t2"))
+            .setQuality(ImmutableList.of(q3, q4))
+            .build();
+
+        MatcherQuality mq1 = new MatcherQualityBuilder(q1).build();
+        MatcherQuality mq2 = new MatcherQualityBuilder(q2).build();
+        MatcherQuality mq1_ns1 = new MatcherQualityBuilder(q1)
+            .setTargetNamespace(t1.getName())
+            .build();
+        MatcherQuality mq1_ns2 = new MatcherQualityBuilder(q1)
+            .setTargetNamespace(t2.getName())
+            .build();
+        MatcherQuality mq3 = new MatcherQualityBuilder(q3).build();
+        
+        QualityMatcher qm = new QualityMatcherBuilder()
+            .setMatchType(MatchType.All)
+            .setMatcherQuality(ImmutableList.of(mq1, mq1_ns1))
+            .build();
+
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t2));
+        
+        qm = new QualityMatcherBuilder()
+            .setMatcherQuality(ImmutableList.of(mq1_ns2))
+            .build();
+
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t2));
+
+        qm = new QualityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherQuality(ImmutableList.of(mq1, mq3))
+            .build();
+
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t1));
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t2));
+
+        qm = new QualityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherQuality(ImmutableList.of(mq1, mq2))
+            .build();
+
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t2));
+
+        qm = new QualityMatcherBuilder()
+            .setMatchType(MatchType.None)
+            .setMatcherQuality(ImmutableList.of(mq3, mq1_ns2))
+            .build();
+
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t2));
+        
+        qm = new QualityMatcherBuilder().build();
+        assertTrue(MatcherUtils.applyQualityMatcher(qm, t1));
+
+        qm = new QualityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .build();
+        assertFalse(MatcherUtils.applyQualityMatcher(qm, t1));
+    }
+    
+    @Test
+    public void testApplyCapMatcher() throws Exception {
+        Capability q1 = new CapabilityBuilder().setName(new CapabilityName("q1")).build();
+        Capability q2 = new CapabilityBuilder().setName(new CapabilityName("q2")).build();
+        Capability q3 = new CapabilityBuilder().setName(new CapabilityName("q3")).build();
+        Capability q4 = new CapabilityBuilder().setName(new CapabilityName("q4")).build();
+        
+        ProviderTargetSelector t1 = new ProviderTargetSelectorBuilder()
+            .setName(new SelectorName("t1"))
+            .setCapability(ImmutableList.of(q1, q2))
+            .build();
+        ProviderNamedSelector t2 = new ProviderNamedSelectorBuilder()
+            .setName(new SelectorName("t2"))
+            .setCapability(ImmutableList.of(q3, q4))
+            .build();
+
+        MatcherCapability mq1 = new MatcherCapabilityBuilder(q1).build();
+        MatcherCapability mq2 = new MatcherCapabilityBuilder(q2).build();
+        MatcherCapability mq1_ns1 = new MatcherCapabilityBuilder(q1)
+            .setSelectorNamespace(t1.getName())
+            .build();
+        MatcherCapability mq1_ns2 = new MatcherCapabilityBuilder(q1)
+            .setSelectorNamespace(t2.getName())
+            .build();
+        MatcherCapability mq3 = new MatcherCapabilityBuilder(q3).build();
+        
+        CapabilityMatcher qm = new CapabilityMatcherBuilder()
+            .setMatchType(MatchType.All)
+            .setMatcherCapability(ImmutableList.of(mq1, mq1_ns1))
+            .build();
+
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t2));
+        
+        qm = new CapabilityMatcherBuilder()
+            .setMatcherCapability(ImmutableList.of(mq1_ns2))
+            .build();
+
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t2));
+
+        qm = new CapabilityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherCapability(ImmutableList.of(mq1, mq3))
+            .build();
+
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t1));
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t2));
+
+        qm = new CapabilityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherCapability(ImmutableList.of(mq1, mq2))
+            .build();
+
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t2));
+
+        qm = new CapabilityMatcherBuilder()
+            .setMatchType(MatchType.None)
+            .setMatcherCapability(ImmutableList.of(mq3, mq1_ns2))
+            .build();
+
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t2));
+        
+        qm = new CapabilityMatcherBuilder().build();
+        assertTrue(MatcherUtils.applyCapMatcher(qm, t1));
+
+        qm = new CapabilityMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .build();
+        assertFalse(MatcherUtils.applyCapMatcher(qm, t1));
+    }
+    
+    @Test
+    public void testApplyReqMatcher() throws Exception {
+        Requirement q1 = new RequirementBuilder().setName(new RequirementName("q1")).build();
+        Requirement q2 = new RequirementBuilder().setName(new RequirementName("q2")).build();
+        Requirement q3 = new RequirementBuilder().setName(new RequirementName("q3")).build();
+        Requirement q4 = new RequirementBuilder().setName(new RequirementName("q4")).build();
+        
+        ConsumerNamedSelector t1 = new ConsumerNamedSelectorBuilder()
+            .setName(new SelectorName("t1"))
+            .setRequirement(ImmutableList.of(q1, q2))
+            .build();
+        ConsumerTargetSelector t2 = new ConsumerTargetSelectorBuilder()
+            .setName(new SelectorName("t2"))
+            .setRequirement(ImmutableList.of(q3, q4))
+            .build();
+
+        MatcherRequirement mq1 = new MatcherRequirementBuilder(q1).build();
+        MatcherRequirement mq2 = new MatcherRequirementBuilder(q2).build();
+        MatcherRequirement mq1_ns1 = new MatcherRequirementBuilder(q1)
+            .setSelectorNamespace(t1.getName())
+            .build();
+        MatcherRequirement mq1_ns2 = new MatcherRequirementBuilder(q1)
+            .setSelectorNamespace(t2.getName())
+            .build();
+        MatcherRequirement mq3 = new MatcherRequirementBuilder(q3).build();
+        
+        RequirementMatcher qm = new RequirementMatcherBuilder()
+            .setMatchType(MatchType.All)
+            .setMatcherRequirement(ImmutableList.of(mq1, mq1_ns1))
+            .build();
+
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t2));
+        
+        qm = new RequirementMatcherBuilder()
+            .setMatcherRequirement(ImmutableList.of(mq1_ns2))
+            .build();
+
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t2));
+
+        qm = new RequirementMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherRequirement(ImmutableList.of(mq1, mq3))
+            .build();
+
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t1));
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t2));
+
+        qm = new RequirementMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .setMatcherRequirement(ImmutableList.of(mq1, mq2))
+            .build();
+
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t2));
+
+        qm = new RequirementMatcherBuilder()
+            .setMatchType(MatchType.None)
+            .setMatcherRequirement(ImmutableList.of(mq3, mq1_ns2))
+            .build();
+
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t1));
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t2));
+
+        qm = new RequirementMatcherBuilder().build();
+        assertTrue(MatcherUtils.applyReqMatcher(qm, t1));
+
+        qm = new RequirementMatcherBuilder()
+            .setMatchType(MatchType.Any)
+            .build();
+        assertFalse(MatcherUtils.applyReqMatcher(qm, t1));
+    }
+}
diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java
new file mode 100644 (file)
index 0000000..18385c6
--- /dev/null
@@ -0,0 +1,520 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
+import org.opendaylight.groupbasedpolicy.resolver.ConditionSet;
+import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.ContractMatch;
+import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.TenantContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TargetName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.Capability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.CapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.Quality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.QualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.Requirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.RequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Clause;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.SubjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.TargetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ConsumerMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelectorBuilder;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Table;
+
+import static org.junit.Assert.*;
+
+public class PolicyResolverTest {
+    Quality q1 = new QualityBuilder()
+        .setName(new QualityName("q1"))
+        .build();
+    Quality q2 = new QualityBuilder()
+        .setName(new QualityName("q2"))
+        .build();
+    Quality q3 = new QualityBuilder()
+        .setName(new QualityName("q3"))
+        .build();
+
+    Requirement r1 = new RequirementBuilder()
+        .setName(new RequirementName("r1"))
+        .build();
+    Requirement r3 = new RequirementBuilder()
+        .setName(new RequirementName("r3"))
+        .build();
+
+    Capability cap1 = new CapabilityBuilder()
+        .setName(new CapabilityName("cap1"))
+        .build();
+    Capability cap3 = new CapabilityBuilder()
+        .setName(new CapabilityName("cap3"))
+        .build();
+
+    Condition cond1 = new ConditionBuilder()
+        .setName(new ConditionName("cond1"))
+        .build();
+    Condition cond2 = new ConditionBuilder()
+        .setName(new ConditionName("cond2"))
+        .build();
+    Condition cond3 = new ConditionBuilder()
+        .setName(new ConditionName("cond3"))
+        .build();
+
+    Target t1 = new TargetBuilder()
+        .setName(new TargetName("t1"))
+        .setQuality(ImmutableList.of(q1,q2))
+        .build();
+    Target t2 = new TargetBuilder()
+        .setName(new TargetName("t1"))
+        .setQuality(ImmutableList.of(q3))
+        .build();
+    Target t0 = new TargetBuilder()
+        .setName(new TargetName("t1"))
+        .build();
+    
+    Rule rule1 = new RuleBuilder()
+        .setName(new RuleName("r1"))
+        .setOrder(Integer.valueOf(5))
+        .build();
+    Rule rule2 = new RuleBuilder()
+        .setName(new RuleName("r2"))
+        .build();
+    Rule rule3 = new RuleBuilder()
+        .setName(new RuleName("r3"))
+        .build();
+    Subject s1 = new SubjectBuilder()
+        .setName(new SubjectName("s1"))
+        .setRule(ImmutableList.of(rule1))
+        .build();
+    Subject s2 = new SubjectBuilder()
+        .setName(new SubjectName("s1"))
+        .setRule(ImmutableList.of(rule2))
+        .setOrder(Integer.valueOf(3))
+        .build();
+    Subject s3 = new SubjectBuilder()
+        .setName(new SubjectName("s3"))
+        .setRule(ImmutableList.of(rule3))
+        .setOrder(Integer.valueOf(3))
+        .build();
+
+    RequirementMatcher rm1 = new RequirementMatcherBuilder()
+        .setName(new RequirementMatcherName("rm1"))
+        .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r1).build()))
+        .build();
+    CapabilityMatcher capm1 = new CapabilityMatcherBuilder()
+        .setName(new CapabilityMatcherName("cap1"))
+        .setMatcherCapability(ImmutableList.of(new MatcherCapabilityBuilder(cap1).build()))
+        .build();
+    ConditionMatcher condm1 = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("condm1"))
+        .setCondition(ImmutableList.of(cond1))
+        .setMatchType(MatchType.All)
+        .build();
+    ConditionMatcher condm2 = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("condm2"))
+        .setCondition(ImmutableList.of(cond1, cond2))
+        .setMatchType(MatchType.Any)
+        .build();
+    ConditionMatcher condm3 = new ConditionMatcherBuilder()
+        .setName(new ConditionMatcherName("condm3"))
+        .setCondition(ImmutableList.of(cond3))
+        .setMatchType(MatchType.None)
+        .build();
+
+    Clause clause1 = new ClauseBuilder()
+        .setName(new ClauseName("clause1"))
+        .setConsumerMatchers(new ConsumerMatchersBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm1))
+            .setConditionMatcher(ImmutableList.of(condm1, condm2, condm3))
+            .build())
+        .setProviderMatchers(new ProviderMatchersBuilder()
+            .setCapabilityMatcher(ImmutableList.of(capm1))
+            .build())
+        .setSubjectRefs(ImmutableList.of(s1.getName()))
+        .build();
+    Clause clause3 = new ClauseBuilder()
+        .setName(new ClauseName("clause3"))
+        .setSubjectRefs(ImmutableList.of(s3.getName(), s2.getName()))
+        .build();
+    Clause clause0 = new ClauseBuilder()
+        .setName(new ClauseName("clause0"))
+        .build();
+    Clause clause00 = new ClauseBuilder()
+        .setName(new ClauseName("clause00"))
+        .setConsumerMatchers(new ConsumerMatchersBuilder().build())
+        .setProviderMatchers(new ProviderMatchersBuilder().build())
+        .build();
+    
+    Contract contract1 = new ContractBuilder()
+        .setId(new ContractId("c9eea992-ba51-4e11-b797-986853832ad9"))
+        .setTarget(ImmutableList.of(t1))
+        .setClause(ImmutableList.of(clause1, clause0, clause00))
+        .setSubject(ImmutableList.of(s1))
+        .build();
+    Contract contract2 = new ContractBuilder()
+        .setId(new ContractId("3a3b67ff-1795-4dc0-a7b2-2c3453872e4e"))
+        .setTarget(ImmutableList.of(t1, t2))
+        .setClause(ImmutableList.of(clause3))
+        .setSubject(ImmutableList.of(s2))
+        .build();
+    Contract contract0 = new ContractBuilder()
+        .setId(new ContractId("ce467a3c-2c7b-4e9e-a575-7da1fbdf1833"))
+        .build();
+    Contract contract00 = new ContractBuilder()
+        .setId(new ContractId("79de88e8-b37f-4764-a1a3-7f3b37b15433"))
+        .setTarget(ImmutableList.of(t0))
+        .build();
+    
+    ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder()
+        .setName(new SelectorName("cns1"))
+        .setContract(ImmutableList.of(contract1.getId()))
+        .setRequirement(ImmutableList.of(r1, r3))
+        .build();
+    ConsumerNamedSelector cns2 = new ConsumerNamedSelectorBuilder()
+        .setName(new SelectorName("cns2"))
+        .setContract(ImmutableList.of(contract2.getId()))
+        .setRequirement(ImmutableList.of(r1, r3))
+        .build();
+    ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder()
+        .setName(new SelectorName("pns1"))
+        .setContract(ImmutableList.of(contract1.getId(), contract2.getId()))
+        .setCapability(ImmutableList.of(cap1, cap3))
+        .build();
+    
+    QualityMatcher qm1 = new QualityMatcherBuilder()
+        .setName(new QualityMatcherName("qm1"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1).build()))
+        .build();
+    QualityMatcher qm3 = new QualityMatcherBuilder()
+         .setName(new QualityMatcherName("qm3"))
+         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q3).build()))
+         .build();
+    ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder()
+        .setName(new SelectorName("cts1"))
+        .setQualityMatcher(ImmutableList.of(qm1))
+        .build();
+    ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder()
+        .setName(new SelectorName("pts1"))
+        .setQualityMatcher(ImmutableList.of(qm3))
+        .build();
+    
+    EndpointGroup eg1 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("12802e21-8602-40ec-91d3-a75a296881ab"))
+        .setConsumerNamedSelector(ImmutableList.of(cns1))
+        .build();
+    EndpointGroup eg2 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("66bb92ff-6e4c-41f1-8c7d-baa322016ab5"))
+        .setProviderNamedSelector(ImmutableList.of(pns1))
+        .build();
+    EndpointGroup eg3 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("0ed93cb5-28ee-46bd-a5a1-41d6aa88dae5"))
+        .setConsumerNamedSelector(ImmutableList.of(cns1, cns2))
+        .build();
+    EndpointGroup eg4 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("51eaf011-94a9-4cb1-b12d-149b77c5c016"))
+        .setConsumerTargetSelector(ImmutableList.of(cts1))
+        .build();
+    EndpointGroup eg5 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("92344738-ba37-4d69-b9e5-904eebdad585"))
+        .setProviderTargetSelector(ImmutableList.of(pts1))
+        .build();
+    EndpointGroup eg0 = new EndpointGroupBuilder()
+        .setId(new EndpointGroupId("64e03313-d6d8-43cb-ae4d-5a9b0a410c91"))
+        .build();
+
+    Tenant tenant1 = new TenantBuilder()
+        .setId(new TenantId("144b9aec-ef06-44f1-a50c-2fe5be456feb"))
+        .setContract(ImmutableList.of(contract1, contract2))
+        .setEndpointGroup(ImmutableList.of(eg1, eg2))
+        .build();
+    Tenant tenant2 = new TenantBuilder()
+        .setId(new TenantId("138a2bc3-d3cb-4588-ad7a-63c9f19ce3e5"))
+        .setContract(ImmutableList.of(contract1, contract2))
+        .setEndpointGroup(ImmutableList.of(eg1, eg2, eg3))
+        .build();
+    Tenant tenant3 = new TenantBuilder()
+        .setId(new TenantId("d1feede4-c31f-4232-ace2-93fcd065af1d"))
+        .setContract(ImmutableList.of(contract1, contract2))
+        .setEndpointGroup(ImmutableList.of(eg4, eg5))
+        .build();
+    Tenant tenant0 = new TenantBuilder().build();
+    Tenant tenant00 = new TenantBuilder()
+        .setContract(ImmutableList.of(contract0, contract00))
+        .setEndpointGroup(ImmutableList.of(eg0))
+        .build();
+
+    PolicyResolver resolver;
+    
+    @Before
+    public void setup() throws Exception {
+        resolver = new PolicyResolver(null, null);
+    }
+    
+    public void verifyMatches(List<ContractId> contrids,
+                              List<TenantId> contrtids,
+                              List<ContractMatch> matches) {
+        HashSet<ContractMatchKey> v = new HashSet<>();
+        for (int i = 0; i < contrids.size(); i++) {
+            v.add(new ContractMatchKey(contrtids.get(i), contrids.get(i)));
+        }
+        assertEquals(contrids.size(), matches.size());
+        for (ContractMatch m : matches) {
+            ContractMatchKey k = 
+                    new ContractMatchKey(m.contractTenant.getId(), 
+                                         m.contract.getId());
+            assertTrue(v.contains(k));
+        }
+    }
+    
+    @Test
+    public void testContractSelection() throws Exception {
+        // named selectors
+        TenantContext tc = new TenantContext(null);
+        Collection<TenantContext> tCol = Collections.singleton(tc);
+        
+        tc.tenant.set(new IndexedTenant(tenant1));
+        Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
+                resolver.selectContracts(tCol);
+        assertEquals(1, contractMatches.size());
+        List<ContractMatch> matches = 
+                contractMatches.get(new EgKey(tenant1.getId(), eg1.getId()),
+                                    new EgKey(tenant1.getId(), eg2.getId()));
+        verifyMatches(ImmutableList.of(contract1.getId()),
+                      ImmutableList.of(tenant1.getId()),
+                      matches);
+
+        
+        tc.tenant.set(new IndexedTenant(tenant2));
+        contractMatches = resolver.selectContracts(tCol);
+        assertEquals(2, contractMatches.size());
+        matches = contractMatches.get(new EgKey(tenant2.getId(), eg1.getId()),
+                                      new EgKey(tenant2.getId(), eg2.getId()));
+        verifyMatches(ImmutableList.of(contract1.getId()),
+                      ImmutableList.of(tenant2.getId()),
+                      matches);
+        
+        matches = contractMatches.get(new EgKey(tenant2.getId(), eg3.getId()),
+                                      new EgKey(tenant2.getId(), eg2.getId()));
+        verifyMatches(ImmutableList.of(contract2.getId(), contract1.getId()),
+                      ImmutableList.of(tenant2.getId(), tenant2.getId()),
+                      matches);
+        
+        // target selectors
+        tc.tenant.set(new IndexedTenant(tenant3));
+        contractMatches = resolver.selectContracts(tCol);
+        assertEquals(1, contractMatches.size());
+        matches = contractMatches.get(new EgKey(tenant3.getId(), eg4.getId()),
+                                      new EgKey(tenant3.getId(), eg5.getId()));
+        verifyMatches(ImmutableList.of(contract2.getId()),
+                      ImmutableList.of(tenant3.getId()),
+                      matches);
+        
+        // empty matches
+        tc.tenant.set(new IndexedTenant(tenant0));
+        contractMatches = resolver.selectContracts(tCol);
+        assertEquals(0, contractMatches.size());
+
+        tc.tenant.set(new IndexedTenant(tenant00));
+        contractMatches = resolver.selectContracts(tCol);
+        assertEquals(0, contractMatches.size());
+    }
+
+    @Test
+    public void testSubjectSelection() throws Exception {
+        ConditionSet cs = 
+                new ConditionSet(ImmutableSet.of(cond1.getName()), 
+                                 ImmutableSet.of(cond3.getName()),
+                                 ImmutableSet.of(ImmutableSet.of(cond1.getName(), 
+                                                                 cond2.getName())));
+        TenantContext tc = new TenantContext(null);
+        Collection<TenantContext> tCol = Collections.singleton(tc);
+        
+        tc.tenant.set(new IndexedTenant(tenant1));
+        Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
+                resolver.selectContracts(tCol);
+        Map<EgKey, Set<ConditionSet>> egConditions = new HashMap<>();
+        Table<EgKey, EgKey, Policy> policy = 
+                resolver.selectSubjects(contractMatches, egConditions);
+        assertEquals(1, policy.size());
+        Policy p = policy.get(new EgKey(tenant1.getId(), eg2.getId()),
+                              new EgKey(tenant1.getId(), eg1.getId()));
+        List<RuleGroup> rules = p.ruleMap.get(ConditionSet.EMPTY, cs);
+        assertNotNull(rules);
+        assertEquals(1, rules.size());
+        RuleGroup rg = rules.get(0);
+        assertEquals(tenant1.getId(), rg.contractTenant.getId());
+        assertEquals(contract1.getId(), rg.relatedContract.getId());
+        assertEquals(s1.getName(), rg.relatedSubject);
+        assertEquals(1, rg.rules.size());
+        assertEquals(rule1.getName(), rg.rules.get(0).getName());
+
+        tc.tenant.set(new IndexedTenant(tenant2));
+        contractMatches = resolver.selectContracts(tCol);
+        egConditions = new HashMap<>();
+        policy = resolver.selectSubjects(contractMatches, egConditions);
+
+        assertEquals(2, policy.size());
+        p = policy.get(new EgKey(tenant2.getId(), eg2.getId()),
+                       new EgKey(tenant2.getId(), eg3.getId()));
+        rules = p.ruleMap.get(ConditionSet.EMPTY, cs);
+        assertNotNull(rules);
+        assertEquals(1, rules.size());
+        rg = rules.get(0);
+        assertEquals(tenant2.getId(), rg.contractTenant.getId());
+        assertEquals(contract1.getId(), rg.relatedContract.getId());
+        assertEquals(s1.getName(), rg.relatedSubject);
+        assertEquals(1, rg.rules.size());
+        assertEquals(rule1.getName(), rg.rules.get(0).getName());
+
+        rules = p.ruleMap.get(ConditionSet.EMPTY, ConditionSet.EMPTY);
+        assertNotNull(rules);
+        assertEquals(1, rules.size());
+        rg = rules.get(0);
+        assertEquals(tenant2.getId(), rg.contractTenant.getId());
+        assertEquals(contract2.getId(), rg.relatedContract.getId());
+        assertEquals(s2.getName(), rg.relatedSubject);
+        assertEquals(1, rg.rules.size());
+        assertEquals(rule2.getName(), rg.rules.get(0).getName());
+        
+        p = policy.get(new EgKey(tenant2.getId(), eg2.getId()),
+                       new EgKey(tenant2.getId(), eg1.getId()));
+        rules = p.ruleMap.get(ConditionSet.EMPTY, cs);
+        assertNotNull(rules);
+        assertEquals(1, rules.size());
+        rg = rules.get(0);
+        assertEquals(tenant2.getId(), rg.contractTenant.getId());
+        assertEquals(contract1.getId(), rg.relatedContract.getId());
+        assertEquals(s1.getName(), rg.relatedSubject);
+        assertEquals(1, rg.rules.size());
+        assertEquals(rule1.getName(), rg.rules.get(0).getName());
+
+        tc.tenant.set(new IndexedTenant(tenant3));
+        contractMatches = resolver.selectContracts(tCol);
+        egConditions = new HashMap<>();
+        policy = resolver.selectSubjects(contractMatches, egConditions);
+
+        assertEquals(1, policy.size());
+        p = policy.get(new EgKey(tenant3.getId(), eg5.getId()),
+                       new EgKey(tenant3.getId(), eg4.getId()));
+        rules = p.ruleMap.get(ConditionSet.EMPTY, ConditionSet.EMPTY);
+        assertNotNull(rules);
+        assertEquals(1, rules.size());
+        rg = rules.get(0);
+        assertEquals(tenant3.getId(), rg.contractTenant.getId());
+        assertEquals(contract2.getId(), rg.relatedContract.getId());
+        assertEquals(s2.getName(), rg.relatedSubject);
+        assertEquals(1, rg.rules.size());
+        assertEquals(rule2.getName(), rg.rules.get(0).getName());
+    }
+
+    private static class ContractMatchKey {
+        TenantId tenant;
+        ContractId contract;
+        public ContractMatchKey(TenantId tenant, ContractId contract) {
+            super();
+            this.tenant = tenant;
+            this.contract = contract;
+        }
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result +
+                     ((contract == null) ? 0 : contract.hashCode());
+            result = prime * result +
+                     ((tenant == null) ? 0 : tenant.hashCode());
+            return result;
+        }
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            ContractMatchKey other = (ContractMatchKey) obj;
+            if (contract == null) {
+                if (other.contract != null)
+                    return false;
+            } else if (!contract.equals(other.contract))
+                return false;
+            if (tenant == null) {
+                if (other.tenant != null)
+                    return false;
+            } else if (!tenant.equals(other.tenant))
+                return false;
+            return true;
+        }
+        @Override
+        public String toString() {
+            return "ContractMatchKey [tenant=" + tenant + ", contract=" +
+                   contract + "]";
+        }
+    }
+
+}
diff --git a/renderers/opflex/pom.xml b/renderers/opflex/pom.xml
new file mode 100644 (file)
index 0000000..16824a3
--- /dev/null
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy-renderers</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <relativePath>../</relativePath>
+  </parent>
+
+  <artifactId>opflex-renderer</artifactId>
+  <packaging>bundle</packaging>
+
+  <properties>
+  </properties>
+
+  <dependencies>
+  </dependencies>
+
+  <!-- project build -->
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>
+             org.apache.http.*;version="4.3.2",
+            *;resolution:=optional
+            </Import-Package>
+            <Embed-Dependency>httpclient,httpcore,commons-lang,commons-exec;type=!pom;inline=false</Embed-Dependency>
+            <Export-Package>
+           </Export-Package>
+          </instructions>
+          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <phase>generate-sources</phase>
+            <configuration>
+              <sources>
+                <source>target/generated-sources/sal</source>
+                <source>target/generated-sources/config</source>
+                <source>target/generated-resources/</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-jmx-generator-plugin</artifactId>
+            <version>0.3.0-SNAPSHOT</version>
+          </dependency>
+          <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>${yangtools.version}</version>
+            <type>jar</type>
+          </dependency>
+        </dependencies>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate-sources</goal>
+            </goals>
+            <configuration>
+              <codeGenerators>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                  <additionalConfiguration>
+                    <namespaceToPackage1>urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang</namespaceToPackage1>
+                  </additionalConfiguration>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/sal</outputBaseDir>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/site/models</outputBaseDir>
+                </generator>
+              </codeGenerators>
+              <inspectDependencies>true</inspectDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <redirectTestOutputToFile>true</redirectTestOutputToFile>
+        </configuration>
+      </plugin>
+      <plugin>
+       <groupId>org.jacoco</groupId>
+       <artifactId>jacoco-maven-plugin</artifactId>
+       <executions>
+          <execution>
+            <id>pre-unit-test</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>post-unit-test</id>
+            <phase>test</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+            <configuration>
+              <dataFile>${sonar.jacoco.reportPath}</dataFile>
+             <includes>
+               <include>org/opendaylight/groupbasedpolicy/**/*.class</include>
+             </includes>
+            </configuration>
+          </execution>
+       </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
+
similarity index 98%
rename from groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManager.java
rename to renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/PolicyManager.java
index b4a1849bc8e7508697ed6d2b9876bdd8e7a6d590..b300c34f1e63f440bde4b67f8ad1e41b0468dcf4 100644 (file)
@@ -47,7 +47,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig.LearningMode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -128,14 +127,6 @@ public class PolicyManager
         sendPolicyUpdates(updatedConsumers);
     }
 
-    /**
-     * Set the learning mode to the specified value
-     * @param learningMode the learning mode to set
-     */
-    public void setLearningMode(LearningMode learningMode) {
-        // No-op for now
-    }
-
     // **************
     // Implementation
     // **************
diff --git a/renderers/pom.xml b/renderers/pom.xml
new file mode 100644 (file)
index 0000000..f3f90ce
--- /dev/null
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy.project</artifactId>
+    <version>0.2.0-SNAPSHOT</version>
+    <relativePath>../</relativePath>
+  </parent>
+
+  <artifactId>groupbasedpolicy-renderers</artifactId>
+  <version>0.2.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>oc</module>
+    <module>opflex</module>
+    <module>ofoverlay</module>
+  </modules>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>groupbasedpolicy</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+      <version>4.0.10.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>config-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>sal-binding-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>sal-binding-config</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>sal-common-util</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller.model</groupId>
+      <artifactId>model-inventory</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-binding</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.6</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-exec</artifactId>
+      <version>1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <version>1.9.5</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <!-- project build -->
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>
+             org.apache.http.*;version="4.3.2",
+            *;resolution:=optional
+            </Import-Package>
+            <Embed-Dependency>httpclient,httpcore,commons-lang,commons-exec;type=!pom;inline=false</Embed-Dependency>
+            <Export-Package>
+           </Export-Package>
+          </instructions>
+          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <phase>generate-sources</phase>
+            <configuration>
+              <sources>
+                <source>target/generated-sources/sal</source>
+                <source>target/generated-sources/config</source>
+                <source>target/generated-resources/</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>yang-jmx-generator-plugin</artifactId>
+            <version>0.3.0-SNAPSHOT</version>
+          </dependency>
+          <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>${yangtools.version}</version>
+            <type>jar</type>
+          </dependency>
+        </dependencies>
+        <executions>
+          <execution>
+            <goals>
+              <goal>generate-sources</goal>
+            </goals>
+            <configuration>
+              <codeGenerators>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/config</outputBaseDir>
+                  <additionalConfiguration>
+                    <namespaceToPackage1>urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang</namespaceToPackage1>
+                  </additionalConfiguration>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/generated-sources/sal</outputBaseDir>
+                </generator>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>${project.build.directory}/site/models</outputBaseDir>
+                </generator>
+              </codeGenerators>
+              <inspectDependencies>true</inspectDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <redirectTestOutputToFile>true</redirectTestOutputToFile>
+        </configuration>
+      </plugin>
+      <plugin>
+       <groupId>org.jacoco</groupId>
+       <artifactId>jacoco-maven-plugin</artifactId>
+       <executions>
+          <execution>
+            <id>pre-unit-test</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>post-unit-test</id>
+            <phase>test</phase>
+            <goals>
+              <goal>report</goal>
+            </goals>
+            <configuration>
+              <dataFile>${sonar.jacoco.reportPath}</dataFile>
+             <includes>
+               <include>org/opendaylight/groupbasedpolicy/**/*.class</include>
+             </includes>
+            </configuration>
+          </execution>
+       </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
+