com.abiquo.api.util.snapshot.SnapshotUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.api.util.snapshot.SnapshotUtils.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.api.util.snapshot;

import java.util.UUID;

import org.apache.commons.io.FilenameUtils;

import com.abiquo.model.enumerator.DiskFormatType;
import com.abiquo.model.enumerator.HypervisorType;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplate;
import com.abiquo.server.core.cloud.VirtualMachine;
import com.abiquo.server.core.cloud.VirtualMachineState;

/**
 * @author eruiz@abiquo.com
 */
public class SnapshotUtils {
    public enum SnapshotType {
        /**
         * The {@link VirtualMachine} deployed disk has the same {@link DiskFormatType} than master
         * {@link VirtualMachineTemplate}.
         */
        FROM_ORIGINAL_DISK,

        /**
         * The {@link VirtualMachine} deployed disk is a conversion, then, the deployed disk has a
         * distinct {@link DiskFormatType} than master {@link VirtualMachineTemplate}.
         */
        FROM_DISK_CONVERSION,

        /**
         * The {@link VirtualMachine} deployed is an imported one.
         */
        FROM_IMPORTED_VIRTUALMACHINE,

        /**
         * The {@link VirtualMachine} is a stateful one.
         */
        FROM_STATEFUL_DISK;

        /**
         * Returns the {@link SnapshotType} to do for a concrete {@link VirtualMachine}.
         * 
         * @param virtualMachine The {@link VirtualMachine} instance
         * @return The {@link SnapshotType} to do.
         */
        public static SnapshotType getSnapshotType(final VirtualMachine virtualMachine) {

            HypervisorType hypervisorType = virtualMachine.getHypervisor().getType();

            if (virtualMachine.isStateful()) {
                return FROM_STATEFUL_DISK;
            } else if (virtualMachine.isCaptured()) {
                return SnapshotType.FROM_IMPORTED_VIRTUALMACHINE;
            } else if (hypervisorType.isInstanceFormatFixed()) {
                if (hypervisorType.getInstanceFormat() == virtualMachine.getVirtualMachineTemplate()
                        .getDiskFormatType()) {
                    return FROM_ORIGINAL_DISK;
                } else {
                    return SnapshotType.FROM_DISK_CONVERSION;
                }
            } else if (virtualMachine.getVirtualImageConversion() != null) {
                return SnapshotType.FROM_DISK_CONVERSION;
            } else {
                return SnapshotType.FROM_ORIGINAL_DISK;
            }
        }
    };

    /**
     * Returns the destination path where a snapshot of a certain {@link VirtualMachineTemplate}
     * must be stored.
     * 
     * @param template The {@link VirtualMachineTemplate} to consider
     * @return The destination path
     */
    public static String formatSnapshotPath(final VirtualMachineTemplate template) {
        String filename = template.getPath();

        if (!template.isMaster()) {
            filename = template.getMaster().getPath();
        }

        return FilenameUtils.getFullPath(filename);
    }

    /**
     * Generates a snapshot filename of a certain {@link VirtualMachineTemplate}.
     * 
     * @param template The {@link VirtualMachineTemplate} to consider
     * @return The snapshot filename
     */
    public static String formatSnapshotFilename(final VirtualMachineTemplate template) {
        String name = FilenameUtils.getName(template.getPath());

        if (!template.isMaster()) {
            name = FilenameUtils.getName(template.getMaster().getPath());
        }

        return String.format("%s-snapshot-%s", UUID.randomUUID().toString(), name);
    }

    /**
     * Indicates if a {@link VirtualMachine} must be powered off before snapshot.
     * 
     * @param virtualMachineState The actual {@link VirtualMachineState} of the
     *            {@link VirtualMachine}
     * @return True if must be powered off. Otherwise false;
     */
    public static boolean mustPowerOffToSnapshot(final VirtualMachineState virtualMachineState) {
        return virtualMachineState == VirtualMachineState.ON || virtualMachineState == VirtualMachineState.PAUSED;
    }
}