Working with SpringSource Application Platform's provisioning repository

awilkinson

One of the main advantages of the SpringSource Application Platform is its ability to provision dependencies on an as-needed basis. The benefits of this are two-fold: it ensures that the Platform's memory footprint is as small as possible and it allows applications to be deployed without encapsulating all of their dependencies in a monolithic deployment unit, e.g. a WAR file. To take advantage of these capabilities you will require an understanding of the Platform's provisioning repository and this blog intends to provide just that.

Where is the provisioning repository and how does it work?

By default the Platform's provisioning repository can be found in the repository directory at the root of the installation:

Directory structure of the provisioning repository
As you can see, there are three main directories: bundles, installed and libraries. installed is for the Platform's internal use so we'll focus on the bundles and libraries directories here. Each contains a number of subdirectories to separate the different types of dependencies:

  • ext contains external dependencies that are provided with the Platform but are not part of the Platform itself.
  • subsystems contains all of the subsystems that comprise the Platform.
  • usr is initially empty and is intended to contain user-added dependencies, i.e. anything upon which your applications depend that is not already provided by the Platform.

The Platform searches the repository directory structure for both bundles and libraries during its initial startup. I'll talk about how this searching can be configured later on in this entry. As bundles and libraries are found within the repository, details of their symbolic names, exported packages etc. are added to an in-memory index of the repository. Upon completing the scan the in-memory indexes are cached to disk. Minimising the Platform's startup time was a priority for us during development. This caching allows the Platform to save some time during startup: it can skip the scan unless it detects that the contents of the repository have changed.

Runtime provisioning

In a plain OSGi environment a bundle's dependencies can only be satisfied by other bundles which have already been installed in the environment. For example, installing and starting a bundle that imports the org.apache.commons.dbcp package will fail if no bundle which exports that package has already been installed. This can be a real pain for users as they have to manually install all of a bundle's dependencies. Thankfully, the SpringSource Application Platform improves upon this significantly by dynamically installing dependencies on an as-needed basis.

When a deployed application is started by the Platform its bundles are installed into Equinox. The Platform then asks Equinox for a list of all of the bundles' unsatisfied dependencies and tries to satisfy them. Let's analyse this process by walking through a simple example scenario:

  1. A bundle which imports org.apache.commons.dbcp is installed by the Platform into Equinox.
  2. The Platform asks Equinox for the bundle's unsatisfied dependencies and is told that the import of org.apache.commons.dbcp cannot be satisfied.
  3. The Platform searches its index of the provisioning repository for a bundle which exports org.apache.commons.dbcp
  4. The Platform installs the bundle which exports org.apache.commons.dbcp into Equinox
  5. Having satisfied the original bundle's dependencies the Platform successfully starts the original bundle.

We hope that this will make our users' lives much easier: as long as your application's dependencies are available to the Platform you can simply deploy your application and go! There's no need to get your hands dirty with the time consuming process of manually installing all of your application's dependencies. One great thing about this process is that dependencies are only installed when they're needed. You can add as many bundles as you wish to the provisioning repository with almost no impact upon the Platform's memory footprint.

If the Platform's unable to satisfy a dependency from its repository a log message is generated that details the dependency that could not be satisfied. Armed with this information you can use the SpringSource Enterprise Bundle Repository to get hold of what you need. We'd like the repository to provide as complete a set of bundles as possible: if there's a dependency that you need and it's not available then please let us know.

Adding items to the provisioning repository

So you've downloaded a dependency or two and now you want to add them to the Platform. All you need to do is copy them to the appropriate directory in the repository. For example, a new bundle would typically be added to the repository/bundles/usr directory and a new library descriptor would typically be added to the repository/libraries/usr directory.

As described above, the Platform uses an in-memory index of its provisioning repository that's populated during startup. In addition to this, the Platform will also check that its view of the repository is up-to-date whenever an application is deployed. When you want to install an application with new dependencies simply copy the dependencies to the appropriate locations in the repository and then deploy your application. During its deployment processing, the Platform will notice that the repository has been updated and will refresh its view of it. This means that you don't need to spend time restarting the Platform every time you want to install an application with new dependencies.

Sharing the provisioning repository between installations

The locations where the Platform searches for items in the provisioning repository can be easily configured to suit your needs. For example, it's possible for multiple Platform instances to share some or all of a provisioning repository so you don't need to waste effort maintaining duplicate sets of bundles between Platform installations.

The locations which are scanned by the Platform when creating its provisioning repository can be configured in the config/platform.config file. The default configuration, which is used in the absence of any specific configuration, is:

"provisioning" : {
    "searchPaths": [
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "repository/bundles/usr/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

Any relative paths are interpreted by the Platform as being relative to its installation root, with absolute paths being supported too. The entries in the search paths within curly braces are simply wildcards, e.g. the subsystems search path repository/bundles/subsystems/{name}/{bundle}.jar will find any file with a name ending in .jar in any of the subsystems directory's immediate sub-directories.

Hopefully you can see that it's a trivial change to share some or all of a provisioning repository between Platforms. For example, to make the Platform search a directory named shared-bundles in the root of the filesystem as well as in its own subsystems and ext directories, all you need to do is add the following snippet of JSON (JavaScript Object Notation) to the platform.config file:

"provisioning" : {
    "searchPaths": [
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "/shared-bundles/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

By configuring two or more Platform installations with this configuration they can be made to share the bundles in /shared-bundles. This can easily be taken one step further by configuring all of the search paths to point to shared locations so you wouldn't need to manage a per-Platform provisioning repository at all.

What's next?

We're planning to make it simpler to run multiple instances of the Platform from the same set of binaries by providing some tooling or scripts. These will do most of the work for you, providing a sensible default configuration that you can then tweak to meet your specific needs.

We also intend to combine the power of the Platform's on-demand provisioning and the SpringSource Enterprise Bundle Repository by allowing the Platform to be configured to optionally search a remote repository when it's trying to satisfy a dependency. If a dependency is found in a remote repository the Platform will handle its download and installation automatically. Hopefully this'll make developers' lives a lot easier, especially in the initial stages of an application's development as new dependencies are being added on a regular basis.

We'd love to hear your suggestions as we work on the above-described enhancements and the Platform in general: please don't hesitate to comment on this blog entry, raise a JIRA, or post on our forums.

 

15 responses


  1. How about downloading and installing dependencies automatically during development. For example, if I use Maven 2 as a building tool, all my dependencies are automatically downloaded to my local repository. So Maven 2 local repository could be added to the default search path. WDYT?


  2. Sebastien,

    as part of the SpringSource AP Tools we will shortly release an addition to the current feature set that allows you to browse, search and download/install bundles and libraries from the repository. In combination with the classpath container that is created based on the MANIFEST.MF that should help streamlining the development process.

    Christian


  3. But I feel like you're focusing all your tooling effort on Eclipse. As far as I'm concerned, I hate Eclipse and I've been an IntelliJ fan for a very long time. Now I understand that you cannot support all IDE's on the market but at least there should be significant effort to support IDE neutral tools. How about Maven support for example? Is Maven Bundle plugin enough? Is it possible to develop a whole S2AP-targeted application using only Maven and a text editor?


  4. @Sebastian, using your Maven2 cache as a repository search path is actually a great idea and has been discussed on the SpringSource Application Platform forums. The issue is that right now the platform can\'t support arbitrarily deep search paths like Maven uses for groupIds (interestingly since Ivy has flat orgs it will work). However, Andy tells me that he\'s got ANT-style paths on the docket for this week. When he gets those in, I\'m going to blog about exactly what you\'ll need to do to use your Maven cache as a repository with the next release.

    There\'s also a JIRA issue open for it: http://issuetracker.springsource.com/browse/PLATFORM-35


  5. What is the availability of http://www.springsource.com/repository ?
    e.g. 95% of the time, 99% of the time, 99.9% of the time.


  6. @Joseph, your question actually has two answers.

    The first is in relation to the web-app that runs at http://www.springsource.com/repository. This application is simply a searching front end on the actual repositories themselves. It runs on the platform (and was actually the first production system on the platform) and on one of our many servers managed by Contegix. As such, there is no guarantee about it's availability but we expect it to be pretty good what with it running on our products. :)

    The second answer is more interesting and more to what I think you're actually asking and that's about the actual repositories hosted at http://repository.springsource.com. These repositories are currently hosted on Amazon S3 which advertises an SLA of 99.9% uptime. Please note that SpringSource is not making any uptime guarantees but rather depending on our providers to give you an idea of what to expect. At this time we are solely dependent on S3, but have plans in the near future to have a hot backup based on another system with transparent fail-over.

    I would point out that if you are really worried about access to these repositories (and I strongly encourage you to be if you're building business-critical software) you should maintain your own corporate repositories inside of your network. Both Ivy and Maven support this already and since the SpringSource Enterprise Bundle Repository are standard implementations of both it should work transparently.


  7. Would it be possible to provide an example of how to configure either ivy or maven to provide a backup?

    Having done a little experimentation it seems both ivy and maven cache bundles that you have downloaded in the past. However these are bundles you explicitly referenced. For enterprise deployments it seems more appropriate to cache all bundles locally and then update on demand based on internal rules.


  8. Hi,

    I don't have permission to view the JIRA you reference http://issuetracker.springsource.com/browse/PLATFORM-35

    Thanks,

    Derek

    On May 12, 2008 at 3:21 am, Ben Hale said:

    @Sebastian, using your Maven2 cache as a repository search path is actually a great idea and has been discussed on the SpringSource Application Platform forums. The issue is that right now the platform can\'t support arbitrarily deep search paths like Maven uses for groupIds (interestingly since Ivy has flat orgs it will work). However, Andy tells me that he\'s got ANT-style paths on the docket for this week. When he gets those in, I\'m going to blog about exactly what you\'ll need to do to use your Maven cache as a repository with the next release.

    There\'s also a JIRA issue open for it: http://issuetracker.springsource.com/browse/PLATFORM-35


  9. Hi Derek,

    You have to sign-up: http://issuetracker.springsource.com/secure/Signup!default.jspa

    Regards,
    Andy


  10. Hmmm I can't read that page either, I've signed up to Jira and logged in but I get the following message when I follow the link (On my preferences page it says I am a member of jira-users):

    PERMISSION VIOLATION
    ERROR

    It seems that you have tried to perform an operation which you are not permitted to perform.

    If you think this message is wrong, please consult your administrators about getting the necessary permissions.


  11. Out of interest I started to dig around to figure out how to do a local mirror of content from the spring repository using Ivy.

    However it seems the spring repository is not enabled to allow ivy to do wild card searches which I think most enterprises would need. The alternative is specifically listing every version which is used in the enterprise but this would get unmanageable very quickly.

    What I did (possibly some daft mistake):

    build.xml:

    Relatively new to Ivy but docs suggest this should this work?

    Adding some debug lead me to the fact that the spring repository does not allow directory browsing on folders which ivy needs to do wild card matching. Compare the output from the maven repository used by the ivy biblio resolver and spring:

    http://repo1.maven.org/maven2/
    http://repository.springsource.com/ivy/bundles/release/

    Is this just a case of overzealous admins turning off directory browsing by default?


  12. Sorry previous post mangled, need to escape xml characters!!

    Does this work >test<


  13. Great, ok escaped this time:

    <ivysettings>
    <settings defaultCache=".ivycache" defaultResolver="spring" checkUpToDate="false" />
    <property name="repository.dir" value="/opt/ivy-repository"/>
    <resolvers>
    <chain name="spring">
    <url name="com.springsource.repository.bundles.release">
    <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
    <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
    </url>
    <url name="com.springsource.repository.bundles.external">
    <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
    <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" />
    </url>
    </chain>
    <filesystem name="internal">
    <ivy pattern="${repository.dir}/[module]/ivy-[revision].xml" />
    <artifact pattern="${repository.dir}/[module]/[artifact]-[revision].[ext]" />
    </filesystem>
    </resolvers>
    </ivysettings>

    build.xml

    <target name="install" description="–> install dependencies with ivy">
    <ivy-install from="spring" to="internal" organisation="org.springframework" module="org.springframework.*" revision="*" matcher="glob" />
    </target>


  14. However it seems the spring repository is not enabled to allow ivy to do wild card searches which I think most enterprises would need. The alternative is specifically listing every version which is used in the enterprise but this would get unmanageable very quickly.

    Is this just a case of overzealous admins turning off directory browsing by default?

    Actually no it's not a case of overzealous admins :) In fact, it's a byproduct of the fact we back the repository with Amazon S3 (http://s3.amazonaws.com). Since S3 is a REST service with a flat namespace there's no actual directory structure to look for. It turns out that with the judicious use of slashes it can appear to be a directory structure when it's not actually.

    In general, it's never recommended that you try and replicate large swaths of these repositories internally. I'll point at a Maven tool called maven-proxy (http://maven-proxy.codehaus.org/) for the moment but the same thing applies to Ivy. To quote:

    It is quicker than mirroring the entire of ibiblio (not to consider the waste)

    What you'd really want to do is have a proxy so that when you requested a specific type it'd try and service that from a local cache. If it couldn't it would then try and download from the primary repository and cache locally for all future requests. A standard HTTP proxy can do this, but obviously a dedicated proxy like maven-proxy is ideal.


  15. On May 14, 2008 at 5:21 am, David Savage said:

    Hmmm I can't read that page either, I've signed up to Jira and logged in but I get the following message when I follow the link (On my preferences page it says I am a member of jira-users)

    I've added you to the Platform beta users group, which should give you the access you need. Let me know if it doesn't do the trick.

2 trackbacks

Leave a Reply

Quote selected text

buy viagra
generic viagra
buy viagra online
cheap viagra
free viagra
viagra prescription
viagra online stores
viagra online
viagra side effects
viagra for women
order viagra
herbal viagra
viagra for sale
discount viagra
viagra sale
viagra uk
natural viagra
viagra without prescription
buy cheap viagra
female viagra
cheapest viagra prices
buy generic viagra
cheap generic viagra
free viagra sample
viagra canada
try viagra for free
viagra pills
side effects of viagra
order viagra online
viagra 6 free samples
viagra alternative
viagra on line
cialis vs viagra
purchase viagra online
can viagra causes legs to ache
what is generic viagra
buying viagra online
buy viagra meds online
viagra no prescription
buy viagra online 35008
viagra soft tabs
viagra dosage
low cost viagra
buy viagra cheap
viagra uterine thickness
viagra alternatives
viagra vs cialis
viagra samples
online viagra
viagra over the counter
viagra from india
viagra lawyers
buy viagra now
viagra stories
buy viagra on line
viagra attorneys
viagra mexico
viagra free trial
canadian viagra
viagra prices
buy viagra australia
viagra covered by insurance
viagra substitute
splitting viagra
viagra patent
free sample prescription for viagra
viagra oral jelly
viagra reviews
viagra jokes
womens viagra
viagra pharmacy
viagra 100mg
cialis levia and viagra
legal viagra
fda on viagra
over the counter viagra
viagra pill
viagra generic
generic name of viagra
viagra overnight
buying viagra
cheap herbal viagra
cheapest viagra
viagra blood pressure
viagra cheap
viagra sample
viagra overdose
prescription for viagra
effects of viagra on women
generic viagra india
pfizer viagra
mail order viagra
viagra buy
viagra and cialis
u 3312 viagra cialis
cialis viagra
what does viagra do to females
ladies viagra
buy online viagra
buy viagra per pill
free sites computer search viagra find
on viagra
viagra women
online viagra store
cuddle chemical viagra boosts performance
viagra patent pfizer
viagra boosts chemical cuddle performance
viagra facts
viagra from usa
bad side effects of viagra
buy viagra order viagra
free viagra samples
viagra online cheap
viagra fuerteventura market
free sample viagra
no prescription viagra
best price for generic viagra
viagra and alcohol
viagra free pills
what is viagra
viagra price
viagra cialis
order 50mg viagra
viagra side affects
viagra potenzmittel
impotence viagra
can women take viagra
viagra cialis levitra
buy cheap viagra online uk
viagra experiences
viagra results
viagra low cost
order cheap viagra fas
viagra versus cialis
non prescription viagra
free trial of viagra
purchase viagra
viagra effekter biverkningar
herbal viagra australia
viagra generic brand
buy viagra ups
low cost viagra online
viagra 50 mg
viagra testosterone
recreational viagra use
viagra viagra
viagra times
where to buy viagra
buy viagra onli
generic viagra mexico
viagra commercial
viagra boosts chemical cuddle
viagra attorney ohio
gernic viagra
buy viagra pill
uk viagra sales
viagra online uk
mexico pharmacy generic viagra
herbal v viagra study
viagra and discovery
drinking and viagra
songs about viagra
viagra natural
viagra effects on women
viagra fuerteventura
generic viagra overnight
viagra forum
viagra sverige
death by viagra
cheapest viagra in uk
mexican viagra
viagra sales
uprima cialis viagra
viagra faq
discounted viagra
buy viagra online australia
generic viagra pill
buy viagra uk
side effects from viagra
viagra no prior prescription
viagra cartoon
viagra lawyer columbus
viagra blindness
buy viagra online inu
viagra effects
viagra as ergogenic aid
find viagra free computer sites
cost of viagra
viagra info
best natural viagra
women viagra
guaranteed cheapest viagra
viagra sex
get viagra
viagra lawyer ohio
viagra attorney columbus
viagra jelly
buy viagra online 35008 buy
viagra free sites computer find
free samples of viagra
cialis super viagra
canada viagra
buy viagra australian
2007 viagra hmo
effects of viagra
is there a female viagra
viagra substitutes
dangers of viagra
cheap viagra online
viagra or cealis
natural alternative to viagra
bought viagra fuerteventura
pharmacy viagra
videos viagra
find sites computer shop viagra free
acheter du viagra
cialis v s viagra
viagra sales uk
buy sublingual viagra online
viagra free sample
fake viagra
viagra for woman
does viagra work
order discount viagra
viagra st
viagra for cheap
cialis new viagra
best herbal viagra
what does viagra do
viagra next day delivery
buy viagra without prescription
viagra use
viagra litigation
free viagra online
india viagra
buy australian viagra
free viagra samples before buying
discount viagra pills
t 84 viagra
viagra warning
viagra instructions
viagra from canada
viagra free sites computer find search
viagra find sites computer search
sublingual viagra
impotence and viagra
viagra max complaints
vicodin viagra
viagra beneficial side effects
viagra and nitrous oxide
viagra testimonials
apcalis levitra viagra
viagra for men
find viagra free sites computer
cialis versus viagra
discount viagra online
free viagra without prescription
generic viagra overnight delivery
viagra cialis generica
find viagra free sites edinburgh
find viagra free sites
viagra tolerance
generic viagra online
viagra discounts
viagra online no rx comparison
getting viagra in the philippines
money order viagra
viagra australia
viagra find free computer sites pages
viagra price strategy
viagra discount
can viagra cause restless leg syndrome
women and viagra
find sites computer shop viagra search
buy viagra in canada
rate generic viagra
free viagra canadian pharmacy
viagra retail discount
viagra online overnight delivery
soft viagra
viagra online no rx
dog ate viagra tablet any danger
generic viagra cheap
compare viagra
viagra suppositories ivf
viagra vs levitra
qry viagra
buy viagra in uk
discount generic viagra
viagra dosing
viagra illegal phillipines
viagra bon marche
viagra free samples
viagra 50mg
generisch viagra
buy discount viagra online
detumescence priapism viagra
q viagra meta
harm of expired viagra
viagra news edinburgh comment moo
viagra ad
viagra experience
viagra sideffects
viagra type drugs
viagra works
viagra online shop in uk
viagra paypal
viagra pay with paypal
buying viagra online uk
rapid tabs viagra
is viagra from india safe
cheapest price for viagra
online ed drugs viagra samples package
viagra shelf life
get viagra drug online
diabetes and viagra
viagra overnight delivery
viagra song
viagra sex domination
female viagra cream
viagra purchase online
what is better viagra or levitra
non presciption viagra replacements
adverse side effects of viagra
viagra logo
discount priced viagra
cheap viagra nz
womens viagra
women does viagra work
viagra ingredients
does viagra really work
viagra uk 32
is viagra safe for women
indian viagra
viagra free sites computer find online
mixing vicodin viagra
cialis or viagra
zenerx natural viagra
viagra effect women
edinburgh uk news viagra site search
canadian generic viagra
prescription free viagra
viagra buy online
viagra herbal substitute
pleasure viagra
where to buy viagra on line
viagra dosage recomendation
buy viagra by pill
free sample of viagra
women taking viagra
viagra purchase
where can i get free viagra
arlene farmer viagra
q viagra search
oyster viagra
ge n eric viagra
viagra federal express
viagra sildenafil citrate information
viagra ads funny
viagra levitra cialis pharmacist perscription drugs
counterfeit viagra
search viagra free sites find computer
mode demploi viagra
discount viagra in the usa
viagra pics
lialda viagra
wild horses viva viagra
viagra equivalent
viagra directions
viagra joke
natural viagra substitutes
viagra generico impotencia
garlic better than viagra
query viagra
effects of viagra mixed with cocaine
buy cheap viagra online
viagra does not work
viagra from canada legitimate
ending viagra use
counterfeit viagra abu dhabi
where to buy viagra online
viagra manufacturer
viagra side effects dangers
viagra users discussion
generic price viagra
buy taladafil viagra
viagra cialis delivery
viagra recreational
buy viagra in bangkok
generic viagra soft tab fast
viagra online no prescription
viagra covered california hmo
viagra forums
viagra 50mg sverige
viagra boosts post cuddle chemical
teenney transplant and viagra
lowest prices viagra
viagra picture funny
viagra for pulmonary hypertension
colleagues viagra
search viagra pages computer find
viagra boots
what to know about viagra jelly
cheap viagra overnight
song viagra in the water
viagra for doggies
viagra free sites computer edinburgh find
q viagra kgs 0 kls 0
viagra cheap no prescription
find search viagra edinburgh free
find viagra free sites edinburgh computer
viagra next day shipment
viagra free trials
free sample viagra vs cialis
online viagra prescriptions
dosage viagra
pn 1 viagra
mail order viagra in uk
viagra information
viagra mail order uk
viagra tutorial
viagra sildenafil citrate
compare cialis and viagra
woman taking viagra
viagra supplement
compare cialis viagra levitra
best price for viagra
niacin works like viagra
from generic india viagra
viagra ads
phentermine viagra
cheapest generic viagra
free samples viagra
newsletter viagra
ordering viagra
cheap generic viagra no script
viagra generique
health net viagra non-formulary cost
viagra on line uk
cialis and viagra together
order pfizer viagra with mastercard
atenolol viagra
buy viagra online without prescription
womans viagra
compare cilalis and viagra
herbal viagra uk
viagra gel
free herbal viagra samples
disp no 19105 viagra
viagra and women
viagra on-line
viagra coverage california
viagra news edinburgh comment search
viagra etc
otc viagra
cialis viagra combo
viagra use of
viagra product strategy
affects of viagra
viagra eyes
viagra and cocaine
viagra best prices
generic viagra canada
viagra cost
mail order for viagra tablets
viagra mail order
viagra edinburgh find search free
generic sample viagra
find viagra free sites search
viagra comparison prices online
viagra jet lag
negative side affects of viagra
habituate viagra
viagra cartoons
semen turns yellow viagra
find viagra free sites computer edinburgh
viagra free sites find computer
cialis viagra sampler
c-ring viagra
next dat delivery generic viagra
gay viagra stories
viagra pay by e-check
viagra price comparison
take cialis and viagra together
overnight viagra
free sample pack of viagra
q viagra
viagra penis size
viagra free sites computer edinburgh
herbal viagra replacements
viagra ejaculation
multiple acts viagra
free viagra sample viagra sample
salis vs viagra
find viagra free sites edinburgh search
q viagra btng search meta
viagra without a prescription
health net viagra
mexico viagra
can i take viagra
edinburgh uk viagra news comment moo
viagra oral sex
viagra usage
viagra wholesale
viagra urethral
find search edinburgh viagra phentermine
buy cheap viagra online u
viagra pictures
tia viagra
viagra in mexico
viagra not working