<?xml version="1.0" encoding="UTF-8"?>
<!--


    Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>

    ====================================================================
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    ====================================================================

-->

<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/maven-v4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.jclouds</groupId>
        <artifactId>jclouds-project</artifactId>
        <version>1.0-beta-9e-SNAPSHOT</version>
        <relativePath>../../project/pom.xml</relativePath>
    </parent>
    <groupId>org.jclouds.provider</groupId>
    <artifactId>elastichosts-lon-b</artifactId>
    <name>jclouds ElasticHosts BlueSquare London provider</name>
    <description>ElasticHosts implementation targeted to BlueSquare London</description>

    <properties>
        <test.elastichosts-lon-b.endpoint>https://api.lon-b.elastichosts.com</test.elastichosts-lon-b.endpoint>
        <test.elastichosts-lon-b.apiversion>1.0</test.elastichosts-lon-b.apiversion>
        <test.elastichosts-lon-b.identity>FIXME_IDENTITY</test.elastichosts-lon-b.identity>
        <test.elastichosts-lon-b.credential>FIXME_CREDENTIAL</test.elastichosts-lon-b.credential>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.jclouds.api</groupId>
            <artifactId>elasticstack</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jclouds.api</groupId>
            <artifactId>elasticstack</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jclouds</groupId>
            <artifactId>jclouds-core</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jclouds</groupId>
            <artifactId>jclouds-compute</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jclouds.driver</groupId>
            <artifactId>jclouds-log4j</artifactId>
            <version>${project.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jclouds.driver</groupId>
            <artifactId>jclouds-jsch</artifactId>
            <version>${project.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>live</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>integration</id>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                                <configuration>
                                    <systemProperties>
                                        <property>
                                            <name>test.elastichosts-lon-b.endpoint</name>
                                            <value>${test.elastichosts-lon-b.endpoint}</value>
                                        </property>
                                        <property>
                                            <name>test.elastichosts-lon-b.apiversion</name>
                                            <value>${test.elastichosts-lon-b.apiversion}</value>
                                        </property>
                                        <property>
                                            <name>test.elastichosts-lon-b.identity</name>
                                            <value>${test.elastichosts-lon-b.identity}</value>
                                        </property>
                                        <property>
                                            <name>test.elastichosts-lon-b.credential</name>
                                            <value>${test.elastichosts-lon-b.credential}</value>
                                        </property>
                                    </systemProperties>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>


</project>

