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

Source Code of org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.ServiceRMImpl

/*
* Copyright 1999-2008 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;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nimbustools.api._repr._CreateRequest;
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.CreateResult;
import org.nimbustools.api.repr.ReprFactory;
import org.nimbustools.api.repr.vm.VM;
import org.nimbustools.api.services.metadata.MetadataServer;
import org.nimbustools.api.services.rm.IdempotentCreationMismatchException;
import org.nimbustools.api.services.rm.ManageException;
import org.nimbustools.api.services.rm.Manager;
import org.nimbustools.api.services.rm.ResourceRequestDeniedException;
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.ServiceRM;
import org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.service.UnimplementedOperations;

import java.rmi.RemoteException;

public class ServiceRMImpl extends UnimplementedOperations
        implements ServiceRM {

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

    private static final Log logger =
            LogFactory.getLog(ServiceRMImpl.class.getName());


    // -------------------------------------------------------------------------
    // INSTANCE VARIABLES
    // -------------------------------------------------------------------------

    // nimbus API:
    protected final Manager manager; // the real RM
    protected final ReprFactory repr;
    protected final MetadataServer mdServer;

    // internal API:
    protected final Run run;
    protected final Terminate terminate;
    protected final Reboot reboot;
    protected final Describe describe;
    protected final ContainerInterface container;
   
    protected final RequestSI reqSI;
    protected final CancelSI cancelSI;
    protected final DescribeSI describeSI;
    protected final DescribeSpotPriceHistory priceHistory;
   
   
    // -------------------------------------------------------------------------
    // CONSTRUCTORS
    // -------------------------------------------------------------------------

    public ServiceRMImpl(Run runImpl,
                         Terminate terminateImpl,
                         Reboot rebootImpl,
                         Describe describeImpl,
                         RequestSI reqSIImpl,
                         CancelSI cancelSIImpl,
                         DescribeSI describeSIImpl,
                         DescribeSpotPriceHistory priceHistoryImpl,
                         ContainerInterface containerImpl,
                         ModuleLocator locator) throws Exception {

        if (runImpl == null) {
            throw new IllegalArgumentException("runImpl may not be null");
        }
        this.run = runImpl;

        if (terminateImpl == null) {
            throw new IllegalArgumentException("terminateImpl may not be null");
        }
        this.terminate = terminateImpl;

        if (rebootImpl == null) {
            throw new IllegalArgumentException("rebootImpl may not be null");
        }
        this.reboot = rebootImpl;

        if (describeImpl == null) {
            throw new IllegalArgumentException("describeImpl may not be null");
        }
        this.describe = describeImpl;
       
        if (reqSIImpl == null) {
            throw new IllegalArgumentException("reqSIImpl may not be null");
        }
        this.reqSI = reqSIImpl;       

        if (cancelSIImpl == null) {
            throw new IllegalArgumentException("reqSIImpl may not be null");
        }
        this.cancelSI = cancelSIImpl;
       
        if (describeSIImpl == null) {
            throw new IllegalArgumentException("reqSIImpl may not be null");
        }
        this.describeSI = describeSIImpl;       
       
        if (containerImpl == null) {
            throw new IllegalArgumentException("containerImpl may not be null");
        }
        this.container = containerImpl;       
       
        if (priceHistoryImpl == null) {
            throw new IllegalArgumentException("priceHistoryImpl may not be null");
        }
        this.priceHistory = priceHistoryImpl;

        if (locator == null) {
            throw new IllegalArgumentException("locator may not be null");
        }

        this.manager = locator.getManager();
        this.repr = locator.getReprFactory();
        this.mdServer = locator.getMetadataServer();
    }

   
    // -------------------------------------------------------------------------
    // RUN
    // -------------------------------------------------------------------------

    public RunInstancesResponseType runInstances(RunInstancesType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("RunInstancesType request is missing");
        }

        final Caller caller = this.container.getCaller();

        final CreateResult result;
        try {
            CreateRequest creq =
                    this.run.translateRunInstances(req, caller);
            AddCustomizations.addAll((_CreateRequest)creq,
                                     this.repr, this.mdServer);
            result = this.manager.create(creq, caller);

        } catch (IdempotentCreationMismatchException e) {
            // need to expose this error specifically in query responses.
            // would be better to have a more general way of handling EC2
            // server error responses for both SOAP and Query
            throw new IdempotentCreationMismatchRemoteException(e.getMessage(), e);
        } catch (ResourceRequestDeniedException e) {
            throw new ResourceRequestDeniedRemoteException(e.getMessage(), e);
        } catch (Exception e) {
            throw new RemoteException(e.getMessage(), e);
        }

        final String keyname = req.getKeyName();
        try {
            return this.run.translateCreateResult(result, caller, keyname);
        } catch (Exception e) {
            final String err = "Problem translating valid creation " +
                    "result into elastic protocol.  Backout required. " +
                    " Error: " + e.getMessage();
            logger.error(err, e);
            this.terminate.backOutCreateResult(result, caller, this.manager);
            // gets caught by Throwable hook:
            throw new RuntimeException(err, e);
        }
    }


    // -------------------------------------------------------------------------
    // REBOOT
    // -------------------------------------------------------------------------

    public RebootInstancesResponseType rebootInstances(RebootInstancesType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("DescribeInstancesType request is missing");
        }

        final Caller caller = this.container.getCaller();
        final boolean result = this.reboot.reboot(req, caller, this.manager);
        return new RebootInstancesResponseType(result, "");
        // TODO do something real with requestId
    }


    // -------------------------------------------------------------------------
    // DESCRIBE
    // -------------------------------------------------------------------------
   
    public DescribeInstancesResponseType describeInstances(
                        DescribeInstancesType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("DescribeInstancesType request is missing");
        }

        final Caller caller = this.container.getCaller();
        try {
            final String[] instanceIDs = this.describe.findQueryIDs(req);
            final VM[] vms = this.manager.getAllByCaller(caller);
            final String ownerID = this.container.getOwnerID(caller);
            return this.describe.translate(vms, instanceIDs, ownerID);
        } catch (ManageException e) {
            throw new RemoteException(e.getMessage(), e);
        } catch (CannotTranslateException e) {
            throw new RemoteException(e.getMessage(), e);
        }
    }


    // -------------------------------------------------------------------------
    // TERMINATE
    // -------------------------------------------------------------------------

    public TerminateInstancesResponseType terminateInstances(
                                        TerminateInstancesType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("TerminateInstancesType request is missing");
        }
        final Caller caller = this.container.getCaller();
        return this.terminate.terminate(req, caller, this.manager);
    }
   

    // -------------------------------------------------------------------------
    // SI OPERATIONS
    // ------------------------------------------------------------------------- 
   
    public RequestSpotInstancesResponseType requestSpotInstances(
                        RequestSpotInstancesType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("requestSpotInstances request is missing");
        }
       
        final Caller caller = this.container.getCaller();

        return this.reqSI.requestSpotInstances(req, caller, this.manager);       
    }
   
    public CancelSpotInstanceRequestsResponseType cancelSpotInstanceRequests(
            CancelSpotInstanceRequestsType req)
            throws RemoteException {

        if (req == null) {
            throw new RemoteException("CancelSpotInstanceRequestsType request is missing");
        }
        final Caller caller = this.container.getCaller();
        return this.cancelSI.cancelSIRequests(req, caller, this.manager);
    }

    public DescribeSpotInstanceRequestsResponseType describeSpotInstanceRequests(
            DescribeSpotInstanceRequestsType req)
            throws RemoteException {
        if (req == null) {
            throw new RemoteException("CancelSpotInstanceRequestsType request is missing");
        }
        final Caller caller = this.container.getCaller();
        return this.describeSI.describeSIRequests(req, caller, manager);  
    }

    public DescribeSpotPriceHistoryResponseType describeSpotPriceHistory(
            DescribeSpotPriceHistoryType req)
            throws RemoteException {
        if (req == null) {
            throw new RemoteException("DescribeSpotPriceHistoryType request is missing");
        }
        return this.priceHistory.describeSpotPriceHistory(req, manager);  
    }   
}
TOP

Related Classes of org.nimbustools.messaging.gt4_0_elastic.v2008_05_05.rm.ServiceRMImpl

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.