/** * Copyright (C) 2012-2015 Dell, Inc * See annotations for authorship information * * ==================================================================== * 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.dasein.cloud.google.compute.server; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.annotation.Nonnull; import org.dasein.cloud.google.Google; import org.dasein.cloud.google.GoogleMethod; import org.dasein.cloud.google.GoogleOperationType; import org.dasein.cloud.google.capabilities.GCEReplicapoolCapabilities; import org.apache.log4j.Logger; import org.dasein.cloud.CloudException; import org.dasein.cloud.InternalException; import org.dasein.cloud.ProviderContext; import org.dasein.cloud.ci.AbstractConvergedInfrastructureSupport; import org.dasein.cloud.ci.CIFilterOptions; import org.dasein.cloud.ci.CIProvisionOptions; import org.dasein.cloud.ci.ConvergedInfrastructure; import org.dasein.cloud.ci.ConvergedInfrastructureState; import org.dasein.cloud.dc.DataCenter; import org.dasein.cloud.dc.Region; import org.dasein.cloud.util.APITrace; import com.google.api.services.compute.Compute; import com.google.api.services.compute.model.Instance; import com.google.api.services.compute.model.InstanceList; import com.google.api.services.compute.model.NetworkInterface; import com.google.api.services.replicapool.Replicapool; import com.google.api.services.replicapool.model.InstanceGroupManager; import com.google.api.services.replicapool.model.InstanceGroupManagerList; import com.google.api.services.replicapool.model.Operation; /** * Implements the replicapool services supported in the Google API. * @author Roger Unwin * @version 2015.03 initial version * @since 2015.03 */ public class ReplicapoolSupport extends AbstractConvergedInfrastructureSupport <Google> { static private final Logger logger = Google.getLogger(ReplicapoolSupport.class); private Google provider = null; public ReplicapoolSupport(Google provider) { super(provider); this.provider = provider; } @Override public boolean isSubscribed() throws CloudException, InternalException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.isSubscribed"); try { return true; // cop-out for now. } finally{ APITrace.end(); } } private transient volatile GCEReplicapoolCapabilities capabilities; public @Nonnull GCEReplicapoolCapabilities getCapabilities() { if( capabilities == null ) { capabilities = new GCEReplicapoolCapabilities(provider); } return capabilities; } @Override public Iterable<ConvergedInfrastructure> listConvergedInfrastructures(CIFilterOptions options) throws CloudException, InternalException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.listConvergedInfrastructures"); List<ConvergedInfrastructure> convergedInfrastrutures = new ArrayList<ConvergedInfrastructure>(); try { Replicapool rp = provider.getGoogleReplicapool(); InstanceGroupManagerList result = null; try { for (Region region : provider.getDataCenterServices().listRegions()) { String regionName = region.getProviderRegionId(); for (DataCenter dataCenter : provider.getDataCenterServices().listDataCenters(regionName)) { String dataCenterId = dataCenter.getProviderDataCenterId(); result = rp.instanceGroupManagers().list(provider.getContext().getAccountNumber(), dataCenterId).execute(); //provider.getContext().getRegionId() if (null != result.getItems()) { for (InstanceGroupManager item : result.getItems()) { ConvergedInfrastructure ci = ConvergedInfrastructure.getInstance(provider.getContext().getAccountNumber(), regionName, dataCenterId, item.getId().toString(), ConvergedInfrastructureState.RUNNING, item.getName(), item.getDescription(), item.getSelfLink()); convergedInfrastrutures.add(ci); } } } } } catch ( IOException e ) { e.printStackTrace(); } } finally{ APITrace.end(); } return convergedInfrastrutures; } @Override public Iterable<String> listVirtualMachines(String inCIId) throws InternalException, CloudException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.listVirtualMachines"); List<String> vms = new ArrayList<String>(); try { Replicapool rp = provider.getGoogleReplicapool(); Compute gce = provider.getGoogleCompute(); InstanceGroupManager pool = rp.instanceGroupManagers().get(provider.getContext().getAccountNumber(), "us-central1-f", inCIId).execute(); String baseInstanceName = pool.getBaseInstanceName(); InstanceList result = gce.instances().list(provider.getContext().getAccountNumber(), "us-central1-f").execute(); for (Instance instance : result.getItems()) { if (instance.getName().startsWith(baseInstanceName + "-")) { vms.add(instance.getName()); } } return vms; } catch ( IOException e ) { e.printStackTrace(); } finally{ APITrace.end(); } return null; } @Override public Iterable<String> listVLANs(String inCIId) throws CloudException, InternalException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.listVLANs"); List<String> nets = new ArrayList<String>(); try { Replicapool rp = provider.getGoogleReplicapool(); Compute gce = provider.getGoogleCompute(); InstanceGroupManager pool = rp.instanceGroupManagers().get(provider.getContext().getAccountNumber(), "us-central1-f", inCIId).execute(); String baseInstanceName = pool.getBaseInstanceName(); InstanceList result = gce.instances().list(provider.getContext().getAccountNumber(), "us-central1-f").execute(); for (Instance instance : result.getItems()) { if (instance.getName().startsWith(baseInstanceName + "-")) { if (null != instance.getNetworkInterfaces()) { for (NetworkInterface net : instance.getNetworkInterfaces()) { nets.add(net.getNetwork().replaceAll(".*/", "")); } } } } return nets; } catch ( IOException e ) { e.printStackTrace(); } finally{ APITrace.end(); } return null; } /* * Create a replicaPool based on options in CIProvisionOptions options * @see org.dasein.cloud.ci.ConvergedInfrastructureSupport#provision(org.dasein.cloud.ci.CIProvisionOptions) */ @Override public ConvergedInfrastructure provision(CIProvisionOptions options) throws CloudException, InternalException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.provision"); Replicapool rp = provider.getGoogleReplicapool(); try { ProviderContext ctx = provider.getContext(); InstanceGroupManager content = new InstanceGroupManager(); content.setBaseInstanceName(getCapabilities().getConvergedInfrastructureNamingConstraints().convertToValidName(options.getBaseInstanceName(), Locale.US)); content.setDescription(options.getDescription()); content.setInstanceTemplate("https://www.googleapis.com/compute/v1/projects/" + ctx.getAccountNumber() + "/global/instanceTemplates/" + options.getInstanceTemplate()); content.setName(getCapabilities().getConvergedInfrastructureNamingConstraints().convertToValidName(options.getName(), Locale.US)); String region = options.getZone().replaceFirst("-.$", ""); //content.setTargetPools(targetPools); Operation job = rp.instanceGroupManagers().insert(ctx.getAccountNumber(), options.getZone(), options.getSize(), content).execute(); GoogleMethod method = new GoogleMethod(provider); method.getCIOperationComplete(ctx, job, GoogleOperationType.ZONE_OPERATION, region, options.getZone()); return ConvergedInfrastructure.getInstance(ctx.getAccountNumber(), region, options.getZone(), options.getBaseInstanceName(), ConvergedInfrastructureState.RUNNING, options.getName(), options.getDescription(), options.getInstanceTemplate()); } catch ( IOException e ) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ APITrace.end(); } return null; } @Override public void terminate(String ciId, String explanation) throws CloudException, InternalException { APITrace.begin(getProvider(), "GoogleConvergedInfrastructure.terminate"); ProviderContext ctx = provider.getContext(); try { Replicapool rp = provider.getGoogleReplicapool(); for (ConvergedInfrastructure ci : listConvergedInfrastructures(null)) { if (ci.getName().equals(ciId)) { Operation job = rp.instanceGroupManagers().delete(provider.getContext().getAccountNumber(), ci.getProviderDataCenterId(), ciId).execute(); GoogleMethod method = new GoogleMethod(provider); method.getCIOperationComplete(ctx, job, GoogleOperationType.ZONE_OPERATION, "us-central1", ci.getProviderDataCenterId()); } } } catch ( IOException e ) { e.printStackTrace(); } finally { APITrace.end(); } } @Override public boolean hasConvergedHttpLoadBalancerSupport() { return true; } }