<?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.1.2-SNAPSHOT</version>
        <relativePath>../../project/pom.xml</relativePath>
    </parent>
    <groupId>org.jclouds.provider</groupId>
    <artifactId>serverlove-z1-man</artifactId>
    <name>jclouds Serverlove Manchester provider</name>
    <description>Serverlove implementation targeted to Manchester</description>
    <packaging>bundle</packaging>

    <properties>
        <test.serverlove-z1-man.endpoint>https://api.z1-man.serverlove.com</test.serverlove-z1-man.endpoint>
        <test.serverlove-z1-man.apiversion>1.0</test.serverlove-z1-man.apiversion>
        <test.serverlove-z1-man.identity>FIXME_IDENTITY</test.serverlove-z1-man.identity>
        <test.serverlove-z1-man.credential>FIXME_CREDENTIAL</test.serverlove-z1-man.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-sshj</artifactId>
            <version>${project.version}</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.serverlove-z1-man.endpoint</name>
                                            <value>${test.serverlove-z1-man.endpoint}</value>
                                        </property>
                                        <property>
                                            <name>test.serverlove-z1-man.apiversion</name>
                                            <value>${test.serverlove-z1-man.apiversion}</value>
                                        </property>
                                        <property>
                                            <name>test.serverlove-z1-man.identity</name>
                                            <value>${test.serverlove-z1-man.identity}</value>
                                        </property>
                                        <property>
                                            <name>test.serverlove-z1-man.credential</name>
                                            <value>${test.serverlove-z1-man.credential}</value>
                                        </property>
                                    </systemProperties>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Export-Package>org.jclouds.serverlove.*;version="${project.version}"</Export-Package>
                        <Import-Package>org.jclouds.*;version="${project.version}",*</Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
