/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.camel.component.digitalocean.producer; import java.util.List; import com.myjeeva.digitalocean.pojo.Action; import com.myjeeva.digitalocean.pojo.Actions; import com.myjeeva.digitalocean.pojo.Delete; import com.myjeeva.digitalocean.pojo.Region; import com.myjeeva.digitalocean.pojo.Snapshots; import com.myjeeva.digitalocean.pojo.Volume; import com.myjeeva.digitalocean.pojo.Volumes; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.component.digitalocean.DigitalOceanConfiguration; import org.apache.camel.component.digitalocean.DigitalOceanEndpoint; import org.apache.camel.component.digitalocean.constants.DigitalOceanHeaders; import org.apache.camel.util.ObjectHelper; /** * The DigitalOcean producer for BlockStorages API. */ public class DigitalOceanBlockStoragesProducer extends DigitalOceanProducer { public DigitalOceanBlockStoragesProducer(DigitalOceanEndpoint endpoint, DigitalOceanConfiguration configuration) { super(endpoint, configuration); } public void process(Exchange exchange) throws Exception { switch (determineOperation(exchange)) { case list: getVolumes(exchange); break; case get: getVolume(exchange); break; case listSnapshots: getVolumeSnapshots(exchange); break; case create: createVolume(exchange); break; case delete: deleteVolume(exchange); break; case attach: attachVolumeToDroplet(exchange); break; case detach: detachVolumeToDroplet(exchange); break; case resize: resizeVolume(exchange); break; case listActions: getVolumeActions(exchange); break; default: throw new IllegalArgumentException("Unsupported operation"); } } private void getVolumes(Exchange exchange) throws Exception { String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.REGION + " must be specified"); } Volumes volumes = getEndpoint().getDigitalOceanClient().getAvailableVolumes(region); LOG.trace("All Volumes for region {} [{}] ", region, volumes.getVolumes()); exchange.getOut().setBody(volumes.getVolumes()); } private void createVolume(Exchange exchange) throws Exception { Message in = exchange.getIn(); Volume volume = new Volume(); if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(DigitalOceanHeaders.VOLUME_SIZE_GIGABYTES))) { volume.setSize(in.getHeader(DigitalOceanHeaders.VOLUME_SIZE_GIGABYTES, Double.class)); } else { throw new IllegalArgumentException(DigitalOceanHeaders.VOLUME_SIZE_GIGABYTES + " must be specified"); } if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(DigitalOceanHeaders.NAME))) { volume.setName(in.getHeader(DigitalOceanHeaders.NAME, String.class)); } else { throw new IllegalArgumentException(DigitalOceanHeaders.NAME + " must be specified"); } if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(DigitalOceanHeaders.REGION))) { volume.setRegion(new Region(in.getHeader(DigitalOceanHeaders.REGION, String.class))); } else { throw new IllegalArgumentException(DigitalOceanHeaders.REGION + " must be specified"); } if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(DigitalOceanHeaders.DESCRIPTION))) { volume.setDescription(in.getHeader(DigitalOceanHeaders.DESCRIPTION, String.class)); } else { throw new IllegalArgumentException(DigitalOceanHeaders.DESCRIPTION + " must be specified"); } volume = getEndpoint().getDigitalOceanClient().createVolume(volume); LOG.trace("Volume created {} ", volume); exchange.getOut().setBody(volume); } private void getVolume(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); Volume volume = null; if (ObjectHelper.isEmpty(volumeId)) { String name = exchange.getIn().getHeader(DigitalOceanHeaders.NAME, String.class); String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(name) && ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " or " + DigitalOceanHeaders.NAME + " and " + DigitalOceanHeaders.REGION + " must be specified"); } List<Volume> volumes = getEndpoint().getDigitalOceanClient().getVolumeInfo(name, region).getVolumes(); if (volumes.size() > 0) { volume = volumes.get(1); } } else { volume = getEndpoint().getDigitalOceanClient().getVolumeInfo(volumeId); } LOG.trace("Volume [{}] ", volume); exchange.getOut().setBody(volume); } private void getVolumeSnapshots(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); if (ObjectHelper.isEmpty(volumeId)) { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " must be specified"); } Snapshots snapshots = getEndpoint().getDigitalOceanClient().getVolumeSnapshots(volumeId, configuration.getPage(), configuration.getPerPage()); LOG.trace("All Snapshots for volume {} [{}] ", volumeId, snapshots.getSnapshots()); exchange.getOut().setBody(snapshots.getSnapshots()); } private void deleteVolume(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); Delete delete; if (ObjectHelper.isEmpty(volumeId)) { String name = exchange.getIn().getHeader(DigitalOceanHeaders.NAME, String.class); String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(name) && ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " or " + DigitalOceanHeaders.NAME + " and " + DigitalOceanHeaders.REGION + " must be specified"); } delete = getEndpoint().getDigitalOceanClient().deleteVolume(name, region); } else { delete = getEndpoint().getDigitalOceanClient().deleteVolume(volumeId); } LOG.trace("Delete Volume [{}] ", delete); exchange.getOut().setBody(delete); } private void attachVolumeToDroplet(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); String volumeName = exchange.getIn().getHeader(DigitalOceanHeaders.VOLUME_NAME, String.class); Integer dropletId = exchange.getIn().getHeader(DigitalOceanHeaders.DROPLET_ID, Integer.class); String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(dropletId)) { throw new IllegalArgumentException(DigitalOceanHeaders.DROPLET_ID + " must be specified"); } if (ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.REGION + " must be specified"); } Action action; if (ObjectHelper.isNotEmpty(volumeName)) { action = getEndpoint().getDigitalOceanClient().attachVolumeByName(dropletId, volumeName, region); LOG.trace("Attach Volume {} to Droplet {} [{}] ", volumeName, dropletId, action); } else if (ObjectHelper.isNotEmpty(volumeId)) { action = getEndpoint().getDigitalOceanClient().attachVolume(dropletId, volumeId, region); LOG.trace("Attach Volume {} to Droplet {} [{}] ", volumeId, dropletId, action); } else { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " or " + DigitalOceanHeaders.VOLUME_NAME + " must be specified"); } exchange.getOut().setBody(action); } private void detachVolumeToDroplet(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); String volumeName = exchange.getIn().getHeader(DigitalOceanHeaders.VOLUME_NAME, String.class); Integer dropletId = exchange.getIn().getHeader(DigitalOceanHeaders.DROPLET_ID, Integer.class); String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(dropletId)) { throw new IllegalArgumentException(DigitalOceanHeaders.DROPLET_ID + " must be specified"); } if (ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.REGION + " must be specified"); } Action action; if (ObjectHelper.isNotEmpty(volumeName)) { action = getEndpoint().getDigitalOceanClient().detachVolumeByName(dropletId, volumeName, region); LOG.trace("Detach Volume {} to Droplet {} [{}] ", volumeName, dropletId, action); } else if (ObjectHelper.isNotEmpty(volumeId)) { action = getEndpoint().getDigitalOceanClient().detachVolume(dropletId, volumeId, region); LOG.trace("Detach Volume {} to Droplet {} [{}] ", volumeId, dropletId, action); } else { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " or " + DigitalOceanHeaders.VOLUME_NAME + " must be specified"); } exchange.getOut().setBody(action); } private void resizeVolume(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); if (ObjectHelper.isEmpty(volumeId)) { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " must be specified"); } String region = exchange.getIn().getHeader(DigitalOceanHeaders.REGION, String.class); if (ObjectHelper.isEmpty(region)) { throw new IllegalArgumentException(DigitalOceanHeaders.REGION + " must be specified"); } Double size = exchange.getIn().getHeader(DigitalOceanHeaders.VOLUME_SIZE_GIGABYTES, Double.class); if (ObjectHelper.isEmpty(size)) { throw new IllegalArgumentException(DigitalOceanHeaders.VOLUME_SIZE_GIGABYTES + " must be specified"); } Action action = getEndpoint().getDigitalOceanClient().resizeVolume(volumeId, region, size); LOG.trace("Resize Volume {} [{}] ", volumeId, action); } private void getVolumeActions(Exchange exchange) throws Exception { String volumeId = exchange.getIn().getHeader(DigitalOceanHeaders.ID, String.class); if (ObjectHelper.isEmpty(volumeId)) { throw new IllegalArgumentException(DigitalOceanHeaders.ID + " must be specified"); } Actions actions = getEndpoint().getDigitalOceanClient().getAvailableVolumeActions(volumeId); LOG.trace("Actions for Volume {} [{}] ", volumeId, actions.getActions()); exchange.getOut().setBody(actions.getActions()); } }