edu.ucsb.eucalyptus.cloud.ws.VmAdmissionControl.java Source code

Java tutorial

Introduction

Here is the source code for edu.ucsb.eucalyptus.cloud.ws.VmAdmissionControl.java

Source

package edu.ucsb.eucalyptus.cloud.ws;
/*
 * Author: Chris Grzegorczyk grze@cs.ucsb.edu
 */

import java.util.Date;
import java.util.List;
import java.util.NavigableSet;

import org.apache.log4j.Logger;
import org.bouncycastle.util.encoders.Base64;

import edu.ucsb.eucalyptus.cloud.EucalyptusCloudException;
import edu.ucsb.eucalyptus.cloud.FailScriptFailException;
import edu.ucsb.eucalyptus.cloud.ResourceToken;
import edu.ucsb.eucalyptus.cloud.SLAs;
import edu.ucsb.eucalyptus.cloud.VmAllocationInfo;
import edu.ucsb.eucalyptus.cloud.cluster.Clusters;
import edu.ucsb.eucalyptus.cloud.cluster.NotEnoughResourcesAvailable;
import edu.ucsb.eucalyptus.cloud.entities.Counters;
import edu.ucsb.eucalyptus.msgs.RunInstancesType;
import edu.ucsb.eucalyptus.util.EucalyptusProperties;
import edu.ucsb.eucalyptus.util.UsageManagement;

/*******************************************************************************
 * Copyright (c) 2009  Eucalyptus Systems, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, only version 3 of the License.
 *
 *
 * This file 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 General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Please contact Eucalyptus Systems, Inc., 130 Castilian
 * Dr., Goleta, CA 93101 USA or visit <http://www.eucalyptus.com/licenses/>
 * if you need additional information or have any questions.
 *
 * This file may incorporate work covered under the following copyright and
 * permission notice:
 *
 *   Software License Agreement (BSD License)
 *
 *   Copyright (c) 2008, Regents of the University of California
 *   All rights reserved.
 *
 *   Redistribution and use of this software in source and binary forms, with
 *   or without modification, are permitted provided that the following
 *   conditions are met:
 *
 *     Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *
 *     Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 *   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 *   TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 *   PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 *   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 *   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 *   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USERS OF
 *   THIS SOFTWARE ACKNOWLEDGE THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE
 *   LICENSED MATERIAL, COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS
 *   SOFTWARE, AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING
 *   IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, SANTA
 *   BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, WHICH IN
 *   THE REGENTS DISCRETION MAY INCLUDE, WITHOUT LIMITATION, REPLACEMENT
 *   OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO IDENTIFIED, OR
 *   WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT NEEDED TO COMPLY WITH
 *   ANY SUCH LICENSES OR RIGHTS.
 ******************************************************************************/

public class VmAdmissionControl {

    private static Logger LOG = Logger.getLogger(VmAdmissionControl.class);

    public VmAllocationInfo verify(RunInstancesType request) throws EucalyptusCloudException {
        //:: encapsulate the request into a VmAllocationInfo object and forward it on :://
        VmAllocationInfo vmAllocInfo = new VmAllocationInfo(request);

        vmAllocInfo.setReservationIndex(Counters.getIdBlock(request.getMaxCount()));

        String userData = vmAllocInfo.getRequest().getUserData();
        if (userData != null) {
            try {
                userData = new String(Base64.decode(vmAllocInfo.getRequest().getUserData()));
            } catch (Exception e) {
                userData = "";
            }
        } else {
            userData = "";
        }
        vmAllocInfo.setUserData(userData);
        vmAllocInfo.getRequest().setUserData(new String(Base64.encode(userData.getBytes())));
        return vmAllocInfo;
    }

    public VmAllocationInfo evaluate(VmAllocationInfo vmAllocInfo) throws EucalyptusCloudException {
        SLAs sla = new SLAs();
        List<ResourceToken> allocTokeList = null;
        boolean failed = false;
        boolean hasVms = false;
        try {
            allocTokeList = sla.doVmAllocation(vmAllocInfo);
            int addrCount = 0;
            for (ResourceToken token : allocTokeList) {
                addrCount += token.getAmount();
            }
            if (!EucalyptusProperties.disableNetworking
                    && ("public".equals(vmAllocInfo.getRequest().getAddressingType())
                            || vmAllocInfo.getRequest().getAddressingType() == null)) {
                NavigableSet<String> addresses = AddressManager.allocateAddresses(addrCount);
                for (ResourceToken token : allocTokeList) {
                    for (int i = 0; i < token.getAmount(); i++) {
                        token.getAddresses().add(addresses.pollFirst());
                    }
                }
            }
            vmAllocInfo.getAllocationTokens().addAll(allocTokeList);
            sla.doNetworkAllocation(vmAllocInfo.getRequest().getUserId(), vmAllocInfo.getAllocationTokens(),
                    vmAllocInfo.getNetworks());
        } catch (FailScriptFailException e) {
            failed = true;
            LOG.debug(e, e);
        } catch (NotEnoughResourcesAvailable e) {
            failed = true;
            LOG.debug(e, e);
        }
        if (failed) {
            if (allocTokeList != null) {
                for (ResourceToken token : allocTokeList) {
                    Clusters.getInstance().lookup(token.getCluster()).getNodeState().releaseToken(token);
                }
                throw new EucalyptusCloudException(
                        "Not enough resources available: addresses (try --addressing private)");
            }
            throw new EucalyptusCloudException("Not enough resources available: vm resources.");
        }

        /*List<ResourceToken> tokens= vmAllocInfo.getAllocationTokens();
        for (ResourceToken resourceToken : tokens) {
           String vmType = resourceToken.getVmType();
           String userName = resourceToken.getUserName();
           Date creationTime = resourceToken.getCreationTime();
           String imageId=resourceToken.getCorrelationId();
          List<String> instanceIds = resourceToken.getInstanceIds();
          for (String instanceId : instanceIds) {
             UsageManagement.registerInstanceStartUsage(userName,instanceId,imageId, vmType,creationTime);
          }
        }*/
        return vmAllocInfo;
    }

}