Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (C) 2013-2015 Dell, Inc ==================================================================== 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.azure.compute.disk;
 
 
 
 import  javax.annotation.Nonnull;
 import  javax.annotation.Nullable;
 import java.util.Date;
Support for Azure block storage disks via the Dasein Cloud volume API.

Created by George Reese: 6/19/12 9:25 AM

Author(s):
George Reese (george.reese@imaginary.com)
Version:
2012-06
Since:
2012-06
 
 public class AzureDisk extends AbstractVolumeSupport {
     static private final Logger logger = Azure.getLogger(AzureDisk.class);
 
     static private final String DISK_SERVICES = "/services/disks";
     static private final String HOSTED_SERVICES = "/services/hostedservices";
     static public final String DEPLOYMENT_RESOURCE = "/services/hostedservices/%s/deployments/%s";
     static public final String DATA_DISK_LUN = "/services/hostedservices/%s/deployments/%s/roles/%s/DataDisks/%s";
     static public final String DATA_DISK_RESOURCE = "/services/hostedservices/%s/deployments/%s/roles/%s/DataDisks";
     
     private Azure provider;
 
     public AzureDisk(Azure provider) {
         super(provider);
         this. = provider;
     }
     
     @Override
     public void attach(@Nonnull String volumeId, @Nonnull String toServer, @Nonnull String devicethrows InternalExceptionCloudException {
         if.isTraceEnabled() ) {
             .trace("ENTER: " + AzureDisk.class.getName() + ".attach(" + volumeId + "," + toServer"," +  device+  ")");
         }
         try {
             ProviderContext ctx = .getContext();
 
             ifctx == null ) {
                 throw new AzureConfigException("No context was specified for this request");
             }
 
             if(volumeId == null || volumeId.isEmpty())
                 throw new InternalException("No volumeId was specified to be attached");
 
             Volume disk = getVolume(volumeId);
             if(disk == null ){
                 throw new InternalException("The volumeId specified is not a valid one");
             }
 
             if(toServer == null)
                 throw new InternalException("The virtual machine id cannot be empty");
            if(server == null)
                throw new InternalException("The specified virtual machine id is invalid");
            DataVirtualHardDiskModel dataVirtualHardDiskModel = new DataVirtualHardDiskModel();
            dataVirtualHardDiskModel.setHostCaching("ReadWrite");
            dataVirtualHardDiskModel.setDiskName(disk.getName());
            dataVirtualHardDiskModel.setMediaLink(disk.getMediaLink());
            AzureMethod method = new AzureMethod();
            method.post(String.format(server.getTag("serviceName"), server.getTag("deploymentName"), server.getTag("roleName")), dataVirtualHardDiskModel);
        } catch (JAXBException e) {
            .error(e.getMessage());
            throw new InternalException(e);
        }
        finally {
            if.isTraceEnabled() ) {
                .trace("EXIT: " + AzureDisk.class.getName() + ".attach()");
            }
        }
    }
    @Override
    public @Nonnull String createVolume(@Nonnull VolumeCreateOptions optionsthrows InternalExceptionCloudException {
        if.isTraceEnabled() ) {
            .trace("ENTER: " + AzureDisk.class.getName() + ".createVolume(" + options + ")");
        }
        try {
            ProviderContext ctx = .getContext();
            ifctx == null ) {
                throw new AzureConfigException("No context was specified for this request");
            }
            String storageEndpoint = .getStorageEndpoint();
            ifstorageEndpoint == null || storageEndpoint.isEmpty()) {
                throw new CloudException("Cannot find blob storage endpoint in the current region");
            }
            if(options.getProviderVirtualMachineId() == null || options.getProviderVirtualMachineId().isEmpty())
                throw new InternalException("VolumeCreateOptions does not specify a virtual machine id");
            if(options.getVolumeSize() == null)
                throw new InternalException("VolumeCreateOptions should specify a volume size");
            if(server == null)
                throw new InternalException("The specified virtual machine id is invalid");
            Integer dataDiskCount = getDataDisksCount(server);
            if(dataDiskCount == 2)
                throw new InternalException("The maximum number of data disks currently permitted is 2. The current number of data disks is 2. The operation is attempting to add 1 additional data disks.");
            String diskName = String.format("%s-%s-%s-%s"server.getTag("serviceName"), server.getTag("deploymentName"), server.getTag("roleName"), new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
            String storageMediaLink = String.format("%s/vhds/%s.vhd"storageEndpointdiskName);
            String lun = String.valueOf(dataDiskCount + 1);
            DataVirtualHardDiskModel dataVirtualHardDiskModel = new DataVirtualHardDiskModel();
            dataVirtualHardDiskModel.setHostCaching("ReadWrite");
            dataVirtualHardDiskModel.setLun(lun);
            dataVirtualHardDiskModel.setLogicalDiskSizeInGB(Integer.toString(options.getVolumeSize().intValue()));
            dataVirtualHardDiskModel.setMediaLink(storageMediaLink);
            AzureMethod method = new AzureMethod();
            String requestId = method.post(String.format(server.getTag("serviceName"), server.getTag("deploymentName"), server.getTag("roleName")), dataVirtualHardDiskModel);
            waitForOperation(requestId);
            return getDataDiskName(serverlun);
        }catch (JAXBException e) {
            .error(e.getMessage());
            throw new InternalException(e);
        }
        finally {
            if.isTraceEnabled() ) {
                .trace("EXIT: " + AzureDisk.class.getName() + ".launch()");
            }
        }
    }
    private void waitForOperation(String requestIdthrows CloudExceptionInternalException {
        if(requestId == null)
            return;
        AzureMethod method = new AzureMethod();
        int httpCode = method.getOperationStatus(requestId);
        while (httpCode == -1) {
            try {
                Thread.sleep(15000L);
            }
            catch (InterruptedException ignored){}
            httpCode = method.getOperationStatus(requestId);
        }
    }
    private String getDataDiskName(VirtualMachine virtualMachineString lunthrows CloudExceptionInternalException {
        AzureMethod azureMethod = new AzureMethod();
        DataVirtualHardDiskModel dataVirtualHardDiskModel = azureMethod.get(DataVirtualHardDiskModel.class, String.format(virtualMachine.getTag("serviceName"), virtualMachine.getTag("deploymentName"), virtualMachine.getTag("roleName"), lun));
        if(dataVirtualHardDiskModel == null)
            return null;
        return dataVirtualHardDiskModel.getDiskName();
    }
    private Integer getDataDisksCount(VirtualMachine virtualMachinethrows CloudExceptionInternalException {
        AzureMethod azureMethod = new AzureMethod();
        DeploymentModel deploymentModel = azureMethod.get(DeploymentModel.class, String.format(virtualMachine.getTag("serviceName"), virtualMachine.getTag("deploymentName")));
        if(deploymentModel.getRoles() == null)
            return 0;
        for(DeploymentModel.RoleModel role : deploymentModel.getRoles()){
            if(role.getRoleName().equalsIgnoreCase((StringvirtualMachine.getTag("roleName"))){
                if(role.getDataVirtualDisks() == null)
                    return 0;
                return role.getDataVirtualDisks().size();
            }
        }
        return 0;
    }
    @Override
    public void detach(@Nonnull String volumeIdboolean forcethrows InternalExceptionCloudException {
        if.isTraceEnabled() ) {
            .trace("ENTER: " + AzureDisk.class.getName() + ".detach(" + volumeId+")");
        }
        try {
            ProviderContext ctx = .getContext();
            ifctx == null ) {
                throw new AzureConfigException("No context was specified for this request");
            }
            Volume disk ;
            if(volumeId != null){
                disk = getVolume(volumeId);
                if(disk == null ){
                    throw new InternalException("Can not find the source snapshot !");
                }
            }else{
                throw new InternalException("volumeId is null !");
            }
            String providerVirtualMachineId = disk.getProviderVirtualMachineId();
            VirtualMachine vm = null;
            ifproviderVirtualMachineId != null ) {
                vm = .getComputeServices().getVirtualMachineSupport().getVirtualMachine(providerVirtualMachineId);
            }
            ifvm == null ) {
                .trace("Sorry, the disk is not attached to the VM with id " + providerVirtualMachineId  + " or the VM id is not in the desired format !!!");
                throw new InternalException("Sorry, the disk is not attached to the VM with id " + providerVirtualMachineId  + " or the VM id is not in the desired format !!!");
            }
            String lun = getDiskLun(disk.getProviderVolumeId(), providerVirtualMachineId);
            if(lun == null){
                .trace("Can not identify the lun number");
                throw new InternalException("logical unit number of disk is null, detach operation can not be continue!");
            }
            AzureRoleDetails azureRoleDetails = AzureRoleDetails.fromString(providerVirtualMachineId);
            String resourceDir =  + "/" + azureRoleDetails.getServiceName() + "/deployments" + "/" +  azureRoleDetails.getDeploymentName() + "/roles"+"/" + azureRoleDetails.getRoleName() + "/DataDisks" + "/" + lun;
            AzureMethod method = new AzureMethod();
            method.invoke("DELETE",ctx.getAccountNumber(), resourceDirnull);
        }
        finally {
            if.isTraceEnabled() ) {
                .trace("EXIT: " + AzureDisk.class.getName() + ".detach()");
            }
        }
    }
    private transient volatile AzureDiskCapabilities capabilities;
    @Override
        if == null ) {
             = new AzureDiskCapabilities();
        }
        return ;
    }
    private String getDiskLun(String providerVolumeIdString providerVirtualMachineIdthrows InternalExceptionCloudException {
    	
        AzureMethod method = new AzureMethod();
        VirtualMachine vm = .getComputeServices().getVirtualMachineSupport().getVirtualMachine(providerVirtualMachineId);
        if(vm == null)
            return null;
        AzureRoleDetails azureRoleDetails = AzureRoleDetails.fromString(providerVirtualMachineId);
     	String resourceDir =   + "/"azureRoleDetails.getServiceName() + "/deployments" + "/" + azureRoleDetails.getDeploymentName();
     	
     	Document doc = method.getAsXML(.getContext().getAccountNumber(),resourceDir);
        ifdoc == null ) {
            return null;
        }
        NodeList entries = doc.getElementsByTagName("DataVirtualHardDisk");
        ifentries.getLength() < 1 ) {
            return null;
        }      
        
        forint i=0; i<entries.getLength(); i++ ) {
            Node detail = entries.item(i);
            NodeList attributes = detail.getChildNodes();
            String diskName = nulllunValue = null;
            forint j=0; j<attributes.getLength(); j++ ) {
                Node attribute = attributes.item(j);
               
                if(attribute.getNodeType() == .continue;
                
                ifattribute.getNodeName().equalsIgnoreCase("DiskName") && attribute.hasChildNodes() ) {
                	diskName = attribute.getFirstChild().getNodeValue().trim();
                }
                else ifattribute.getNodeName().equalsIgnoreCase("Lun") && attribute.hasChildNodes() ) {
                    if (diskName != null && diskName.equalsIgnoreCase(providerVolumeId)) {
                        lunValue = attribute.getFirstChild().getNodeValue().trim();
                    }
                }
            }
            if(diskName != null && diskName.equalsIgnoreCase(providerVolumeId)){
            	if(lunValue == null){
            		lunValue = "0";	
            	}            	
            	return lunValue;
            }           
        }
        
        return null;
    }
    @Override
    public int getMaximumVolumeCount() throws InternalExceptionCloudException {
        return 16;
    }
       
    @Override
    public @Nullable Storage<GigabytegetMaximumVolumeSize() throws InternalExceptionCloudException {
        return new Storage<Gigabyte>(1024, .);
    }
    @Override
    public @Nonnull Storage<GigabytegetMinimumVolumeSize() throws InternalExceptionCloudException {
        return new Storage<Gigabyte>(1, .);
    }
    @Override
    public @Nonnull String getProviderTermForVolume(@Nonnull Locale locale) {
        return "disk";
    }
    @Override
    public @Nullable Volume getVolume(@Nonnull String volumeIdthrows InternalExceptionCloudException {
        //To change body of implemented methods use File | Settings | File Templates.
    	
    	ArrayList<Volumelist = (ArrayList<Volume>) listVolumes();
    	if(list == null)
    		return null;
    	for(Volume disk : list){
    		if(disk.getProviderVolumeId().equals(volumeId)){
    			return disk;
    		}    		
    	}
  		return null;
    }
    @Nonnull
    @Override
        return .;  //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public @Nonnull Iterable<StringlistPossibleDeviceIds(@Nonnull Platform platformthrows InternalExceptionCloudException {
       //To change body of implemented methods use File | Settings | File Templates.
    	ArrayList<Stringlist = new ArrayList<String>();
    	for(int i= 0;i < this.getMaximumVolumeCount();i++){
    		list.add(String.valueOf(i));    		
    	}
    	return list;
    }
    @Nonnull
    @Override
        return Collections.singletonList(.);
    }
    @Nonnull
    @Override
        return Collections.emptyList();
    }
    @Nonnull
    @Override
        ProviderContext ctx = .getContext();
        ifctx == null ) {
            throw new AzureConfigException("No context was specified for this request");
        }
        AzureMethod method = new AzureMethod();
        Document doc = method.getAsXML(ctx.getAccountNumber(), );
        NodeList entries = doc.getElementsByTagName("Disk");
        ArrayList<ResourceStatuslist = new ArrayList<ResourceStatus>();
        forint i=0; i<entries.getLength(); i++ ) {
            Node entry = entries.item(i);
            ResourceStatus status = toStatus(ctxentry);
            ifstatus != null ) {
                list.add(status);
            }
        }
        return list;
    }
    @Override
    public @Nonnull Iterable<VolumelistVolumes() throws InternalExceptionCloudException {
        //To change body of implemented methods use File | Settings | File Templates.
        ProviderContext ctx = .getContext();
        ifctx == null ) {
            throw new AzureConfigException("No context was specified for this request");
        }
        AzureMethod method = new AzureMethod();
        Document doc = method.getAsXML(ctx.getAccountNumber(), );
        NodeList entries = doc.getElementsByTagName("Disk");
        ArrayList<Volumedisks = new ArrayList<Volume>();
        forint i=0; i<entries.getLength(); i++ ) {
            Node entry = entries.item(i);
            Volume disk = toVolume(ctxentry);
            ifdisk != null ) {
            	disks.add(disk);
            }
        }
        return disks;
    }
    @Nonnull
    @Override
    public Iterable<VolumelistVolumes(@Nullable VolumeFilterOptions volumeFilterOptionsthrows InternalExceptionCloudException {
        ProviderContext ctx = .getContext();
        ifctx == null ) {
            throw new AzureConfigException("No context was specified for this request");
        }
        AzureMethod method = new AzureMethod();
        Document doc = method.getAsXML(ctx.getAccountNumber(), );
        NodeList entries = doc.getElementsByTagName("Disk");
        ArrayList<Volumedisks = new ArrayList<Volume>();
        forint i=0; i<entries.getLength(); i++ ) {
            Node entry = entries.item(i);
            Volume disk = toVolume(ctxentry);
            ifdisk != null ) {
                disks.add(disk);
            }
        }
        return disks;
    }
    private boolean isWithinDeviceList(String devicethrows InternalExceptionCloudException{
    	
    	for(String id : list){
    		if(id.equals(device)){
    			return true;
    		}
    	}
    	return false;
    	
    }
    @Override
    public boolean isSubscribed() throws CloudExceptionInternalException {
        return true;  //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void remove(@Nonnull String volumeIdthrows InternalExceptionCloudException {
        if.isTraceEnabled() ) {
            .trace("ENTER: " + AzureDisk.class.getName() + ".remove(" + volumeId + ")");
        }
        try {
            ProviderContext ctx = .getContext();
            ifctx == null ) {
                throw new AzureConfigException("No context was specified for this request");
            }                      
            
            AzureMethod method = new AzureMethod();
            long timeout = System.currentTimeMillis() + (. * 10L);
            whiletimeout > System.currentTimeMillis() ) {
                try {
                    method.invoke("DELETE",ctx.getAccountNumber(), +"/" + volumeId+"?comp=media"null);
                    break;
                }
                catch (CloudException e) {
                    ife.getProviderCode() != null && e.getProviderCode().equals("BadRequest") ) {
                        .warn("Conflict error, maybe retrying in 30 seconds");
                        try { Thread.sleep(30000L); }
                        catchInterruptedException ignore ) { }
                        continue;
                    }
                    .warn("Unable to delete volume " + volumeId + ": " + e.getMessage());
                    throw e;
                }
            }
        }
        finally {
            if.isTraceEnabled() ) {
                .trace("EXIT: " + AzureDisk.class.getName() + ".remove()");
            }
        }
    }
    @Override
    public void removeTags(@Nonnull String s, @Nonnull Tag... tagsthrows CloudExceptionInternalException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void removeTags(@Nonnull String[] strings, @Nonnull Tag... tagsthrows CloudExceptionInternalException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void updateTags(@Nonnull String s, @Nonnull Tag... tagsthrows CloudExceptionInternalException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public void updateTags(@Nonnull String[] strings, @Nonnull Tag... tagsthrows CloudExceptionInternalException {
        //To change body of implemented methods use File | Settings | File Templates.
    }
    @Override
    public @Nonnull String[] mapServiceAction(@Nonnull ServiceAction action) {
        return new String[0];
    }
    private @Nullable Volume toVolume(@Nonnull ProviderContext ctx, @Nullable Node volumeNodethrows InternalExceptionCloudException {
        ifvolumeNode == null ) {
            return null;
        }
          
        String regionId = ctx.getRegionId();
        ifregionId == null ) {
            throw new AzureConfigException("No region ID was specified for this request");
        }
        Volume disk = new Volume();
        disk.setProviderRegionId(regionId);
        disk.setType(.);
        boolean mediaLocationFound = false;
        NodeList attributes = volumeNode.getChildNodes();
        
        forint i=0; i<attributes.getLength(); i++ ) {
            Node attribute = attributes.item(i);
            if(attribute.getNodeType() == .continue;
            ifattribute.getNodeName().equalsIgnoreCase("AttachedTo") && attribute.hasChildNodes() ) {
            	NodeList attachAttributes = attribute.getChildNodes();
                String hostedServiceName = null;
                String deploymentName = null;
                String vmRoleName = null;
            	forint k=0; k<attachAttributes.getLength(); k++ ) {
            		Node attach = attachAttributes.item(k);
            		if(attach.getNodeType() == .continue
            		
            		if(attach.getNodeName().equalsIgnoreCase("HostedServiceName") && attach.hasChildNodes() ) {	                 
            			hostedServiceName = attach.getFirstChild().getNodeValue().trim();	              
            		}
                    else if(attach.getNodeName().equalsIgnoreCase("DeploymentName") && attach.hasChildNodes() ) {
                        deploymentName = attach.getFirstChild().getNodeValue().trim();
                    }
            		else if(attach.getNodeName().equalsIgnoreCase("RoleName") && attach.hasChildNodes() ) {	                 
            			vmRoleName = attach.getFirstChild().getNodeValue().trim();	              
            		}
            	} 
            	
            	if(hostedServiceName != null && deploymentName != null && vmRoleName != null){
            		disk.setProviderVirtualMachineId(hostedServiceName+":"+deploymentName+":"+vmRoleName);
            	}
            }
            else ifattribute.getNodeName().equalsIgnoreCase("OS") && attribute.hasChildNodes() ) {
                // return root volumes
                disk.setGuestOperatingSystem(Platform.guess(attribute.getFirstChild().getNodeValue().trim()));
            }
            // disk may have either affinity group or location depending on how storage account is set up
            else ifattribute.getNodeName().equalsIgnoreCase("AffinityGroup") && attribute.hasChildNodes() ) {
                //get the region for this affinity group
                String affinityGroup = attribute.getFirstChild().getNodeValue().trim();
                if (affinityGroup != null && !affinityGroup.equals("")) {
                    AffinityGroup affinityGroupModel = .getComputeServices().getAffinityGroupSupport().get(affinityGroup);
                    if(affinityGroupModel == null)
                        return null;
                    DataCenter dc = .getDataCenterServices().getDataCenter(affinityGroupModel.getDataCenterId());
                    if (dc.getRegionId().equals(disk.getProviderRegionId())) {
                        disk.setProviderDataCenterId(dc.getProviderDataCenterId());
                        mediaLocationFound = true;
                    }
                    else {
                        // not correct region/datacenter
                        return null;
                    }
                }
            }
            else ifattribute.getNodeName().equalsIgnoreCase("Location") && attribute.hasChildNodes() ) {
            	if( !mediaLocationFound && !regionId.equals(attribute.getFirstChild().getNodeValue().trim()) ) {
                     return null;
                }
            }
            else ifattribute.getNodeName().equalsIgnoreCase("LogicalDiskSizeInGB") && attribute.hasChildNodes() ) {
            	disk.setSize(Storage.valueOf(Integer.valueOf(attribute.getFirstChild().getNodeValue().trim()), "gigabyte"));
            }
            else ifattribute.getNodeName().equalsIgnoreCase("MediaLink") && attribute.hasChildNodes() ) {
            	disk.setMediaLink(attribute.getFirstChild().getNodeValue().trim());
            }
            else ifattribute.getNodeName().equalsIgnoreCase("Name") && attribute.hasChildNodes() ) {
            	disk.setProviderVolumeId(attribute.getFirstChild().getNodeValue().trim());
            }
            else ifattribute.getNodeName().equalsIgnoreCase("SourceImageName") && attribute.hasChildNodes() ) {
            	disk.setProviderSnapshotId(attribute.getFirstChild().getNodeValue().trim());            	
            } 
        }
        if (disk.getProviderVirtualMachineId() != null) {
            // attached to vm - now populate device id
            String lun = getDiskLun(disk.getProviderVolumeId(), disk.getProviderVirtualMachineId());
            disk.setDeviceId(lun);
        }
        if(disk.getGuestOperatingSystem() == null){
        	disk.setGuestOperatingSystem(.);        	
        }
        ifdisk.getName() == null ) {
        	disk.setName(disk.getProviderVolumeId());
        }
        ifdisk.getDescription() == null ) {
        	disk.setDescription(disk.getName());
        }
        if (disk.getProviderDataCenterId() == null) {
            DataCenter dc = .getDataCenterServices().listDataCenters(regionId).iterator().next();
            disk.setProviderDataCenterId(dc.getProviderDataCenterId());
        }
       
        return disk;
    }
    private @Nullable ResourceStatus toStatus(@Nonnull ProviderContext ctx, @Nullable Node volumeNodethrows InternalExceptionCloudException {
        ifvolumeNode == null ) {
            return null;
        }
        String regionId = ctx.getRegionId();
        ifregionId == null ) {
            throw new AzureConfigException("No region ID was specified for this request");
        }
        String id = "";
        boolean mediaLocationFound = false;
        NodeList attributes = volumeNode.getChildNodes();
        forint i=0; i<attributes.getLength(); i++ ) {
            Node attribute = attributes.item(i);
            if(attribute.getNodeType() == .continue;
            ifattribute.getNodeName().equalsIgnoreCase("Name") && attribute.hasChildNodes() ) {
                id = attribute.getFirstChild().getNodeValue().trim();
            }
            else ifattribute.getNodeName().equalsIgnoreCase("AffinityGroup") && attribute.hasChildNodes() ) {
                //get the region for this affinity group
                String affinityGroup = attribute.getFirstChild().getNodeValue().trim();
                if (affinityGroup != null && !affinityGroup.equals("")) {
                    AffinityGroup affinityGroupModel = .getComputeServices().getAffinityGroupSupport().get(affinityGroup);
                    if(affinityGroupModel == null)
                        return null;
                    DataCenter dc = .getDataCenterServices().getDataCenter(affinityGroupModel.getDataCenterId());
                    if (dc.getRegionId().equals(regionId)) {
                        mediaLocationFound = true;
                    }
                    else {
                        // not correct region/datacenter
                        return null;
                    }
                }
            }
            else ifattribute.getNodeName().equalsIgnoreCase("Location") && attribute.hasChildNodes() ) {
                if( !mediaLocationFound && !regionId.equals(attribute.getFirstChild().getNodeValue().trim()) ) {
                    return null;
                }
            }
            else ifattribute.getNodeName().equalsIgnoreCase("OS") && attribute.hasChildNodes() ) {
                // not a volume so should not be returned here
                return null;
            }
        }
        ResourceStatus status = new ResourceStatus(id.);
        return status;
    }
     
New to GrepCode? Check out our FAQ X