com.abiquo.server.core.common.EnvironmentGenerator.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.server.core.common.EnvironmentGenerator.java

Source

/**
 * Abiquo community edition
 * cloud management application for hybrid clouds
 * Copyright (C) 2008-2010 - Abiquo Holdings S.L.
 *
 * This application is free software; you can redistribute it and/or
 * modify it under the terms of the GNU LESSER GENERAL PUBLIC
 * LICENSE as published by the Free Software Foundation under
 * version 3 of the License
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * LESSER GENERAL PUBLIC LICENSE v.3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */
package com.abiquo.server.core.common;

import java.util.ArrayList;
import java.util.List;

import com.abiquo.model.enumerator.MachineState;
import com.abiquo.model.enumerator.RemoteServiceType;
import com.abiquo.model.enumerator.StorageTechnologyType;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplateGenerator;
import com.abiquo.server.core.cloud.Hypervisor;
import com.abiquo.server.core.cloud.HypervisorGenerator;
import com.abiquo.server.core.cloud.NodeVirtualImage;
import com.abiquo.server.core.cloud.NodeVirtualImageGenerator;
import com.abiquo.server.core.cloud.VirtualAppliance;
import com.abiquo.server.core.cloud.VirtualApplianceGenerator;
import com.abiquo.server.core.cloud.VirtualDatacenter;
import com.abiquo.server.core.cloud.VirtualDatacenterGenerator;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.cloud.VirtualMachineGenerator;
import com.abiquo.server.core.cloud.VirtualMachineState;
import com.abiquo.server.core.enterprise.DatacenterLimits;
import com.abiquo.server.core.enterprise.Enterprise;
import com.abiquo.server.core.enterprise.EnterpriseGenerator;
import com.abiquo.server.core.enterprise.Privilege;
import com.abiquo.server.core.enterprise.Role;
import com.abiquo.server.core.enterprise.RoleGenerator;
import com.abiquo.server.core.enterprise.User;
import com.abiquo.server.core.enterprise.UserGenerator;
import com.abiquo.server.core.infrastructure.Datacenter;
import com.abiquo.server.core.infrastructure.DatacenterGenerator;
import com.abiquo.server.core.infrastructure.DatacenterLimitsGenerator;
import com.abiquo.server.core.infrastructure.Datastore;
import com.abiquo.server.core.infrastructure.DatastoreGenerator;
import com.abiquo.server.core.infrastructure.Machine;
import com.abiquo.server.core.infrastructure.RemoteService;
import com.abiquo.server.core.infrastructure.RemoteServiceGenerator;
import com.abiquo.server.core.infrastructure.network.IpPoolManagement;
import com.abiquo.server.core.infrastructure.network.IpPoolManagementGenerator;
import com.abiquo.server.core.infrastructure.network.VLANNetwork;
import com.abiquo.server.core.infrastructure.network.VLANNetworkGenerator;
import com.abiquo.server.core.infrastructure.storage.DiskManagement;
import com.abiquo.server.core.infrastructure.storage.DiskManagementGenerator;
import com.abiquo.server.core.infrastructure.storage.InitiatorMapping;
import com.abiquo.server.core.infrastructure.storage.InitiatorMappingGenerator;
import com.abiquo.server.core.infrastructure.storage.StorageDevice;
import com.abiquo.server.core.infrastructure.storage.StorageDeviceGenerator;
import com.abiquo.server.core.infrastructure.storage.StoragePool;
import com.abiquo.server.core.infrastructure.storage.StoragePoolGenerator;
import com.abiquo.server.core.infrastructure.storage.VolumeManagement;
import com.abiquo.server.core.infrastructure.storage.VolumeManagementGenerator;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.softwarementors.commons.test.SeedGenerator;

/**
 * Utility class to generate complex test environments.
 * 
 * @author Ignasi Barrera
 */
public class EnvironmentGenerator {
    public static final String SYSADMIN = "sysadmin";

    private final DatacenterGenerator datacenterGenerator;

    private final DatacenterLimitsGenerator datacenterLimitsGenerator;

    private final DatastoreGenerator datastoreGenerator;

    private final StorageDeviceGenerator deviceGenerator;

    private final DiskManagementGenerator diskGenerator;

    private final EnterpriseGenerator enterpriseGenerator;

    /** The entities of the generated environment. */
    private final List<Object> entities;

    private final HypervisorGenerator hypervisorGenerator;

    private final InitiatorMappingGenerator initiatorMappingGenerator;

    private final IpPoolManagementGenerator ipGenerator;

    private final NodeVirtualImageGenerator nodeVirtualImageGenerator;

    private final VirtualMachineGenerator virtualMachineGenerator;

    private final VirtualMachineTemplateGenerator virtualMachineTemplateGenerator;

    private final StoragePoolGenerator poolGenerator;

    private final RemoteServiceGenerator remoteServiceGenerator;

    private final RoleGenerator roleGenerator;

    private final UserGenerator userGenerator;

    private final VirtualApplianceGenerator vappGenerator;

    private final VirtualDatacenterGenerator vdcGenerator;

    private final VLANNetworkGenerator vlanGenerator;

    private final VolumeManagementGenerator volumeGenerator;

    public EnvironmentGenerator(final SeedGenerator seed) {
        super();
        enterpriseGenerator = new EnterpriseGenerator(seed);
        roleGenerator = new RoleGenerator(seed);
        userGenerator = new UserGenerator(seed);
        datacenterGenerator = new DatacenterGenerator(seed);
        datacenterLimitsGenerator = new DatacenterLimitsGenerator(seed);
        remoteServiceGenerator = new RemoteServiceGenerator(seed);
        deviceGenerator = new StorageDeviceGenerator(seed);
        poolGenerator = new StoragePoolGenerator(seed);
        vdcGenerator = new VirtualDatacenterGenerator(seed);
        vappGenerator = new VirtualApplianceGenerator(seed);
        nodeVirtualImageGenerator = new NodeVirtualImageGenerator(seed);
        virtualMachineGenerator = new VirtualMachineGenerator(seed);
        virtualMachineTemplateGenerator = new VirtualMachineTemplateGenerator(seed);
        volumeGenerator = new VolumeManagementGenerator(seed);
        vlanGenerator = new VLANNetworkGenerator(seed);
        hypervisorGenerator = new HypervisorGenerator(seed);
        datastoreGenerator = new DatastoreGenerator(seed);
        initiatorMappingGenerator = new InitiatorMappingGenerator(seed);
        diskGenerator = new DiskManagementGenerator(seed);
        ipGenerator = new IpPoolManagementGenerator(seed);
        entities = new ArrayList<Object>();
    }

    /**
     * Add the given entity to the environment.
     * 
     * @param entity The entity to add.
     */
    public void add(final Object entity) {
        entities.add(entity);
    }

    /**
     * Generates and adds the following entities to the environment. The virtual machine is
     * <code>VirtualMachine.MANAGED</code>.
     * <ol>
     * <li>A virtual appliance in the generated virtual datacenter</li>
     * <li>An image repository in the given datacenter and enterprise</li>
     * <li>An image category</li>
     * <li>A virtual image in the generated repository and category</li>
     * <li>A NodeVirtualImage linking the generated image with the generated appliance</li>
     * <li>A virtual machine linked to the generated NodeVirtualImage, belonging to the user in the
     * environment, and allocated to the generated hypervisor and datastore</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateAllocatedVirtualMachine() {
        // Generated the not allocated virtual machine first
        generateNotAllocatedVirtualMachine();

        // Entities that should be already added to the environment
        VirtualMachine vm = get(VirtualMachine.class);
        Hypervisor hypervisor = get(Hypervisor.class);
        Datastore datastore = get(Datastore.class);

        // Allocate the virtual machine
        vm.setHypervisor(hypervisor);
        vm.setDatastore(datastore);
        vm.setState(VirtualMachineState.OFF); // Allocated and powered off
        vm.setIdType(VirtualMachine.MANAGED);
        return getEnvironment();
    }

    /**
     * <b>This method <i>must</i> preceed {@link #generateEnterprise()} and
     * {@link #generateInfrastructure()} {@link #generateVirtualDatacenter()} </b><br>
     * Generates and adds the following entities to the environment.<br>
     * A managed virtual machine must be assigned to a hypervisor.
     * <ol>
     * <li>A virtual appliance in the generated virtual datacenter</li>
     * <li>An image repository in the given datacenter and enterprise</li>
     * <li>An image category</li>
     * <li>A virtual image in the generated repository and category</li>
     * <li>A NodeVirtualImage linking the generated image with the generated appliance</li>
     * <li>A virtual machine linked to the generated NodeVirtualImage, belonging to the user in the
     * environment, and allocated to the generated hypervisor and datastore</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateNotManagedAllocatedVirtualMachine() {
        // Entities that should be already added to the environment
        Enterprise enterprise = get(Enterprise.class);
        Hypervisor hypervisor = get(Hypervisor.class);
        Datastore datastore = get(Datastore.class);
        User user = get(User.class);
        VirtualDatacenter vdc = get(VirtualDatacenter.class);
        VirtualAppliance vapp = vappGenerator.createInstance(vdc);
        NodeVirtualImage node = nodeVirtualImageGenerator.createInstance(vapp, user);
        VirtualMachine vm = virtualMachineGenerator.createInstance(node.getVirtualImage(), enterprise, hypervisor,
                datastore, user, "vmNotManaged");

        // Allocate the virtual machine
        vm.setHypervisor(hypervisor);
        vm.setDatastore(datastore);
        vm.setIdType(VirtualMachine.NOT_MANAGED);
        vm.setState(VirtualMachineState.OFF); // Allocated and powered off

        add(vapp);
        add(node.getVirtualImage().getRepository());
        add(node.getVirtualImage().getCategory());
        add(node.getVirtualImage());
        add(node);
        add(vm);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entitities to the environment.
     * <ol>
     * <li>A disk in the generated virtual datacenter and storage pool</li>
     * <li>Its Rasd</li>
     * </ol>
     * 
     * @return
     */
    public List<Object> generateDisk() {
        VirtualDatacenter vdc = get(VirtualDatacenter.class);

        DiskManagement disk = diskGenerator.createInstance(vdc);

        add(disk.getRasd());
        add(disk);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment:
     * <ol>
     * <li>An enterprise</li>
     * <li>Cloud admin related Privileges</li>
     * <li>Cloud admin role</li>
     * <li>Cloud admin user in the generated enterprise</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateEnterprise() {
        Enterprise ent = enterpriseGenerator.createInstanceNoLimits();
        Role role = roleGenerator.createInstanceSysAdmin();
        User user = userGenerator.createInstance(ent, role, SYSADMIN, SYSADMIN);

        add(ent);
        for (Privilege p : role.getPrivileges()) {
            add(p);
        }
        add(role);
        add(user);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment:
     * <ol>
     * <li>An enterprise</li>
     * <li>The given user related Privileges</li>
     * <li>The given user role</li>
     * <li>The given user user in the generated enterprise</li>
     * </ol>
     * 
     * @param user The given user to create
     * @return The environment entities.
     */
    public List<Object> generateEnterprise(final User user) {
        Enterprise ent = enterpriseGenerator.createInstanceNoLimits();
        user.setEnterprise(ent);

        add(ent);
        for (Privilege p : user.getRole().getPrivileges()) {
            add(p);
        }
        add(user.getRole());
        add(user);

        return getEnvironment();
    }

    /**
     * <b>This method <i>must</i> be preceeded by {@link #generateEnterprise()}</b><br>
     * Generates and adds the following entities to the environment:
     * <ol>
     * <li>A datacenter (the given enterprise is allowed to use it)</li>
     * <li>The AM remote service</li>
     * <li>The SSM remote service</li>
     * <li>A rack in the generated datacenter</li>
     * <li>A physical machine in the generated rack</li>
     * <li>A datastore in the physical machine</li>
     * <li>A hypervisor for the physical machine</li>
     * <li>A storage device in the generated datacenter</li>
     * <li>A storage tier in the generated datacenter</li>
     * <li>A storage pool in the generated tier and device</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateInfrastructure() {
        // Entities that should be already added to the environment
        Enterprise enterprise = get(Enterprise.class);

        // Datacenter
        Datacenter dc = datacenterGenerator.createUniqueInstance();
        DatacenterLimits dcLimits = datacenterLimitsGenerator.createInstance(enterprise, dc);
        RemoteService am = remoteServiceGenerator.createInstance(RemoteServiceType.APPLIANCE_MANAGER, dc);
        RemoteService ssm = remoteServiceGenerator.createInstance(RemoteServiceType.STORAGE_SYSTEM_MONITOR, dc);
        RemoteService dhcp = remoteServiceGenerator.createInstance(RemoteServiceType.DHCP_SERVICE, dc);
        RemoteService vsm = remoteServiceGenerator.createInstance(RemoteServiceType.VIRTUAL_SYSTEM_MONITOR, dc);

        // Compute
        Hypervisor hypervisor = hypervisorGenerator.createInstance(dc);
        Datastore datastore = datastoreGenerator.createInstance(hypervisor.getMachine());

        // Storage
        StorageDevice device = deviceGenerator.createInstance(dc);
        device.setStorageTechnology(StorageTechnologyType.NEXENTA);
        StoragePool pool = poolGenerator.createInstance(device);

        Machine machine = hypervisor.getMachine();
        machine.setState(MachineState.MANAGED);
        machine.setVirtualCpuCores(Integer.MAX_VALUE);
        machine.setVirtualRamInMb(Integer.MAX_VALUE);
        machine.setVirtualCpusUsed(0);
        machine.setVirtualRamUsedInMb(0);

        add(dc);
        add(dcLimits);
        add(am);
        add(ssm);
        add(dhcp);
        add(vsm);

        add(hypervisor.getMachine().getRack());
        add(hypervisor.getMachine());
        add(datastore);
        add(hypervisor);

        add(device);
        add(pool.getTier());
        add(pool);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment.
     * <ol>
     * <li>A virtual appliance in the generated virtual datacenter</li>
     * <li>An image repository in the given datacenter and enterprise</li>
     * <li>An image category</li>
     * <li>A virtual image in the generated repository and category</li>
     * <li>A NodeVirtualImage linking the generated image with the generated appliance</li>
     * <li>A virtual machine linked to the generated NodeVirtualImage, belonging to the user in the
     * environment</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateNotAllocatedVirtualMachine() {
        // Entities that should be already added to the environment
        VirtualDatacenter vdc = get(VirtualDatacenter.class);
        User user = get(User.class);

        VirtualAppliance vapp = vappGenerator.createInstance(vdc);
        NodeVirtualImage node = nodeVirtualImageGenerator.createInstance(vapp, user);
        VirtualMachine vm = node.getVirtualMachine();
        vm.setState(VirtualMachineState.NOT_ALLOCATED);

        add(vapp);
        add(node.getVirtualImage().getRepository());
        add(node.getVirtualImage().getCategory());
        add(node.getVirtualImage());
        add(node);
        add(vm);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment.
     * <ol>
     * <li>A ip in the generated virtual datacenter and its default vlan.</li>
     * <li>Its Rasd</li>
     * </ol>
     * 
     * @return
     */
    public List<Object> generatePrivateIp() {
        VirtualDatacenter vdc = get(VirtualDatacenter.class);
        VLANNetwork vlan = vdc.getDefaultVlan();
        IpPoolManagement ip = ipGenerator.createInstance(vdc, vlan, "10.60.1.24");

        add(ip.getRasd());
        add(ip);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment.
     * <ol>
     * <li>A network for the virtual datacenter</li>
     * <li>A DHCP remote service</li>
     * <li>A DHCP entity</li>
     * <li>A network configuration for the dhcp service</li>
     * <li>A private VLAN with the generated network configuration</li>
     * <li>A virtual datacenter in the generated datacenter and enterprise</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateVirtualDatacenter() {
        // Entities that should be already added to the environment
        Datacenter datacenter = get(Datacenter.class);
        Enterprise enterprise = get(Enterprise.class);
        Hypervisor hypervisor = get(Hypervisor.class);

        VirtualDatacenter vdc = vdcGenerator.createInstance(datacenter, enterprise, hypervisor.getType());
        VLANNetwork vlan = vlanGenerator.createInstance(vdc.getNetwork());
        vlan.setTag(3);
        // vlan.getConfiguration().getDhcp().getRemoteService().setDatacenter(datacenter);
        vdc.setDefaultVlan(vlan);

        add(vdc.getNetwork());
        // add(vlan.getConfiguration().getDhcp().getRemoteService());
        // add(vlan.getConfiguration().getDhcp());
        add(vlan.getConfiguration());
        add(vlan);
        add(vdc);

        return getEnvironment();
    }

    /**
     * Generates and adds the following entities to the environment.
     * <ol>
     * <li>A volume in the generated virtual datacenter and storage pool</li>
     * <li>An initiator mapping for the generated volume</li>
     * </ol>
     * 
     * @return The environment entities.
     */
    public List<Object> generateVolume() {
        // Entities that should be already added to the environment
        StoragePool pool = get(StoragePool.class);
        VirtualDatacenter vdc = get(VirtualDatacenter.class);

        VolumeManagement volume = volumeGenerator.createInstance(pool, vdc);
        InitiatorMapping mapping = initiatorMappingGenerator.createInstance(volume);

        add(volume.getRasd());
        add(volume);
        add(mapping);

        return getEnvironment();
    }

    /**
     * Get the entity of the given class in the current environment.
     * 
     * @param clazz The class of the entity to get.
     * @return The entity of the given class in the current environment.
     */
    @SuppressWarnings("unchecked")
    public <T> T get(final Class<T> clazz) {
        return (T) Iterables.find(entities, Predicates.instanceOf(clazz));
    }

    /**
     * Get the entities of the given class in the current environment.
     * 
     * @param clazz The class of the entity to get.
     * @return The entities of the given class in the current environment.
     */
    public <T> List<T> getAll(final Class<T> clazz) {
        return Lists.newLinkedList(Iterables.filter(entities, clazz));
    }

    /**
     * Get the entities of the current environment.
     * 
     * @return The entities of the current environment.
     */
    public List<Object> getEnvironment() {
        return entities;
    }
}