Sure, I figured I would test with a simple example so I can make sure I'm
not doing anything stupid (I NEEEEEVER do anything stupid).  If I created a
features xml like this:

----------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<features name="${project.artifactId}-${project.version}" xmlns="
http://karaf.apache.org/xmlns/features/v1.5.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0
http://karaf.apache.org/xmlns/features/v1.5.0";>

  <feature name="test1" version="${project.version}">
    <requirement>test.env;filter:="(env=np)"</requirement>
  </feature>

  <feature name="test2" version="${project.version}">
    <feature dependency="true">test3</feature>
  </feature>

  <feature name="test3" version="${project.version}">
    <capability>test.env;env=np</capability>
  </feature>
</features>
---------------------------------------------

It works as expected.  If I do this:

--------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<features name="${project.artifactId}-${project.version}" xmlns="
http://karaf.apache.org/xmlns/features/v1.5.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0
http://karaf.apache.org/xmlns/features/v1.5.0";>


<repository>mvn:${project.groupId}/test23/${project.version}/xml/features</repository>

  <feature name="test1" version="${project.version}">
    <requirement>test.env;filter:="(env=np)"</requirement>
  </feature>
</features>
--------------------------------------------------------------------------
and
--------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<features name="${project.artifactId}-${project.version}" xmlns="
http://karaf.apache.org/xmlns/features/v1.5.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
          xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.5.0
http://karaf.apache.org/xmlns/features/v1.5.0";>

  <feature name="test2" version="${project.version}">
    <feature dependency="true">test3</feature>
  </feature>

  <feature name="test3" version="${project.version}">
    <capability>test.env;env=np</capability>
  </feature>
</features>
--------------------------------------------------------------------------

Then the requirement can't be resolved.  I can however install the test2
feature so I know the test23 repo was added.  What is curious to me though,
is why if the above doesn't work, why I don't get a failure when I verify
the features for the above.  I figured by referencing test2 (which lives in
the other features.xml in the second case), it was discover that it
provides the required capability.

In reading the Karaf docs again (which I appreciate because they are quite
good and I know docs are time consuming and a pain to write :)) I'm
wondering if I have to install all the features and bundles in the other
features xml but not auto-start them (I think I saw an option for that)?

Thanks!
Ryan

On Thu, Jun 20, 2019 at 1:17 AM Jean-Baptiste Onofré <[email protected]>
wrote:

> Hi Ryan,
>
> Do you mean you are using resources repository (define in
> etc/org.apache.karaf.features.cfg) ?
>
> A features repository can also contains capability and requirements.
>
> To be able to find the req/cap, the resolver needs to know the cap/req.
> If they are splitted in different repositories, then you have first to
> "load" the repositories to be visible by the resolver. Else the resolver
> won't know "where" the cap is provided.
>
> Cave can help in two ways:
> 1. the features gateway is able to gather several features repositories
> in a meta-global-one.
> 2. Cave can serve as resources repositories backend
>
> Can you share your test case in order for me to take a look ?
>
> Regards
> JB
>
> On 19/06/2019 23:18, Ryan Moquin wrote:
> > Hi JB,
> >
> > I decided to try the req/cap again.  The reason it didn't work for me
> > before apparently is because a capability satisfying a requirement isn't
> > detected by the resolver if they are in different feature repositories
> > (which is the same as a feature XML I believe).  I tried to reference a
> > feature as a dependency in a different repository but it wouldn't work
> > unless I had it in the same repository.
> >
> > I'm not sure if that's by design or if something like Cave would be
> > needed for that scenario.  Otherwise I need to rethink how I handle the
> > requirement and capabilities.  I am trying to keep separate feature
> > repositories because if I aggregate, then it takes longer to create the
> > updated aggregate feature xml.
> >
> > Ryan
> >
> > On Sat, Jun 15, 2019, 12:01 PM Jean-Baptiste Onofré <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> >     Hi Ryan,
> >
> >     I will provide a more complete answer (I don't have time right now),
> but
> >     you can take a look on the way we use cap/req in Pax Web (for the
> HTTP
> >     provider capability).
> >
> >     Basically, the cap/req are global in the feature resolver,
> considering
> >     the req/cap at feature level, but also at bundle level.
> >
> >     Regards
> >     JB
> >
> >     On 15/06/2019 16:28, Ryan Moquin wrote:
> >     > I apologize if this is a stupid question. I've been trying to
> >     understand
> >     > how to leverage capabilities and requirements in a way to allow
> >     defining
> >     > the provisioning of a system by specifying requirements in a
> feature.
> >     >
> >     > I've read through the posts on the mailing list about it, the docs
> and
> >     > the karaf features.xml but haven't found the information I am
> looking
> >     > for.  I also tried some experiments with a bundle providing a
> >     capability
> >     > and a feature requiring it but it didn't seem to work.  I am
> wondering
> >     > if I am just over thinking or over complicating it in my head.
> >     Here are
> >     > the questions:
> >     >
> >     > 1.  When a feature specifies a requirement, what is the "scope" of
> >     > resolution used by the feature resolver?  Meaning, does it only
> pick
> >     > from features specified within that feature with dependency=true
> >     > specified?  Or from any feature defined in the features.xml and any
> >     > feature repository defined that provides a satisfying capability?
> >     >
> >     > 2.  Can you specify a requirement in a feature for a requirement
> >     > provided by a bundle?
> >     >
> >     > 3.  If a bundle or feature provides a capability, but you don't
> >     specify
> >     > you require it.  Does it always get considered for installation if
> >     it's
> >     > in a feature that doesn't have dependency=true?
> >     >
> >     > Part of this is because I still can't understand when to use
> >     > dependency=true for a feature.  I am primarily talking about custom
> >     > capabilities and requirements I make up myself for a system to pull
> >     > things in.
> >     >
> >     > Not sure if the above questions fully make sense, having a hard
> time
> >     > articulating exactly what I am trying to figure out.
> >     >
> >     > Thanks for any help!
> >     >
> >     > Ryan
> >
> >     --
> >     Jean-Baptiste Onofré
> >     [email protected] <mailto:[email protected]>
> >     http://blog.nanthrax.net
> >     Talend - http://www.talend.com
> >
>
> --
> Jean-Baptiste Onofré
> [email protected]
> http://blog.nanthrax.net
> Talend - http://www.talend.com
>

Reply via email to