Package org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.defaults

Source Code of org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.defaults.DefaultRequestSI

/*
* Copyright 1999-2010 University of Chicago
*
* 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.
*/

package org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.defaults;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.globus.util.Base64;
import org.nimbustools.api._repr._CreateRequest;
import org.nimbustools.api._repr._CustomizationRequest;
import org.nimbustools.api._repr._SpotCreateRequest;
import org.nimbustools.api.brain.ModuleLocator;
import org.nimbustools.api.repr.Caller;
import org.nimbustools.api.repr.CannotTranslateException;
import org.nimbustools.api.repr.CreateRequest;
import org.nimbustools.api.repr.CustomizationRequest;
import org.nimbustools.api.repr.SpotCreateRequest;
import org.nimbustools.api.repr.SpotRequestInfo;
import org.nimbustools.api.repr.vm.NIC;
import org.nimbustools.api.repr.vm.RequiredVMM;
import org.nimbustools.api.repr.vm.ResourceAllocation;
import org.nimbustools.api.repr.vm.State;
import org.nimbustools.api.repr.vm.VMFile;
import org.nimbustools.api.services.metadata.MetadataServer;
import org.nimbustools.api.services.rm.Manager;
import org.nimbustools.messaging.gt4_0.common.AddCustomizations;
import org.nimbustools.messaging.gt4_0_elastic.generated.v2010_08_31.*;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.general.Networks;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.general.ResourceAllocations;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.image.Repository;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.CancelSI;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.ContainerInterface;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.Describe;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.DescribeSI;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.IDMappings;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.RequestSI;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.security.SSHKey;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.security.SSHKeys;

import java.rmi.RemoteException;

public class DefaultRequestSI extends DefaultRun implements RequestSI {

    // -------------------------------------------------------------------------
    // STATIC VARIABLES
    // -------------------------------------------------------------------------

    private static final Log logger =
            LogFactory.getLog(DefaultRequestSI.class.getName());
       
    protected final MetadataServer mdServer;
    protected final DescribeSI describeSI;
    protected final CancelSI cancelSI;
   
    // -------------------------------------------------------------------------
    // CONSTRUCTORS
    // -------------------------------------------------------------------------

    public DefaultRequestSI(ResourceAllocations rasImpl,
                            Networks networksImpl,
                            Repository repoImpl,
                            IDMappings idsImpl,
                            Describe describeImpl,
                            DescribeSI describeSIImpl,
                            CancelSI cancelSIIMpl,
                            ContainerInterface containerImpl,
                            SSHKeys sshKeysImpl,
                            ModuleLocator locator) throws Exception {
       
        super(rasImpl, networksImpl, repoImpl, idsImpl, describeImpl, containerImpl, locator);
       
        if (describeSIImpl == null) {
            throw new IllegalArgumentException("describeSIImpl may not be null");
        }
        this.describeSI = describeSIImpl;
       
        if (cancelSIIMpl == null) {
            throw new IllegalArgumentException("cancelSIIMpl may not be null");
        }
        this.cancelSI = cancelSIIMpl;
       
        if (locator == null) {
            throw new IllegalArgumentException("mdServerImpl may not be null");
        }
        this.mdServer = locator.getMetadataServer();       
    }

    // -------------------------------------------------------------------------
    // implements RequestSI
    // -------------------------------------------------------------------------

    public RequestSpotInstancesResponseType requestSpotInstances(
            RequestSpotInstancesType req, Caller caller, Manager manager)
            throws RemoteException {
       
        final SpotRequestInfo result;
        try {
            SpotCreateRequest creq =
                    this.translateReqSpotInstances(req, caller);
            AddCustomizations.addAll((_CreateRequest)creq,
                                     this.repr, this.mdServer);
            result = manager.requestSpotInstances(creq, caller);

        } catch (Exception e) {
            throw new RemoteException(e.getMessage(), e);
        }
       
        try {
            SpotInstanceRequestSetItemType sirsit = this.describeSI.translateSpotInfo(result);
           
            SpotInstanceRequestSetType sirs = new SpotInstanceRequestSetType();
            sirs.setItem(new SpotInstanceRequestSetItemType[]{sirsit});
           
            RequestSpotInstancesResponseType response = new RequestSpotInstancesResponseType();
            response.setSpotInstanceRequestSet(sirs);
           
            return response;
        } catch (Exception e) {
            final String err = "Problem translating valid request spot instances " +
                    "result into elastic protocol.  Backout required. " +
                    " Error: " + e.getMessage();
            logger.error(err, e);
            this.cancelSI.backOutRequestSpotInstances(result, caller, manager);
            // gets caught by Throwable hook:
            throw new RuntimeException(err, e);
        }
    }   
   
    /**
     * Translate request spot instances
     * into something the Manager understands.
     *
     * @param req given SI request
     * @param caller caller object
     * @return valid create request for manager
     * @throws RemoteException unexpected error
     * @throws CannotTranslateException invalid request or configuration
     */
    public SpotCreateRequest translateReqSpotInstances(
            RequestSpotInstancesType req, Caller caller)
            throws RemoteException, CannotTranslateException {

        final String ownerID;
        try {
            ownerID = this.container.getOwnerID(caller);
        } catch (CannotTranslateException e) {
            throw new RemoteException(e.getMessage(), e);
        }

        LaunchSpecificationRequestType launchSpec = req.getLaunchSpecification();
       
        final String imageID = launchSpec.getImageId();
        if (imageID == null) {
            throw new RemoteException("Request is missing image ID");
        }

        // currently ignored: groupSet, placement, kernel, ramdiskid,
        // blockDeviceMapping

        final _CustomizationRequest cust;
        final String keyname = launchSpec.getKeyName();
        if (keyname != null && this.sshKeys != null) {
            cust = this.repr._newCustomizationRequest();
            final SSHKey key = this.sshKeys.findKey(ownerID, keyname);
            if (key == null) {
                throw new RemoteException("There is no key '" + keyname +
                        "' registered for you to use");
            }
            cust.setContent(key.getPubKeyValue());
            cust.setPathOnVM("/root/.ssh/authorized_keys");
        } else {
            cust = null;
        }

        final CustomizationRequest[] custRequests;
        if (cust != null) {
            custRequests = new CustomizationRequest[1];
            custRequests[0] = cust;
        } else {
            custRequests = null;
        }


        final String raType = launchSpec.getInstanceType();
        final ResourceAllocation ra = this.RAs.getMatchingRA(raType,
                                                             req.getInstanceCount().intValue(),
                                                             req.getInstanceCount().intValue(),
                                                             true);
        final NIC[] nics = this.getNICs(ra.getPublicNetwork(), ra.getPrivateNetwork());

        final RequiredVMM reqVMM = this.RAs.getRequiredVMM();

        String userData = null;
        final UserDataType t_userData = launchSpec.getUserData();
        if (t_userData != null) {
            final String base64Encoded = t_userData.getData();
            if (base64Encoded != null) {
                if (!Base64.isBase64(base64Encoded)) {
                    throw new RemoteException("userdata does not appear to " +
                            "be base64 encoded?");
                }
                final byte[] bytes = Base64.decode(base64Encoded.getBytes());
                userData = new String(bytes);
            }
        }

        final VMFile[] files =
                this.repository.constructFileRequest(imageID, ra, caller);

        final Double spotPrice;
        try{
            spotPrice = new Double(req.getSpotPrice());
        } catch (NumberFormatException e){
            throw new RemoteException("Error in spot price conversion.");
        }   
       
        boolean persistent = DefaultDescribeSI.PERSISTENT.equalsIgnoreCase(req.getType());
       
        final _SpotCreateRequest screq = this.repr._newSpotCreateRequest();

        screq.setContext(null);
        screq.setCoScheduleDone(false);
        screq.setCoScheduleID(null);
        screq.setCoScheduleMember(false);
        screq.setCustomizationRequests(custRequests);
        screq.setInitialStateRequest(State.STATE_Running);
        screq.setName(imageID);
        screq.setRequestedKernel(null); // todo
        screq.setRequestedNics(nics);
        screq.setRequestedRA(ra);
        screq.setRequestedSchedule(null); // ask for default
        screq.setRequiredVMM(reqVMM);
        screq.setShutdownType(CreateRequest.SHUTDOWN_TYPE_TRASH);
        screq.setVMFiles(files);
        screq.setMdUserData(userData);
        screq.setSshKeyName(keyname);
       
        screq.setPersistent(persistent);
        screq.setSpotPrice(spotPrice);
       
        return screq;
    }
}
TOP

Related Classes of org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.defaults.DefaultRequestSI

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.