org.jclouds.abiquo.environment.InfrastructureTestEnvironment.java Source code

Java tutorial

Introduction

Here is the source code for org.jclouds.abiquo.environment.InfrastructureTestEnvironment.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
package org.jclouds.abiquo.environment;

import static com.google.common.collect.Iterables.find;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;

import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.UUID;

import org.jclouds.abiquo.AbiquoContext;
import org.jclouds.abiquo.domain.config.License;
import org.jclouds.abiquo.domain.enterprise.Enterprise;
import org.jclouds.abiquo.domain.enterprise.Limits;
import org.jclouds.abiquo.domain.enterprise.Role;
import org.jclouds.abiquo.domain.enterprise.User;
import org.jclouds.abiquo.domain.infrastructure.Datacenter;
import org.jclouds.abiquo.domain.infrastructure.Datastore;
import org.jclouds.abiquo.domain.infrastructure.Machine;
import org.jclouds.abiquo.domain.infrastructure.NetworkInterface;
import org.jclouds.abiquo.domain.infrastructure.Rack;
import org.jclouds.abiquo.domain.infrastructure.RemoteService;
import org.jclouds.abiquo.domain.infrastructure.StorageDevice;
import org.jclouds.abiquo.domain.infrastructure.StorageDeviceMetadata;
import org.jclouds.abiquo.domain.infrastructure.StoragePool;
import org.jclouds.abiquo.domain.infrastructure.Tier;
import org.jclouds.abiquo.domain.network.ExternalNetwork;
import org.jclouds.abiquo.domain.network.NetworkServiceType;
import org.jclouds.abiquo.domain.network.PublicNetwork;
import org.jclouds.abiquo.domain.network.UnmanagedNetwork;
import org.jclouds.abiquo.features.AdminApi;
import org.jclouds.abiquo.features.ConfigApi;
import org.jclouds.abiquo.features.EnterpriseApi;
import org.jclouds.abiquo.features.InfrastructureApi;
import org.jclouds.abiquo.features.services.AdministrationService;
import org.jclouds.abiquo.util.Config;

import com.abiquo.model.enumerator.HypervisorType;
import com.google.common.base.Predicate;
import com.google.common.io.LineProcessor;
import com.google.common.io.Resources;

/**
 * Test environment for infrastructure live tests.
 * 
 * @author Ignasi Barrera
 */
public class InfrastructureTestEnvironment implements TestEnvironment {
    /** The rest context. */
    public AbiquoContext context;

    // Environment data made public so tests can use them easily

    public AdministrationService administrationService;

    public InfrastructureApi infrastructureApi;

    public EnterpriseApi enterpriseApi;

    public AdminApi adminApi;

    public ConfigApi configApi;

    // Resources

    public License license;

    public Datacenter datacenter;

    public PublicNetwork publicNetwork;

    public ExternalNetwork externalNetwork;

    public UnmanagedNetwork unmanagedNetwork;

    public Iterable<RemoteService> remoteServices;

    public Rack rack;

    public Machine machine;

    public Enterprise enterprise;

    public StorageDevice storageDevice;

    public StoragePool storagePool;

    public Tier tier;

    public User user;

    public User enterpriseAdmin;

    public Role role;

    public Role anotherRole;

    public InfrastructureTestEnvironment(final AbiquoContext context) {
        super();
        this.context = context;
        this.administrationService = context.getAdministrationService();
        this.context = context;
        this.enterpriseApi = context.getApiContext().getApi().getEnterpriseApi();
        this.infrastructureApi = context.getApiContext().getApi().getInfrastructureApi();
        this.adminApi = context.getApiContext().getApi().getAdminApi();
        this.configApi = context.getApiContext().getApi().getConfigApi();
    }

    @Override
    public void setup() throws Exception {
        // Configuration
        createLicense();

        // Intrastructure
        createDatacenter();
        createRack();
        createMachine();
        createStorageDevice();
        createStoragePool();
        createPublicNetwork();

        // Enterprise
        createEnterprise();
        createRoles();
        createUsers();

        // Networking
        createExternalNetwork();
        createUnmanagedNetwork();
    }

    @Override
    public void tearDown() throws Exception {
        deleteUsers();

        deleteRole(role);
        deleteRole(anotherRole);

        deleteUnmanagedNetwork();
        deleteExternalNetwork();
        deletePublicNetwork();
        deleteStoragePool();
        deleteStorageDevice();
        deleteMachine();
        deleteRack();
        deleteDatacenter();
        deleteEnterprise();

        deleteLicense();
    }

    // Setup

    protected void createLicense() throws IOException {
        license = License.builder(context.getApiContext(), readLicense()).build();

        license.add();
        assertNotNull(license.getId());
    }

    protected void createDatacenter() {
        // Assume a monolithic install
        URI endpoint = URI.create(context.getApiContext().getProviderMetadata().getEndpoint());
        String remoteServicesAddress = endpoint.getHost();

        datacenter = Datacenter.builder(context.getApiContext()).name(randomName()).location("Honolulu")
                .remoteServices(remoteServicesAddress).build();
        datacenter.save();
        assertNotNull(datacenter.getId());

        remoteServices = datacenter.listRemoteServices();
        assertEquals(size(remoteServices), 7);
    }

    protected void createMachine() {
        String ip = Config.get("abiquo.hypervisor.address");
        HypervisorType type = HypervisorType.valueOf(Config.get("abiquo.hypervisor.type"));
        String user = Config.get("abiquo.hypervisor.user");
        String pass = Config.get("abiquo.hypervisor.pass");
        final String vswitchName = Config.get("abiquo.hypervisor.vswitch");
        final String datastoreName = Config.get("abiquo.hypervisor.datastore");

        machine = datacenter.discoverSingleMachine(ip, type, user, pass);

        NetworkServiceType nst = datacenter.defaultNetworkServiceType();
        NetworkInterface vswitch = find(machine.getNetworkInterfaces(), new Predicate<NetworkInterface>() {
            @Override
            public boolean apply(NetworkInterface input) {
                return input.getName().equals(vswitchName);
            }
        });
        vswitch.setNetworkServiceType(nst);

        Datastore datastore = find(machine.getDatastores(), new Predicate<Datastore>() {
            @Override
            public boolean apply(Datastore input) {
                return input.getName().equals(datastoreName);
            }
        });
        datastore.setEnabled(true);

        machine.setRack(rack);
        machine.save();
        assertNotNull(machine.getId());
    }

    protected void createRack() {
        rack = Rack.builder(context.getApiContext(), datacenter).name(PREFIX + "Aloha").build();
        rack.save();
        assertNotNull(rack.getId());
    }

    protected void createStorageDevice() {
        String ip = Config.get("abiquo.storage.address");
        final String type = Config.get("abiquo.storage.type");
        String user = Config.get("abiquo.storage.user");
        String pass = Config.get("abiquo.storage.pass");

        Iterable<StorageDeviceMetadata> devices = datacenter.listSupportedStorageDevices();
        StorageDeviceMetadata metadata = find(devices, new Predicate<StorageDeviceMetadata>() {
            @Override
            public boolean apply(StorageDeviceMetadata input) {
                return input.getType().equals(type);
            }
        });

        storageDevice = StorageDevice.builder(context.getApiContext(), datacenter) //
                .name(PREFIX + "Storage Device")//
                .type(type)//
                .managementIp(ip).managementPort(metadata.getDefaultManagementPort())//
                .iscsiIp(ip).iscsiPort(metadata.getDefaultIscsiPort()) //
                .username(user)//
                .password(pass) //
                .build();

        storageDevice.save();
        assertNotNull(storageDevice.getId());
    }

    protected void createStoragePool() {
        final String pool = Config.get("abiquo.storage.pool");

        storagePool = find(storageDevice.listRemoteStoragePools(), new Predicate<StoragePool>() {
            @Override
            public boolean apply(StoragePool input) {
                return input.getName().equals(pool);
            }
        });
        tier = find(datacenter.listTiers(), new Predicate<Tier>() {
            @Override
            public boolean apply(Tier input) {
                return input.getName().equals("Default Tier 1");
            }
        });

        storagePool.setTier(tier);
        storagePool.save();

        assertNotNull(storagePool.getUUID());
    }

    protected void createUsers() {
        Iterable<Role> roles = administrationService.listRoles();
        Role userRole = find(roles, role("USER"));
        Role enterpriseAdminRole = find(roles, role("ENTERPRISE_ADMIN"));

        user = User.builder(context.getApiContext(), enterprise, userRole).name(randomName(), randomName())
                .nick("jclouds").authType("ABIQUO").description(randomName()).email(randomName() + "@abiquo.com")
                .locale("en_US").password("user").build();

        user.save();
        assertNotNull(user.getId());
        assertEquals(userRole.getId(), user.getRole().getId());

        enterpriseAdmin = User.builder(context.getApiContext(), enterprise, enterpriseAdminRole)
                .name(randomName(), randomName()).nick("jclouds-admin").authType("ABIQUO").description(randomName())
                .email(randomName() + "@abiquo.com").locale("en_US").password("admin").build();

        enterpriseAdmin.save();
        assertNotNull(enterpriseAdmin.getId());
        assertEquals(enterpriseAdminRole.getId(), enterpriseAdmin.getRole().getId());
    }

    protected void createRoles() {
        role = Role.builder(context.getApiContext()).name(randomName()).blocked(false).build();
        role.save();

        anotherRole = Role.Builder.fromRole(role).build();
        anotherRole.setName("Another role");
        anotherRole.save();

        assertNotNull(role.getId());
        assertNotNull(anotherRole.getId());
    }

    protected void createEnterprise() {
        enterprise = Enterprise.builder(context.getApiContext()).name(randomName()).build();
        enterprise.save();
        assertNotNull(enterprise.getId());
        Limits limits = enterprise.allowDatacenter(datacenter);
        assertNotNull(limits);
    }

    protected void createPublicNetwork() {
        publicNetwork = PublicNetwork.builder(context.getApiContext(), datacenter).name("PublicNetwork")
                .gateway("80.80.80.1").address("80.80.80.0").mask(24).tag(5).build();
        publicNetwork.save();
        assertNotNull(publicNetwork.getId());
    }

    protected void createExternalNetwork() {
        externalNetwork = ExternalNetwork.builder(context.getApiContext(), datacenter, enterprise)
                .name("ExternalNetwork").gateway("10.0.0.1").address("10.0.0.0").mask(24).tag(7).build();
        externalNetwork.save();
        assertNotNull(externalNetwork.getId());
    }

    protected void createUnmanagedNetwork() {
        unmanagedNetwork = UnmanagedNetwork.builder(context.getApiContext(), datacenter, enterprise)
                .name("UnmanagedNetwork").gateway("10.0.1.1").address("10.0.1.0").mask(24).tag(8).build();
        unmanagedNetwork.save();
        assertNotNull(unmanagedNetwork.getId());
    }

    // Tear down

    protected void deleteUnmanagedNetwork() {
        if (unmanagedNetwork != null) {
            Integer id = unmanagedNetwork.getId();
            unmanagedNetwork.delete();
            assertNull(datacenter.getNetwork(id));
        }
    }

    protected void deleteExternalNetwork() {
        if (externalNetwork != null) {
            Integer id = externalNetwork.getId();
            externalNetwork.delete();
            assertNull(datacenter.getNetwork(id));
        }
    }

    protected void deletePublicNetwork() {
        if (publicNetwork != null) {
            Integer id = publicNetwork.getId();
            publicNetwork.delete();
            assertNull(datacenter.getNetwork(id));
        }
    }

    protected void deleteUsers() {
        if (user != null) {
            String nick = user.getNick();
            user.delete();
            // Nick is unique in an enterprise
            assertNull(find(enterprise.listUsers(), nick(nick), null));
        }

        if (enterpriseAdmin != null) {
            String nick = enterpriseAdmin.getNick();
            enterpriseAdmin.delete();
            // Nick is unique in an enterprise
            assertNull(find(enterprise.listUsers(), nick(nick), null));
        }
    }

    protected void deleteRole(final Role role) {
        if (role != null) {
            Integer roleId = role.getId();
            role.delete();
            assertNull(adminApi.getRole(roleId));
        }
    }

    protected void deleteStoragePool() {
        if (storagePool != null) {
            String idStoragePool = storagePool.getUUID();
            storagePool.delete();
            assertNull(infrastructureApi.getStoragePool(storageDevice.unwrap(), idStoragePool));
        }

    }

    protected void deleteStorageDevice() {
        if (storageDevice != null) {
            Integer idStorageDevice = storageDevice.getId();
            storageDevice.delete();
            assertNull(infrastructureApi.getStorageDevice(datacenter.unwrap(), idStorageDevice));
        }
    }

    protected void deleteMachine() {
        if (machine != null && rack != null) {
            Integer idMachine = machine.getId();
            machine.delete();
            assertNull(infrastructureApi.getMachine(rack.unwrap(), idMachine));
        }
    }

    protected void deleteRack() {
        if (rack != null && datacenter != null) {
            Integer idRack = rack.getId();
            rack.delete();
            assertNull(infrastructureApi.getRack(datacenter.unwrap(), idRack));
        }
    }

    protected void deleteDatacenter() {
        if (datacenter != null) {
            // Remove limits first
            enterprise.prohibitDatacenter(datacenter);

            Integer idDatacenter = datacenter.getId();
            datacenter.delete(); // Abiquo API will delete remote services too
            assertNull(infrastructureApi.getDatacenter(idDatacenter));
        }
    }

    protected void deleteEnterprise() {
        if (enterprise != null) {
            Integer idEnterprise = enterprise.getId();
            enterprise.delete();
            assertNull(enterpriseApi.getEnterprise(idEnterprise));
        }
    }

    protected void deleteLicense() {
        license.remove();
    }

    protected static String randomName() {
        return PREFIX + UUID.randomUUID().toString().substring(0, 12);
    }

    // Utility methods

    public static String readLicense() throws IOException {
        URL url = CloudTestEnvironment.class.getResource("/license/expired");
        return Resources.readLines(url, Charset.defaultCharset(), new LineProcessor<String>() {
            StringBuilder sb = new StringBuilder();

            @Override
            public String getResult() {
                return sb.toString();
            }

            @Override
            public boolean processLine(String line) throws IOException {
                if (!line.startsWith("#")) {
                    sb.append(line);
                }
                return true;
            }
        });
    }

    private static Predicate<Role> role(final String role) {
        return new Predicate<Role>() {
            @Override
            public boolean apply(Role input) {
                return input.getName().equals(role);
            }
        };
    }

    private static Predicate<User> nick(final String nick) {
        return new Predicate<User>() {
            @Override
            public boolean apply(User input) {
                return input.getNick().equals(nick);
            }
        };
    }
}