diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java index dbed36e3a82..d8c09d9662c 100755 --- a/api/src/com/cloud/resource/ResourceService.java +++ b/api/src/com/cloud/resource/ResourceService.java @@ -27,6 +27,7 @@ import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd; import org.apache.cloudstack.api.command.admin.host.ReconnectHostCmd; import org.apache.cloudstack.api.command.admin.host.UpdateHostCmd; import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd; +import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd; @@ -38,7 +39,7 @@ import com.cloud.exception.ResourceInUseException; import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Cluster; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.storage.S3; import com.cloud.storage.Swift; import com.cloud.utils.Pair; @@ -102,7 +103,7 @@ public interface ResourceService { S3 discoverS3(AddS3Cmd cmd) throws DiscoveryException; - ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; + ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; List getSupportedHypervisorTypes(long zoneId, boolean forVirtualRouter, Long podId); diff --git a/api/src/com/cloud/storage/ObjectStore.java b/api/src/com/cloud/storage/ImageStore.java similarity index 86% rename from api/src/com/cloud/storage/ObjectStore.java rename to api/src/com/cloud/storage/ImageStore.java index 636537f8437..54d22d10f3f 100644 --- a/api/src/com/cloud/storage/ObjectStore.java +++ b/api/src/com/cloud/storage/ImageStore.java @@ -19,7 +19,12 @@ package com.cloud.storage; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -public interface ObjectStore extends Identity, InternalIdentity { +public interface ImageStore extends Identity, InternalIdentity { + + public enum State { + Disabled, Enabled, Deactivated; + } + /** * @return name of the object store. @@ -32,10 +37,9 @@ public interface ObjectStore extends Identity, InternalIdentity { Long getDataCenterId(); /** - * @return region id. - * @return + * @return image store state. */ - Long getRegionId(); + State getState(); /** * @return object store provider name diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index b85f2c5f7ed..3d381b0300a 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -326,7 +326,7 @@ public interface ResponseGenerator { RegionResponse createRegionResponse(Region region); - ObjectStoreResponse createObjectStoreResponse(ObjectStore os); + ImageStoreResponse createImageStoreResponse(ImageStore os); /** * @param resourceTag diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java index 663750edcc8..94aaa5fcc25 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java @@ -25,16 +25,13 @@ import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.BaseCmd.CommandType; import org.apache.cloudstack.api.response.HostResponse; -import org.apache.cloudstack.api.response.ObjectStoreResponse; import org.apache.cloudstack.api.response.RegionResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.log4j.Logger; import com.cloud.exception.DiscoveryException; import com.cloud.host.Host; -import com.cloud.storage.ObjectStore; import com.cloud.user.Account; @APICommand(name = "addSecondaryStorage", description="Adds secondary storage.", responseObject=HostResponse.class) @@ -113,14 +110,17 @@ public class AddSecondaryStorageCmd extends BaseCmd { @Override public void execute(){ - try{ - ObjectStore result = _resourceService.discoverObjectStore(this); - ObjectStoreResponse storeResponse = null; - if (result != null ) { - storeResponse = _responseGenerator.createObjectStoreResponse(result); - storeResponse.setResponseName(getCommandName()); - storeResponse.setObjectName("secondarystorage"); - this.setResponseObject(storeResponse); + try { + List result = _resourceService.discoverHosts(this); + HostResponse hostResponse = null; + if (result != null && result.size() > 0) { + for (Host host : result) { + // There should only be one secondary storage host per add + hostResponse = _responseGenerator.createHostResponse(host); + hostResponse.setResponseName(getCommandName()); + hostResponse.setObjectName("secondarystorage"); + this.setResponseObject(hostResponse); + } } else { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add secondary storage"); } @@ -128,5 +128,6 @@ public class AddSecondaryStorageCmd extends BaseCmd { s_logger.warn("Exception: ", ex); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage()); } + } } diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java new file mode 100644 index 00000000000..40ae6b26e84 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java @@ -0,0 +1,120 @@ +// 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.cloudstack.api.command.admin.storage; + +import java.util.Map; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ImageStoreResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.log4j.Logger; + +import com.cloud.exception.DiscoveryException; +import com.cloud.storage.ImageStore; +import com.cloud.user.Account; + +@APICommand(name = "addImageStore", description="Adds backup image store.", responseObject=ImageStoreResponse.class) +public class AddImageStoreCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(AddImageStoreCmd.class.getName()); + private static final String s_name = "addimagestoreresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.URL, type=CommandType.STRING, required=true, description="the URL for the image store") + private String url; + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class, + description="the Zone ID for the image store") + private Long zoneId; + + + @Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, description="the details for the image store") + private Map details; + + @Parameter(name=ApiConstants.SCOPE, type=CommandType.STRING, + required=false, description="the scope of the image store: zone or region") + private String scope; + + @Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING, + required=false, description="the image store provider name") + private String providerName; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getUrl() { + return url; + } + + public Long getZoneId() { + return zoneId; + } + + public Map getDetails() { + return details; + } + + public String getScope() { + return this.scope; + } + + public String getProviderName() { + return this.providerName; + } + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + try{ + ImageStore result = _resourceService.discoverImageStore(this); + ImageStoreResponse storeResponse = null; + if (result != null ) { + storeResponse = _responseGenerator.createImageStoreResponse(result); + storeResponse.setResponseName(getCommandName()); + storeResponse.setObjectName("secondarystorage"); + this.setResponseObject(storeResponse); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add secondary storage"); + } + } catch (DiscoveryException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage()); + } + } +} diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java b/api/src/org/apache/cloudstack/api/response/ImageStoreDetailResponse.java similarity index 88% rename from api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java rename to api/src/org/apache/cloudstack/api/response/ImageStoreDetailResponse.java index 74a42f2612a..6f90f0ff8f7 100644 --- a/api/src/org/apache/cloudstack/api/response/ObjectStoreDetailResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ImageStoreDetailResponse.java @@ -21,18 +21,18 @@ import org.apache.cloudstack.api.BaseResponse; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; -public class ObjectStoreDetailResponse extends BaseResponse { - @SerializedName("name") @Param(description="detail property name of the object store") +public class ImageStoreDetailResponse extends BaseResponse { + @SerializedName("name") @Param(description="detail property name of the image store") private String name; - @SerializedName("value") @Param(description="detail property value of the object store") + @SerializedName("value") @Param(description="detail property value of the image store") private String value; - public ObjectStoreDetailResponse(){ + public ImageStoreDetailResponse(){ super(); } - public ObjectStoreDetailResponse(String name, String val){ + public ImageStoreDetailResponse(String name, String val){ super(); this.name = name; this.value = val; @@ -71,7 +71,7 @@ public class ObjectStoreDetailResponse extends BaseResponse { return false; if (getClass() != obj.getClass()) return false; - ObjectStoreDetailResponse other = (ObjectStoreDetailResponse) obj; + ImageStoreDetailResponse other = (ImageStoreDetailResponse) obj; String oid = this.getName(); if (oid == null) { if (other.getName() != null) diff --git a/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java similarity index 70% rename from api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java rename to api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java index 595ae9732e0..21dc635a09c 100644 --- a/api/src/org/apache/cloudstack/api/response/ObjectStoreResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java @@ -24,48 +24,46 @@ import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; import com.cloud.serializer.Param; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.storage.ScopeType; import com.google.gson.annotations.SerializedName; -@EntityReference(value=ObjectStore.class) -public class ObjectStoreResponse extends BaseResponse { - @SerializedName("id") @Param(description="the ID of the object store") +@EntityReference(value=ImageStore.class) +public class ImageStoreResponse extends BaseResponse { + @SerializedName("id") @Param(description="the ID of the image store") private String id; - @SerializedName("zoneid") @Param(description="the Zone ID of the object store") + @SerializedName("zoneid") @Param(description="the Zone ID of the image store") private String zoneId; - @SerializedName(ApiConstants.ZONE_NAME) @Param(description="the Zone name of the object store") + @SerializedName(ApiConstants.ZONE_NAME) @Param(description="the Zone name of the image store") private String zoneName; - @SerializedName("regionid") @Param(description="the Region ID of the object store") - private Long regionId; + @SerializedName("state") @Param(description="the state of the image store") + private ImageStore.State state; - @SerializedName("regionname") @Param(description="the Region name of the object store") - private String regionName; - @SerializedName("name") @Param(description="the name of the object store") + @SerializedName("name") @Param(description="the name of the image store") private String name; - @SerializedName("url") @Param(description="the url of the object store") + @SerializedName("url") @Param(description="the url of the image store") private String url; - @SerializedName("protocol") @Param(description="the protocol of the object store") + @SerializedName("protocol") @Param(description="the protocol of the image store") private String protocol; - @SerializedName("providername") @Param(description="the provider name of the object store") + @SerializedName("providername") @Param(description="the provider name of the image store") private String providerName; - @SerializedName("scope") @Param(description="the scope of the object store") + @SerializedName("scope") @Param(description="the scope of the image store") private ScopeType scope; - @SerializedName("details") @Param(description="the details of the object store") - private Set details; + @SerializedName("details") @Param(description="the details of the image store") + private Set details; - public ObjectStoreResponse(){ - this.details = new LinkedHashSet(); + public ImageStoreResponse(){ + this.details = new LinkedHashSet(); } @Override @@ -98,20 +96,12 @@ public class ObjectStoreResponse extends BaseResponse { } - public Long getRegionId() { - return regionId; + public ImageStore.State getState() { + return state; } - public void setRegionId(Long regionId) { - this.regionId = regionId; - } - - public String getRegionName() { - return regionName; - } - - public void setRegionName(String regionName) { - this.regionName = regionName; + public void setState(ImageStore.State state) { + this.state = state; } public String getName() { @@ -155,15 +145,15 @@ public class ObjectStoreResponse extends BaseResponse { this.protocol = protocol; } - public Set getDetails() { + public Set getDetails() { return details; } - public void setDetails(Set details) { + public void setDetails(Set details) { this.details = details; } - public void addDetail(ObjectStoreDetailResponse detail){ + public void addDetail(ImageStoreDetailResponse detail){ this.details.add(detail); } diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 7b752f0b08a..7bf45a24715 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -786,6 +786,9 @@ + + + diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 163c2cee861..ad17c1512d4 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -241,6 +241,9 @@ listSwifts=1 addS3=1 listS3s=1 +#### image store commands +addImageStore=1 + #### host commands addHost=3 addCluster=1 diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java index 280e02e2a32..2440bfdb197 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java @@ -29,7 +29,7 @@ public interface DataStoreLifeCycle { public boolean attachCluster(DataStore store, ClusterScope scope); public boolean attachHost(DataStore store, HostScope scope, StoragePoolInfo existingInfo); boolean attachZone(DataStore dataStore, ZoneScope scope); - + public boolean dettach(); public boolean unmanaged(); diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageDataStoreProvider.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageStoreProvider.java similarity index 92% rename from engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageDataStoreProvider.java rename to engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageStoreProvider.java index 1fb987e81cd..9a1f69f3a5b 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageDataStoreProvider.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ImageStoreProvider.java @@ -19,6 +19,6 @@ package org.apache.cloudstack.engine.subsystem.api.storage; -public interface ImageDataStoreProvider extends DataStoreProvider { +public interface ImageStoreProvider extends DataStoreProvider { } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java similarity index 57% rename from engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreProviderManagerImpl.java rename to engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java index 4430267c700..7ea68dc731f 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreProviderManagerImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java @@ -28,38 +28,38 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStore; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.image.store.ImageStoreImpl; import org.springframework.stereotype.Component; import com.cloud.storage.dao.VMTemplateDao; @Component -public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProviderManager { +public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager { @Inject - ImageDataStoreDao dataStoreDao; + ImageStoreDao dataStoreDao; @Inject VMTemplateDao imageDataDao; @Inject DataStoreProviderManager providerManager; - Map driverMaps; + Map driverMaps; @PostConstruct public void config() { - driverMaps = new HashMap(); + driverMaps = new HashMap(); } @Override - public ImageDataStore getImageDataStore(long dataStoreId) { - ImageDataStoreVO dataStore = dataStoreDao.findById(dataStoreId); + public ImageStoreEntity getImageStore(long dataStoreId) { + ImageStoreVO dataStore = dataStoreDao.findById(dataStoreId); String providerName = dataStore.getProviderName(); - ImageDataStoreProvider provider = (ImageDataStoreProvider)providerManager.getDataStoreProvider(providerName); - ImageDataStore imgStore = ImageDataStoreImpl.getDataStore(dataStore, + ImageStoreProvider provider = (ImageStoreProvider)providerManager.getDataStoreProvider(providerName); + ImageStoreEntity imgStore = ImageStoreImpl.getDataStore(dataStore, driverMaps.get(provider.getName()), provider ); // TODO Auto-generated method stub @@ -67,7 +67,7 @@ public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProvider } @Override - public boolean registerDriver(String providerName, ImageDataStoreDriver driver) { + public boolean registerDriver(String providerName, ImageStoreDriver driver) { if (driverMaps.containsKey(providerName)) { return false; } @@ -76,17 +76,17 @@ public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProvider } @Override - public ImageDataStore getImageDataStore(String uuid) { - ImageDataStoreVO dataStore = dataStoreDao.findByUuid(uuid); - return getImageDataStore(dataStore.getId()); + public ImageStoreEntity getImageStore(String uuid) { + ImageStoreVO dataStore = dataStoreDao.findByUuid(uuid); + return getImageStore(dataStore.getId()); } @Override public List getList() { - List stores = dataStoreDao.listAll(); + List stores = dataStoreDao.listAll(); List imageStores = new ArrayList(); - for (ImageDataStoreVO store : stores) { - imageStores.add(getImageDataStore(store.getId())); + for (ImageStoreVO store : stores) { + imageStores.add(getImageStore(store.getId())); } return imageStores; } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java similarity index 80% rename from engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java rename to engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java index 4a6016c699d..60c71f0ffa5 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java @@ -25,46 +25,47 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStore; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import com.cloud.storage.ImageStore; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.storage.encoding.EncodingType; -public class ImageDataStoreImpl implements ImageDataStore { +public class ImageStoreImpl implements ImageStoreEntity { @Inject VMTemplateDao imageDao; @Inject private ObjectInDataStoreManager objectInStoreMgr; - protected ImageDataStoreDriver driver; - protected ImageDataStoreVO imageDataStoreVO; - protected ImageDataStoreProvider provider; + protected ImageStoreDriver driver; + protected ImageStoreVO imageDataStoreVO; + protected ImageStoreProvider provider; boolean needDownloadToCacheStorage = false; - public ImageDataStoreImpl() { + public ImageStoreImpl() { } - protected void configure(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver, - ImageDataStoreProvider provider) { + protected void configure(ImageStoreVO dataStoreVO, ImageStoreDriver imageDataStoreDriver, + ImageStoreProvider provider) { this.driver = imageDataStoreDriver; this.imageDataStoreVO = dataStoreVO; this.provider = provider; } - public static ImageDataStore getDataStore(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver, - ImageDataStoreProvider provider) { - ImageDataStoreImpl instance = (ImageDataStoreImpl)ComponentContext.inject(ImageDataStoreImpl.class); + public static ImageStoreEntity getDataStore(ImageStoreVO dataStoreVO, ImageStoreDriver imageDataStoreDriver, + ImageStoreProvider provider) { + ImageStoreImpl instance = (ImageStoreImpl)ComponentContext.inject(ImageStoreImpl.class); instance.configure(dataStoreVO, imageDataStoreDriver, provider); return instance; } @@ -154,8 +155,8 @@ public class ImageDataStoreImpl implements ImageDataStore { } @Override - public Long getRegionId() { - return imageDataStoreVO.getRegionId(); + public ImageStore.State getState() { + return imageDataStoreVO.getState(); } @Override diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageStoreLifeCycle.java similarity index 93% rename from engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java rename to engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageStoreLifeCycle.java index a36823959df..121f8c544ca 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageStoreLifeCycle.java @@ -20,5 +20,5 @@ package org.apache.cloudstack.storage.image.store.lifecycle; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; -public interface ImageDataStoreLifeCycle extends DataStoreLifeCycle { +public interface ImageStoreLifeCycle extends DataStoreLifeCycle { } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentTest.java index 2d6b94fdfaf..71f1beb3365 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentTest.java @@ -22,7 +22,7 @@ import java.util.UUID; import javax.inject.Inject; -import org.apache.cloudstack.storage.to.ImageDataStoreTO; +import org.apache.cloudstack.storage.to.ImageStoreTO; import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.TemplateTO; @@ -131,7 +131,7 @@ public class DirectAgentTest extends CloudStackTestNGBase { Mockito.when(primaryStore.getUuid()).thenReturn(this.getLocalStorageUuid()); Mockito.when(image.getPrimaryDataStore()).thenReturn(primaryStore); - ImageDataStoreTO imageStore = Mockito.mock(ImageDataStoreTO.class); + ImageStoreTO imageStore = Mockito.mock(ImageStoreTO.class); Mockito.when(imageStore.getType()).thenReturn("http"); TemplateTO template = Mockito.mock(TemplateTO.class); diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java index 80e48a2d8f1..8c22767377a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java @@ -27,7 +27,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; import org.apache.cloudstack.engine.subsystem.api.storage.Scope; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; import org.springframework.stereotype.Component; import com.cloud.utils.exception.CloudRuntimeException; @@ -37,14 +37,14 @@ public class DataStoreManagerImpl implements DataStoreManager { @Inject PrimaryDataStoreProviderManager primaryStorMgr; @Inject - ImageDataStoreProviderManager imageDataStoreMgr; + ImageStoreProviderManager imageDataStoreMgr; @Override public DataStore getDataStore(long storeId, DataStoreRole role) { if (role == DataStoreRole.Primary) { return primaryStorMgr.getPrimaryDataStore(storeId); } else if (role == DataStoreRole.Image) { - return imageDataStoreMgr.getImageDataStore(storeId); + return imageDataStoreMgr.getImageStore(storeId); } throw new CloudRuntimeException("un recognized type" + role); } @@ -58,7 +58,7 @@ public class DataStoreManagerImpl implements DataStoreManager { if (role == DataStoreRole.Primary) { return primaryStorMgr.getPrimaryDataStore(uuid); } else if (role == DataStoreRole.Image) { - return imageDataStoreMgr.getImageDataStore(uuid); + return imageDataStoreMgr.getImageStore(uuid); } throw new CloudRuntimeException("un recognized type" + role); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java index aa1ace21a76..1bfc5ff02a6 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DataStoreProviderManagerImpl.java @@ -31,13 +31,13 @@ import org.apache.cloudstack.api.response.StorageProviderResponse; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider.DataStoreProviderType; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; import org.apache.cloudstack.storage.datastore.db.DataStoreProviderDao; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -56,7 +56,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto @Inject PrimaryDataStoreProviderManager primaryDataStoreProviderMgr; @Inject - ImageDataStoreProviderManager imageDataStoreProviderMgr; + ImageStoreProviderManager imageDataStoreProviderMgr; @Override public DataStoreProvider getDataStoreProvider(String name) { return providerMap.get(name); @@ -84,7 +84,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto public List getImageDataStoreProviders() { List providers = new ArrayList(); for (DataStoreProvider provider : providerMap.values()) { - if (provider instanceof ImageDataStoreProvider) { + if (provider instanceof ImageStoreProvider) { StorageProviderResponse response = new StorageProviderResponse(); response.setName(provider.getName()); response.setType(DataStoreProvider.DataStoreProviderType.IMAGE.toString()); @@ -123,7 +123,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto primaryDataStoreProviderMgr.registerHostListener(provider.getName(), provider.getHostListener()); } else if (types.contains(DataStoreProviderType.IMAGE)) { - imageDataStoreProviderMgr.registerDriver(provider.getName(), (ImageDataStoreDriver)provider.getDataStoreDriver()); + imageDataStoreProviderMgr.registerDriver(provider.getName(), (ImageStoreDriver)provider.getDataStoreDriver()); } } catch(Exception e) { s_logger.debug("configure provider failed", e); @@ -142,7 +142,7 @@ public class DataStoreProviderManagerImpl extends ManagerBase implements DataSto @Override public DataStoreProvider getDefaultImageDataStoreProvider() { - return this.getDataStoreProvider("cloudstack image data store provider"); + return this.getDataStoreProvider("cloudstack image store provider"); } @Override diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/ImageDataStoreDriver.java b/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java similarity index 93% rename from engine/storage/src/org/apache/cloudstack/storage/image/ImageDataStoreDriver.java rename to engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java index d352d972182..712e1867523 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/ImageDataStoreDriver.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java @@ -20,5 +20,5 @@ package org.apache.cloudstack.storage.image; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; -public interface ImageDataStoreDriver extends DataStoreDriver { +public interface ImageStoreDriver extends DataStoreDriver { } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java index 4d162bbdd09..51c8c439fc2 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java @@ -25,7 +25,7 @@ import java.util.Map; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreInfo; +import org.apache.cloudstack.storage.image.datastore.ImageStoreInfo; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.Storage.ImageFormat; @@ -38,12 +38,12 @@ public class TemplateEntityImpl implements TemplateEntity { this.templateInfo = templateInfo; } - public ImageDataStoreInfo getImageDataStore() { - return (ImageDataStoreInfo)templateInfo.getDataStore(); + public ImageStoreInfo getImageDataStore() { + return (ImageStoreInfo)templateInfo.getDataStore(); } public long getImageDataStoreId() { - return getImageDataStore().getImageDataStoreId(); + return getImageDataStore().getImageStoreId(); } public TemplateInfo getTemplateInfo() { diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java deleted file mode 100644 index e31a644d1c9..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreHelper.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.cloudstack.storage.image.datastore; - -import java.util.Map; - -import javax.inject.Inject; - -import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.springframework.stereotype.Component; - -import com.cloud.storage.ScopeType; -import com.cloud.utils.exception.CloudRuntimeException; - -@Component -public class ImageDataStoreHelper { - @Inject - ImageDataStoreDao imageStoreDao; - public ImageDataStoreVO createImageDataStore(Map params) { - ImageDataStoreVO store = imageStoreDao.findByName((String)params.get("name")); - if (store != null) { - return store; - } - store = new ImageDataStoreVO(); - store.setName((String)params.get("name")); - store.setProtocol((String)params.get("protocol")); - store.setProviderName((String)params.get("providerName")); - store.setScope((ScopeType)params.get("scope")); - store.setUuid((String)params.get("uuid")); - store.setUrl((String)params.get("url")); - store = imageStoreDao.persist(store); - return store; - } - - public boolean deleteImageDataStore(long id) { - ImageDataStoreVO store = imageStoreDao.findById(id); - if (store == null) { - throw new CloudRuntimeException("can't find image store:" + id); - } - - imageStoreDao.remove(id); - return true; - } -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java similarity index 93% rename from engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java rename to engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java index a9b7e9bc5aa..fb1b1d7df2c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStore.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java @@ -26,9 +26,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; -public interface ImageDataStore extends DataStore, ObjectStore { +public interface ImageStoreEntity extends DataStore, ImageStore { TemplateInfo getTemplate(long templateId); VolumeInfo getVolume(long volumeId); SnapshotInfo getSnapshot(long snapshotId); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java new file mode 100644 index 00000000000..30ebd1d1b83 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java @@ -0,0 +1,99 @@ +/* + * 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.cloudstack.storage.image.datastore; + +import java.util.Iterator; +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreDetailVO; +import org.apache.cloudstack.storage.image.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.springframework.stereotype.Component; + +import com.cloud.storage.ImageStore; +import com.cloud.storage.ScopeType; +import com.cloud.utils.exception.CloudRuntimeException; + +@Component +public class ImageStoreHelper { + @Inject + ImageStoreDao imageStoreDao; + @Inject + ImageStoreDetailsDao imageStoreDetailsDao; + + public ImageStoreVO createImageStore(Map params) { + ImageStoreVO store = imageStoreDao.findByName((String)params.get("name")); + if (store != null) { + return store; + } + store = new ImageStoreVO(); + store.setName((String)params.get("name")); + store.setProtocol((String)params.get("protocol")); + store.setProviderName((String)params.get("providerName")); + store.setScope((ScopeType)params.get("scope")); + store.setUuid((String)params.get("uuid")); + store.setUrl((String)params.get("url")); + store.setState(ImageStore.State.Disabled); + store = imageStoreDao.persist(store); + return store; + } + + public ImageStoreVO createImageStore(Map params, Map details) { + ImageStoreVO store = imageStoreDao.findByName((String)params.get("name")); + if (store != null) { + return store; + } + store = new ImageStoreVO(); + store.setName((String)params.get("name")); + store.setProtocol((String)params.get("protocol")); + store.setProviderName((String)params.get("providerName")); + store.setScope((ScopeType)params.get("scope")); + store.setUuid((String)params.get("uuid")); + store.setUrl((String)params.get("url")); + store.setState(ImageStore.State.Disabled); + store = imageStoreDao.persist(store); + + // persist details + if (details != null){ + Iterator keyIter = details.keySet().iterator(); + while (keyIter.hasNext()){ + String key = keyIter.next(); + ImageStoreDetailVO detail = new ImageStoreDetailVO(); + detail.setStoreId(store.getId()); + detail.setName(key); + detail.setValue(details.get(key)); + imageStoreDetailsDao.persist(detail); + } + } + return store; + } + + public boolean deleteImageStore(long id) { + ImageStoreVO store = imageStoreDao.findById(id); + if (store == null) { + throw new CloudRuntimeException("can't find image store:" + id); + } + + imageStoreDao.remove(id); + return true; + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreInfo.java similarity index 91% rename from engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreInfo.java rename to engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreInfo.java index b6b9a2a55d7..c5f7ca98c1d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreInfo.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreInfo.java @@ -20,7 +20,7 @@ package org.apache.cloudstack.storage.image.datastore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -public interface ImageDataStoreInfo extends DataStore { - public long getImageDataStoreId(); +public interface ImageStoreInfo extends DataStore { + public long getImageStoreId(); public String getType(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java similarity index 77% rename from engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreProviderManager.java rename to engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java index 4ab3f3c19d8..d9a733d300f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageDataStoreProviderManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java @@ -21,11 +21,11 @@ package org.apache.cloudstack.storage.image.datastore; import java.util.List; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.ImageStoreDriver; -public interface ImageDataStoreProviderManager { - ImageDataStore getImageDataStore(long dataStoreId); - ImageDataStore getImageDataStore(String uuid); +public interface ImageStoreProviderManager { + ImageStoreEntity getImageStore(long dataStoreId); + ImageStoreEntity getImageStore(String uuid); List getList(); - boolean registerDriver(String uuid, ImageDataStoreDriver driver); + boolean registerDriver(String uuid, ImageStoreDriver driver); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java deleted file mode 100644 index 1b13b7ae4e2..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.cloudstack.storage.image.db; - -import com.cloud.utils.db.GenericDao; - -public interface ImageDataStoreProviderDao extends GenericDao { - public ImageDataStoreProviderVO findByName(String name); -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java deleted file mode 100644 index 0e19dbec1b7..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.cloudstack.storage.image.db; - -import org.springframework.stereotype.Component; - -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.SearchCriteria2; -import com.cloud.utils.db.SearchCriteriaService; -import com.cloud.utils.db.SearchCriteria.Op; - -@Component -public class ImageDataStoreProviderDaoImpl extends GenericDaoBase implements ImageDataStoreProviderDao { - - public ImageDataStoreProviderDaoImpl() { - } - - @Override - public ImageDataStoreProviderVO findByName(String name) { - SearchCriteriaService service = SearchCriteria2.create(ImageDataStoreProviderVO.class); - service.addAnd(service.getEntity().getName(), Op.EQ, name); - return service.find(); - } -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderVO.java deleted file mode 100644 index 5cc5b8ddcef..00000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderVO.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.cloudstack.storage.image.db; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.TableGenerator; - -@Entity -@Table(name = "image_data_store_provider") -public class ImageDataStoreProviderVO { - @Id - @TableGenerator(name = "image_data_store_provider_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "image_data_store_provider_seq", allocationSize = 1) - @Column(name = "id", nullable = false) - private long id; - - @Column(name = "name", nullable = false) - private String name; - - public long getId() { - return this.id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java similarity index 87% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java index d7358be9140..18841bc16e2 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java @@ -20,6 +20,6 @@ package org.apache.cloudstack.storage.image.db; import com.cloud.utils.db.GenericDao; -public interface ImageDataStoreDao extends GenericDao { - public ImageDataStoreVO findByName(String name); +public interface ImageStoreDao extends GenericDao { + public ImageStoreVO findByName(String name); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java similarity index 80% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java index 3f3e9ca95fb..60d414c893d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java @@ -26,11 +26,11 @@ import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.db.SearchCriteria.Op; @Component -public class ImageDaoStoreDaoImpl extends GenericDaoBase implements ImageDataStoreDao { +public class ImageStoreDaoImpl extends GenericDaoBase implements ImageStoreDao { @Override - public ImageDataStoreVO findByName(String name) { - SearchCriteriaService sc = SearchCriteria2.create(ImageDataStoreVO.class); + public ImageStoreVO findByName(String name) { + SearchCriteriaService sc = SearchCriteria2.create(ImageStoreVO.class); sc.addAnd(sc.getEntity().getName(), Op.EQ, name); return sc.find(); } diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java similarity index 87% rename from engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java index c980cf15693..3afddaa9c24 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.datastore.db; +package org.apache.cloudstack.storage.image.db; import org.apache.cloudstack.api.InternalIdentity; @@ -26,8 +26,8 @@ import javax.persistence.Id; import javax.persistence.Table; @Entity -@Table(name="image_data_store_details") -public class ImageDataStoreDetailVO implements InternalIdentity { +@Table(name="image_store_details") +public class ImageStoreDetailVO implements InternalIdentity { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -42,7 +42,10 @@ public class ImageDataStoreDetailVO implements InternalIdentity { @Column(name="value") String value; - public ImageDataStoreDetailVO(long storeId, String name, String value) { + public ImageStoreDetailVO() { + } + + public ImageStoreDetailVO(long storeId, String name, String value) { this.storeId = storeId; this.name = name; this.value = value; @@ -76,6 +79,5 @@ public class ImageDataStoreDetailVO implements InternalIdentity { this.value = value; } - protected ImageDataStoreDetailVO() { - } + } diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java similarity index 87% rename from engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java index 781efcfb95e..98672904d54 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageDataStoreDetailsDao.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java @@ -14,14 +14,14 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.datastore.db; +package org.apache.cloudstack.storage.image.db; import java.util.Map; import com.cloud.utils.db.GenericDao; -public interface ImageDataStoreDetailsDao extends GenericDao { +public interface ImageStoreDetailsDao extends GenericDao { void update(long storeId, Map details); Map getDetails(long storeId); diff --git a/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java similarity index 70% rename from server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java index 1b3fa46b042..e96d6fd93dc 100644 --- a/server/src/com/cloud/storage/dao/ImageDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.storage.dao; +package org.apache.cloudstack.storage.image.db; import java.util.HashMap; import java.util.List; @@ -22,8 +22,6 @@ import java.util.Map; import javax.ejb.Local; -import org.apache.cloudstack.storage.datastore.db.ImageDataStoreDetailVO; -import org.apache.cloudstack.storage.datastore.db.ImageDataStoreDetailsDao; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; @@ -32,12 +30,12 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @Component -@Local(value=ImageDataStoreDetailsDao.class) -public class ImageDataStoreDaoImpl extends GenericDaoBase implements ImageDataStoreDetailsDao { +@Local(value=ImageStoreDetailsDao.class) +public class ImageStoreDetailsDaoImpl extends GenericDaoBase implements ImageStoreDetailsDao { - protected final SearchBuilder storeSearch; + protected final SearchBuilder storeSearch; - protected ImageDataStoreDaoImpl() { + protected ImageStoreDetailsDaoImpl() { super(); storeSearch = createSearchBuilder(); storeSearch.and("store", storeSearch.entity().getStoreId(), SearchCriteria.Op.EQ); @@ -47,13 +45,13 @@ public class ImageDataStoreDaoImpl extends GenericDaoBase details) { Transaction txn = Transaction.currentTxn(); - SearchCriteria sc = storeSearch.create(); + SearchCriteria sc = storeSearch.create(); sc.setParameters("store", storeId); txn.start(); expunge(sc); for (Map.Entry entry : details.entrySet()) { - ImageDataStoreDetailVO detail = new ImageDataStoreDetailVO(storeId, entry.getKey(), entry.getValue()); + ImageStoreDetailVO detail = new ImageStoreDetailVO(storeId, entry.getKey(), entry.getValue()); persist(detail); } txn.commit(); @@ -61,12 +59,12 @@ public class ImageDataStoreDaoImpl extends GenericDaoBase getDetails(long storeId) { - SearchCriteria sc = storeSearch.create(); + SearchCriteria sc = storeSearch.create(); sc.setParameters("store", storeId); - List details = listBy(sc); + List details = listBy(sc); Map detailsMap = new HashMap(); - for (ImageDataStoreDetailVO detail : details) { + for (ImageStoreDetailVO detail : details) { detailsMap.put(detail.getName(), detail.getValue()); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java similarity index 74% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java index 3e0d8386d9c..36d05e56011 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.storage.image.db; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -27,14 +29,16 @@ import javax.persistence.Table; import javax.persistence.TableGenerator; -import com.cloud.storage.ObjectStore; + +import com.cloud.storage.ImageStore; import com.cloud.storage.ScopeType; +import com.cloud.utils.db.GenericDao; @Entity -@Table(name = "image_data_store") -public class ImageDataStoreVO implements ObjectStore { +@Table(name = "image_store") +public class ImageStoreVO implements ImageStore { @Id - @TableGenerator(name = "image_data_store_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "image_data_store_seq", allocationSize = 1) + @TableGenerator(name = "image_store_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "image_store_seq", allocationSize = 1) @Column(name = "id", nullable = false) private long id; @@ -56,13 +60,19 @@ public class ImageDataStoreVO implements ObjectStore { @Column(name = "data_center_id") private long dcId; - @Column(name = "region_id") - private long regionId; + @Column(name = "state") + @Enumerated(value = EnumType.STRING) + private State state; @Column(name = "scope") @Enumerated(value = EnumType.STRING) private ScopeType scope; + @Column(name=GenericDao.CREATED_COLUMN) + private Date created; + + @Column(name=GenericDao.REMOVED_COLUMN) + private Date removed; public long getId() { return this.id; @@ -100,15 +110,6 @@ public class ImageDataStoreVO implements ObjectStore { return this.dcId; } - - public Long getRegionId() { - return regionId; - } - - public void setRegionId(long regionId) { - this.regionId = regionId; - } - public ScopeType getScope() { return this.scope; } @@ -133,5 +134,30 @@ public class ImageDataStoreVO implements ObjectStore { this.url = url; } + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getRemoved() { + return removed; + } + + public void setRemoved(Date removed) { + this.removed = removed; + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/ImageStoreTO.java similarity index 87% rename from engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java rename to engine/storage/src/org/apache/cloudstack/storage/to/ImageStoreTO.java index b1de88f0e2a..eb6d0883835 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/ImageDataStoreTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/ImageStoreTO.java @@ -16,12 +16,12 @@ // under the License. package org.apache.cloudstack.storage.to; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreInfo; +import org.apache.cloudstack.storage.image.datastore.ImageStoreInfo; -public class ImageDataStoreTO { +public class ImageStoreTO { private final String type; private final String uri; - public ImageDataStoreTO(ImageDataStoreInfo dataStore) { + public ImageStoreTO(ImageStoreInfo dataStore) { this.type = dataStore.getType(); this.uri = dataStore.getUri(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java index bc55ea8c3ea..d7b146bd0bc 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java @@ -18,19 +18,19 @@ package org.apache.cloudstack.storage.to; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreInfo; +import org.apache.cloudstack.storage.image.datastore.ImageStoreInfo; public class TemplateTO { private final String path; private final String uuid; private DiskFormat diskType; - private final ImageDataStoreTO imageDataStore; + private final ImageStoreTO imageDataStore; public TemplateTO(TemplateInfo template) { this.path = null; this.uuid = template.getUuid(); //this.diskType = template.getDiskType(); - this.imageDataStore = new ImageDataStoreTO((ImageDataStoreInfo)template.getDataStore()); + this.imageDataStore = new ImageStoreTO((ImageStoreInfo)template.getDataStore()); } public String getPath() { @@ -45,7 +45,7 @@ public class TemplateTO { return this.diskType; } - public ImageDataStoreTO getImageDataStore() { + public ImageStoreTO getImageDataStore() { return this.imageDataStore; } } diff --git a/plugins/pom.xml b/plugins/pom.xml index a4f37bb1cb6..1691549db8a 100755 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -58,6 +58,7 @@ user-authenticators/sha256salted network-elements/dns-notifier storage/image/s3 + storage/image/swift storage/image/default storage/image/sample storage/volume/solidfire diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java similarity index 97% rename from plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java rename to plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java index 1ff395cbecf..e55f0d75749 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageDataStoreDriverImpl.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java @@ -33,7 +33,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcConext; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -64,9 +64,9 @@ import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.swift.SwiftManager; import com.cloud.utils.exception.CloudRuntimeException; -public class CloudStackImageDataStoreDriverImpl implements ImageDataStoreDriver { +public class CloudStackImageStoreDriverImpl implements ImageStoreDriver { private static final Logger s_logger = Logger - .getLogger(CloudStackImageDataStoreDriverImpl.class); + .getLogger(CloudStackImageStoreDriverImpl.class); @Inject VMTemplateZoneDao templateZoneDao; @Inject diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java similarity index 84% rename from plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java rename to plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java index f111dfaf8df..fbd9909150a 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageDataStoreLifeCycle.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java @@ -29,11 +29,11 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import org.apache.log4j.Logger; import com.cloud.agent.api.StoragePoolInfo; @@ -49,18 +49,18 @@ import com.cloud.resource.ServerResource; import com.cloud.storage.ScopeType; import com.cloud.utils.UriUtils; -public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycle { +public class CloudStackImageStoreLifeCycleImpl implements ImageStoreLifeCycle { private static final Logger s_logger = Logger - .getLogger(CloudStackImageDataStoreLifeCycle.class); + .getLogger(CloudStackImageStoreLifeCycleImpl.class); @Inject protected ResourceManager _resourceMgr; @Inject - protected ImageDataStoreDao imageStoreDao; + protected ImageStoreDao imageStoreDao; @Inject - ImageDataStoreHelper imageStoreHelper; + ImageStoreHelper imageStoreHelper; @Inject - ImageDataStoreProviderManager imageStoreMgr; + ImageStoreProviderManager imageStoreMgr; protected List _discoverers; public List getDiscoverers() { @@ -70,7 +70,7 @@ public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycl this._discoverers = _discoverers; } - public CloudStackImageDataStoreLifeCycle() { + public CloudStackImageStoreLifeCycleImpl() { } @@ -80,6 +80,7 @@ public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycl Long dcId = (Long) dsInfos.get("zoneId"); String url = (String) dsInfos.get("url"); String providerName = (String)dsInfos.get("providerName"); + Map details = (Map)dsInfos.get("details"); s_logger.info("Trying to add a new host at " + url + " in data center " + dcId); @@ -112,11 +113,11 @@ public class CloudStackImageDataStoreLifeCycle implements ImageDataStoreLifeCycl imageStoreParameters.put("zoneId", dcId); imageStoreParameters.put("url", url); imageStoreParameters.put("protocol", uri.getScheme().toLowerCase()); - imageStoreParameters.put("scope", ScopeType.ZONE); + imageStoreParameters.put("scope", ScopeType.ZONE); // default cloudstack provider only supports zone-wide image store imageStoreParameters.put("providerName", providerName); - ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(imageStoreParameters); - return imageStoreMgr.getImageDataStore(ids.getId()); + ImageStoreVO ids = imageStoreHelper.createImageStore(imageStoreParameters, details); + return imageStoreMgr.getImageStore(ids.getId()); } diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageStoreProviderImpl.java similarity index 60% rename from plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java rename to plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageStoreProviderImpl.java index 1e88da3f583..058dd27a039 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageDataStoreProvider.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/provider/CloudStackImageStoreProviderImpl.java @@ -18,39 +18,35 @@ */ package org.apache.cloudstack.storage.datastore.provider; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.UUID; - import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; -import org.apache.cloudstack.storage.datastore.driver.CloudStackImageDataStoreDriverImpl; -import org.apache.cloudstack.storage.datastore.lifecycle.CloudStackImageDataStoreLifeCycle; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.datastore.driver.CloudStackImageStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.CloudStackImageStoreLifeCycleImpl; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import org.springframework.stereotype.Component; -import com.cloud.storage.ScopeType; import com.cloud.utils.component.ComponentContext; @Component -public class CloudStackImageDataStoreProvider implements ImageDataStoreProvider { +public class CloudStackImageStoreProviderImpl implements ImageStoreProvider { - private final String name = "cloudstack image data store provider"; - protected ImageDataStoreLifeCycle lifeCycle; - protected ImageDataStoreDriver driver; + private final String providerName = "cloudstack image store provider"; + protected ImageStoreLifeCycle lifeCycle; + protected ImageStoreDriver driver; @Inject - ImageDataStoreProviderManager storeMgr; + ImageStoreProviderManager storeMgr; @Inject - ImageDataStoreHelper helper; + ImageStoreHelper helper; @Override public DataStoreLifeCycle getDataStoreLifeCycle() { @@ -59,25 +55,16 @@ public class CloudStackImageDataStoreProvider implements ImageDataStoreProvider @Override public String getName() { - return this.name; + return this.providerName; } @Override public boolean configure(Map params) { - lifeCycle = ComponentContext.inject(CloudStackImageDataStoreLifeCycle.class); - driver = ComponentContext.inject(CloudStackImageDataStoreDriverImpl.class); + lifeCycle = ComponentContext.inject(CloudStackImageStoreLifeCycleImpl.class); + driver = ComponentContext.inject(CloudStackImageStoreDriverImpl.class); storeMgr.registerDriver(this.getName(), driver); - Map infos = new HashMap(); - String dataStoreName = UUID.nameUUIDFromBytes(this.name.getBytes()).toString(); - infos.put("name", dataStoreName); - infos.put("uuid", dataStoreName); - infos.put("protocol", "http"); - infos.put("scope", ScopeType.GLOBAL); - infos.put("providerName", this.getName()); - DataStoreLifeCycle lifeCycle = this.getDataStoreLifeCycle(); - lifeCycle.initialize(infos); return true; } diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java new file mode 100644 index 00000000000..c9e85217d99 --- /dev/null +++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java @@ -0,0 +1,250 @@ +/* + * 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.cloudstack.storage.datastore.driver; + +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.framework.async.AsyncRpcConext; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.DeleteSnapshotBackupCommand; +import com.cloud.agent.api.storage.DeleteVolumeCommand; +import com.cloud.agent.api.to.S3TO; +import com.cloud.agent.api.to.SwiftTO; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.storage.RegisterVolumePayload; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; +import com.cloud.storage.VolumeHostVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateHostDao; +import com.cloud.storage.dao.VMTemplateZoneDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeHostDao; +import com.cloud.storage.download.DownloadMonitor; +import com.cloud.storage.s3.S3Manager; +import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.storage.swift.SwiftManager; +import com.cloud.utils.exception.CloudRuntimeException; + +public class S3ImageStoreDriverImpl implements ImageStoreDriver { + private static final Logger s_logger = Logger + .getLogger(S3ImageStoreDriverImpl.class); + @Inject + VMTemplateZoneDao templateZoneDao; + @Inject + VMTemplateDao templateDao; + @Inject DownloadMonitor _downloadMonitor; + @Inject + VMTemplateHostDao _vmTemplateHostDao; + @Inject VolumeDao volumeDao; + @Inject VolumeHostDao volumeHostDao; + @Inject HostDao hostDao; + @Inject SnapshotDao snapshotDao; + @Inject AgentManager agentMgr; + @Inject SnapshotManager snapshotMgr; + @Inject + private SwiftManager _swiftMgr; + @Inject + private S3Manager _s3Mgr; + @Override + public String grantAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Set listObjects(DataStore store) { + // TODO Auto-generated method stub + return null; + } + + class CreateContext extends AsyncRpcConext { + final DataObject data; + public CreateContext(AsyncCompletionCallback callback, DataObject data) { + super(callback); + this.data = data; + } + } + + @Override + public void createAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.TEMPLATE) { + List templateZones = this.templateZoneDao.listByTemplateId(data.getId()); + for (VMTemplateZoneVO templateZone : templateZones) { + VMTemplateVO template = this.templateDao.findById(data.getId()); + _downloadMonitor.downloadTemplateToStorage(template, templateZone.getZoneId()); + } + } else if (data.getType() == DataObjectType.VOLUME) { + VolumeVO vol = this.volumeDao.findById(data.getId()); + VolumeInfo volInfo = (VolumeInfo)data; + RegisterVolumePayload payload = (RegisterVolumePayload)volInfo.getpayload(); + _downloadMonitor.downloadVolumeToStorage(vol, vol.getDataCenterId(), payload.getUrl(), + payload.getChecksum(), ImageFormat.valueOf(payload.getFormat().toUpperCase())); + } + + CreateCmdResult result = new CreateCmdResult(null, null); + callback.complete(result); + } + + private void deleteVolume(DataObject data, AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + VolumeVO vol = volumeDao.findById(data.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Expunging " + vol); + } + + // Find out if the volume is present on secondary storage + VolumeHostVO volumeHost = volumeHostDao.findByVolumeId(vol.getId()); + if (volumeHost != null) { + if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + HostVO ssHost = hostDao.findById(volumeHost.getHostId()); + DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( + ssHost.getStorageUrl(), volumeHost.getInstallPath()); + Answer answer = agentMgr.sendToSecStorage(ssHost, dtCommand); + if (answer == null || !answer.getResult()) { + s_logger.debug("Failed to delete " + + volumeHost + + " due to " + + ((answer == null) ? "answer is null" : answer + .getDetails())); + return; + } + } else if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS) { + s_logger.debug("Volume: " + vol.getName() + + " is currently being uploaded; cant' delete it."); + throw new CloudRuntimeException( + "Please specify a volume that is not currently being uploaded."); + } + volumeHostDao.remove(volumeHost.getId()); + volumeDao.remove(vol.getId()); + CommandResult result = new CommandResult(); + callback.complete(result); + return; + } + } + + private void deleteTemplate(DataObject data, AsyncCompletionCallback callback) { + + } + + private void deleteSnapshot(DataObject data, AsyncCompletionCallback callback) { + Long snapshotId = data.getId(); + SnapshotVO snapshot = this.snapshotDao.findByIdIncludingRemoved(snapshotId); + CommandResult result = new CommandResult(); + if (snapshot == null) { + s_logger.debug("Destroying snapshot " + snapshotId + " backup failed due to unable to find snapshot "); + result.setResult("Unable to find snapshot: " + snapshotId); + callback.complete(result); + return; + } + + try { + String secondaryStoragePoolUrl = this.snapshotMgr.getSecondaryStorageURL(snapshot); + Long dcId = snapshot.getDataCenterId(); + Long accountId = snapshot.getAccountId(); + Long volumeId = snapshot.getVolumeId(); + + String backupOfSnapshot = snapshot.getBackupSnapshotId(); + if (backupOfSnapshot == null) { + callback.complete(result); + return; + } + SwiftTO swift = _swiftMgr.getSwiftTO(snapshot.getSwiftId()); + S3TO s3 = _s3Mgr.getS3TO(); + + DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand( + swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId, + backupOfSnapshot, false); + Answer answer = agentMgr.sendToSSVM(dcId, cmd); + + if ((answer != null) && answer.getResult()) { + snapshot.setBackupSnapshotId(null); + snapshotDao.update(snapshotId, snapshot); + } else if (answer != null) { + result.setResult(answer.getDetails()); + } + } catch (Exception e) { + s_logger.debug("failed to delete snapshot: " + snapshotId + ": " + e.toString()); + result.setResult(e.toString()); + } + callback.complete(result); + } + + @Override + public void deleteAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.VOLUME) { + deleteVolume(data, callback); + } else if (data.getType() == DataObjectType.TEMPLATE) { + deleteTemplate(data, callback); + } else if (data.getType() == DataObjectType.SNAPSHOT) { + deleteSnapshot(data, callback); + } + } + + @Override + public void copyAsync(DataObject srcdata, DataObject destData, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + + @Override + public boolean canCopy(DataObject srcData, DataObject destData) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void resize(DataObject data, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + +} diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java new file mode 100644 index 00000000000..7d22df5006b --- /dev/null +++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java @@ -0,0 +1,177 @@ +// 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.cloudstack.storage.datastore.lifecycle; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; +import org.apache.log4j.Logger; + +import com.cloud.agent.api.StoragePoolInfo; +import com.cloud.exception.DiscoveryException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase; +import com.cloud.resource.Discoverer; +import com.cloud.resource.ResourceListener; +import com.cloud.resource.ResourceManager; +import com.cloud.resource.ServerResource; +import com.cloud.storage.ScopeType; +import com.cloud.storage.s3.S3Manager; +import com.cloud.utils.UriUtils; + +public class S3ImageStoreLifeCycleImpl implements ImageStoreLifeCycle { + + private static final Logger s_logger = Logger + .getLogger(S3ImageStoreLifeCycleImpl.class); + @Inject + protected ResourceManager _resourceMgr; + @Inject + protected ImageStoreDao imageStoreDao; + @Inject + ImageStoreHelper imageStoreHelper; + @Inject + ImageStoreProviderManager imageStoreMgr; + @Inject + S3Manager _s3Mgr; + + protected List _discoverers; + public List getDiscoverers() { + return _discoverers; + } + public void setDiscoverers(List _discoverers) { + this._discoverers = _discoverers; + } + + public S3ImageStoreLifeCycleImpl() { + } + + + @Override + public DataStore initialize(Map dsInfos) { + + Long dcId = (Long) dsInfos.get("zoneId"); + String url = (String) dsInfos.get("url"); + String providerName = (String)dsInfos.get("providerName"); + ScopeType scope = (ScopeType)dsInfos.get("scope"); + Map details = (Map)dsInfos.get("details"); + + s_logger.info("Trying to add a S3 store in data center " + dcId); + + try{ + // verify S3 parameters + _s3Mgr.verifyS3Fields(details); + } + catch (DiscoveryException ex){ + throw new InvalidParameterValueException("failed to verify S3 parameters!"); + } + + Map imageStoreParameters = new HashMap(); + imageStoreParameters.put("name", url); + imageStoreParameters.put("zoneId", dcId); + imageStoreParameters.put("url", url); + String protocol = "http"; + String useHttps = details.get(ApiConstants.S3_HTTPS_FLAG); + if (useHttps != null && Boolean.parseBoolean(useHttps)){ + protocol = "https"; + } + imageStoreParameters.put("protocol", protocol); + if (scope != null) { + imageStoreParameters.put("scope", scope); + } else { + imageStoreParameters.put("scope", ScopeType.REGION); + } + imageStoreParameters.put("providerName", providerName); + + ImageStoreVO ids = imageStoreHelper.createImageStore(imageStoreParameters, details); + return imageStoreMgr.getImageStore(ids.getId()); + } + + + @Override + public boolean attachCluster(DataStore store, ClusterScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachHost(DataStore store, HostScope scope, + StoragePoolInfo existingInfo) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachZone(DataStore dataStore, ZoneScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean dettach() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean unmanaged() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean maintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean cancelMaintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean deleteDataStore(DataStore store) { + // TODO Auto-generated method stub + return false; + } +} diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/provider/S3ImageStoreProviderImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/provider/S3ImageStoreProviderImpl.java new file mode 100644 index 00000000000..820882dd75a --- /dev/null +++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/provider/S3ImageStoreProviderImpl.java @@ -0,0 +1,90 @@ +/* + * 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.cloudstack.storage.datastore.provider; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.datastore.driver.S3ImageStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.S3ImageStoreLifeCycleImpl; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; +import org.springframework.stereotype.Component; + +import com.cloud.storage.ScopeType; +import com.cloud.utils.component.ComponentContext; + +@Component +public class S3ImageStoreProviderImpl implements ImageStoreProvider { + + private final String providerName = "S3 image store provider"; + protected ImageStoreLifeCycle lifeCycle; + protected ImageStoreDriver driver; + @Inject + ImageStoreProviderManager storeMgr; + @Inject + ImageStoreHelper helper; + + @Override + public DataStoreLifeCycle getDataStoreLifeCycle() { + return lifeCycle; + } + + @Override + public String getName() { + return this.providerName; + } + + @Override + public boolean configure(Map params) { + lifeCycle = ComponentContext.inject(S3ImageStoreLifeCycleImpl.class); + driver = ComponentContext.inject(S3ImageStoreDriverImpl.class); + storeMgr.registerDriver(this.getName(), driver); + return true; + } + + @Override + public DataStoreDriver getDataStoreDriver() { + return this.driver; + } + + @Override + public HypervisorHostListener getHostListener() { + return null; + } + + @Override + public Set getTypes() { + Set types = new HashSet(); + types.add(DataStoreProviderType.IMAGE); + return types; + } + +} diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageStoreDriverImpl.java similarity index 96% rename from plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java rename to plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageStoreDriverImpl.java index cf42ac34da8..dc2e58c99cd 100644 --- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageDataStoreDriverImpl.java +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/driver/SampleImageStoreDriverImpl.java @@ -33,17 +33,17 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.command.CreateObjectAnswer; import org.apache.cloudstack.storage.command.CreateObjectCommand; import org.apache.cloudstack.storage.endpoint.EndPointSelector; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; +import org.apache.cloudstack.storage.image.ImageStoreDriver; import com.cloud.storage.dao.VMTemplateDao; //http-read-only based image store -public class SampleImageDataStoreDriverImpl implements ImageDataStoreDriver { +public class SampleImageStoreDriverImpl implements ImageStoreDriver { @Inject EndPointSelector selector; @Inject VMTemplateDao imageDataDao; - public SampleImageDataStoreDriverImpl() { + public SampleImageStoreDriverImpl() { } @Override diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java similarity index 78% rename from plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java rename to plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java index c1e08912718..8c61f036a16 100644 --- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageDataStoreLifeCycle.java +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java @@ -24,29 +24,29 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageDataStoreDao; -import org.apache.cloudstack.storage.image.db.ImageDataStoreVO; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import com.cloud.agent.api.StoragePoolInfo; -public class SampleImageDataStoreLifeCycle implements ImageDataStoreLifeCycle { +public class SampleImageStoreLifeCycleImpl implements ImageStoreLifeCycle { @Inject - protected ImageDataStoreDao imageStoreDao; + protected ImageStoreDao imageStoreDao; @Inject - ImageDataStoreHelper imageStoreHelper; + ImageStoreHelper imageStoreHelper; @Inject - ImageDataStoreProviderManager imageStoreMgr; - public SampleImageDataStoreLifeCycle() { + ImageStoreProviderManager imageStoreMgr; + public SampleImageStoreLifeCycleImpl() { } @Override public DataStore initialize(Map dsInfos) { - ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(dsInfos); - return imageStoreMgr.getImageDataStore(ids.getId()); + ImageStoreVO ids = imageStoreHelper.createImageStore(dsInfos); + return imageStoreMgr.getImageStore(ids.getId()); } diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageStoreProviderImpl.java similarity index 77% rename from plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java rename to plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageStoreProviderImpl.java index 2ad9602a7bb..073a157cb3d 100644 --- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageDataStoreProvider.java +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/provider/SampleImageStoreProviderImpl.java @@ -27,21 +27,21 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; -import org.apache.cloudstack.engine.subsystem.api.storage.ImageDataStoreProvider; -import org.apache.cloudstack.storage.datastore.driver.SampleImageDataStoreDriverImpl; -import org.apache.cloudstack.storage.datastore.lifecycle.SampleImageDataStoreLifeCycle; -import org.apache.cloudstack.storage.image.ImageDataStoreDriver; -import org.apache.cloudstack.storage.image.datastore.ImageDataStoreProviderManager; -import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.datastore.driver.SampleImageStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.SampleImageStoreLifeCycleImpl; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import com.cloud.utils.component.ComponentContext; -public class SampleImageDataStoreProvider implements ImageDataStoreProvider { +public class SampleImageStoreProviderImpl implements ImageStoreProvider { private final String name = "sample image data store provider"; - protected ImageDataStoreLifeCycle lifeCycle; - protected ImageDataStoreDriver driver; + protected ImageStoreLifeCycle lifeCycle; + protected ImageStoreDriver driver; @Inject - ImageDataStoreProviderManager storeMgr; + ImageStoreProviderManager storeMgr; long id; String uuid; @Override @@ -56,8 +56,8 @@ public class SampleImageDataStoreProvider implements ImageDataStoreProvider { @Override public boolean configure(Map params) { - lifeCycle = ComponentContext.inject(SampleImageDataStoreLifeCycle.class); - driver = ComponentContext.inject(SampleImageDataStoreDriverImpl.class); + lifeCycle = ComponentContext.inject(SampleImageStoreLifeCycleImpl.class); + driver = ComponentContext.inject(SampleImageStoreDriverImpl.class); storeMgr.registerDriver(this.getName(), driver); return true; diff --git a/plugins/storage/image/swift/pom.xml b/plugins/storage/image/swift/pom.xml new file mode 100644 index 00000000000..27ebbe5c5e7 --- /dev/null +++ b/plugins/storage/image/swift/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + cloud-plugin-storage-image-swift + Apache CloudStack Plugin - Storage Image Swift provider + + org.apache.cloudstack + cloudstack-plugins + 4.2.0-SNAPSHOT + ../../../pom.xml + + + + org.apache.cloudstack + cloud-engine-storage-image + ${project.version} + + + mysql + mysql-connector-java + ${cs.mysql.version} + provided + + + + install + src + test + + + maven-surefire-plugin + + true + + + + integration-test + + test + + + + + + + diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java new file mode 100644 index 00000000000..168e23a0535 --- /dev/null +++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java @@ -0,0 +1,250 @@ +/* + * 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.cloudstack.storage.datastore.driver; + +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; +import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.framework.async.AsyncRpcConext; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.DeleteSnapshotBackupCommand; +import com.cloud.agent.api.storage.DeleteVolumeCommand; +import com.cloud.agent.api.to.S3TO; +import com.cloud.agent.api.to.SwiftTO; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.storage.RegisterVolumePayload; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; +import com.cloud.storage.VolumeHostVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateHostDao; +import com.cloud.storage.dao.VMTemplateZoneDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeHostDao; +import com.cloud.storage.download.DownloadMonitor; +import com.cloud.storage.s3.S3Manager; +import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.storage.swift.SwiftManager; +import com.cloud.utils.exception.CloudRuntimeException; + +public class SwiftImageStoreDriverImpl implements ImageStoreDriver { + private static final Logger s_logger = Logger + .getLogger(SwiftImageStoreDriverImpl.class); + @Inject + VMTemplateZoneDao templateZoneDao; + @Inject + VMTemplateDao templateDao; + @Inject DownloadMonitor _downloadMonitor; + @Inject + VMTemplateHostDao _vmTemplateHostDao; + @Inject VolumeDao volumeDao; + @Inject VolumeHostDao volumeHostDao; + @Inject HostDao hostDao; + @Inject SnapshotDao snapshotDao; + @Inject AgentManager agentMgr; + @Inject SnapshotManager snapshotMgr; + @Inject + private SwiftManager _swiftMgr; + @Inject + private S3Manager _s3Mgr; + @Override + public String grantAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean revokeAccess(DataObject data, EndPoint ep) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Set listObjects(DataStore store) { + // TODO Auto-generated method stub + return null; + } + + class CreateContext extends AsyncRpcConext { + final DataObject data; + public CreateContext(AsyncCompletionCallback callback, DataObject data) { + super(callback); + this.data = data; + } + } + + @Override + public void createAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.TEMPLATE) { + List templateZones = this.templateZoneDao.listByTemplateId(data.getId()); + for (VMTemplateZoneVO templateZone : templateZones) { + VMTemplateVO template = this.templateDao.findById(data.getId()); + _downloadMonitor.downloadTemplateToStorage(template, templateZone.getZoneId()); + } + } else if (data.getType() == DataObjectType.VOLUME) { + VolumeVO vol = this.volumeDao.findById(data.getId()); + VolumeInfo volInfo = (VolumeInfo)data; + RegisterVolumePayload payload = (RegisterVolumePayload)volInfo.getpayload(); + _downloadMonitor.downloadVolumeToStorage(vol, vol.getDataCenterId(), payload.getUrl(), + payload.getChecksum(), ImageFormat.valueOf(payload.getFormat().toUpperCase())); + } + + CreateCmdResult result = new CreateCmdResult(null, null); + callback.complete(result); + } + + private void deleteVolume(DataObject data, AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + VolumeVO vol = volumeDao.findById(data.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Expunging " + vol); + } + + // Find out if the volume is present on secondary storage + VolumeHostVO volumeHost = volumeHostDao.findByVolumeId(vol.getId()); + if (volumeHost != null) { + if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + HostVO ssHost = hostDao.findById(volumeHost.getHostId()); + DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( + ssHost.getStorageUrl(), volumeHost.getInstallPath()); + Answer answer = agentMgr.sendToSecStorage(ssHost, dtCommand); + if (answer == null || !answer.getResult()) { + s_logger.debug("Failed to delete " + + volumeHost + + " due to " + + ((answer == null) ? "answer is null" : answer + .getDetails())); + return; + } + } else if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS) { + s_logger.debug("Volume: " + vol.getName() + + " is currently being uploaded; cant' delete it."); + throw new CloudRuntimeException( + "Please specify a volume that is not currently being uploaded."); + } + volumeHostDao.remove(volumeHost.getId()); + volumeDao.remove(vol.getId()); + CommandResult result = new CommandResult(); + callback.complete(result); + return; + } + } + + private void deleteTemplate(DataObject data, AsyncCompletionCallback callback) { + + } + + private void deleteSnapshot(DataObject data, AsyncCompletionCallback callback) { + Long snapshotId = data.getId(); + SnapshotVO snapshot = this.snapshotDao.findByIdIncludingRemoved(snapshotId); + CommandResult result = new CommandResult(); + if (snapshot == null) { + s_logger.debug("Destroying snapshot " + snapshotId + " backup failed due to unable to find snapshot "); + result.setResult("Unable to find snapshot: " + snapshotId); + callback.complete(result); + return; + } + + try { + String secondaryStoragePoolUrl = this.snapshotMgr.getSecondaryStorageURL(snapshot); + Long dcId = snapshot.getDataCenterId(); + Long accountId = snapshot.getAccountId(); + Long volumeId = snapshot.getVolumeId(); + + String backupOfSnapshot = snapshot.getBackupSnapshotId(); + if (backupOfSnapshot == null) { + callback.complete(result); + return; + } + SwiftTO swift = _swiftMgr.getSwiftTO(snapshot.getSwiftId()); + S3TO s3 = _s3Mgr.getS3TO(); + + DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand( + swift, s3, secondaryStoragePoolUrl, dcId, accountId, volumeId, + backupOfSnapshot, false); + Answer answer = agentMgr.sendToSSVM(dcId, cmd); + + if ((answer != null) && answer.getResult()) { + snapshot.setBackupSnapshotId(null); + snapshotDao.update(snapshotId, snapshot); + } else if (answer != null) { + result.setResult(answer.getDetails()); + } + } catch (Exception e) { + s_logger.debug("failed to delete snapshot: " + snapshotId + ": " + e.toString()); + result.setResult(e.toString()); + } + callback.complete(result); + } + + @Override + public void deleteAsync(DataObject data, + AsyncCompletionCallback callback) { + if (data.getType() == DataObjectType.VOLUME) { + deleteVolume(data, callback); + } else if (data.getType() == DataObjectType.TEMPLATE) { + deleteTemplate(data, callback); + } else if (data.getType() == DataObjectType.SNAPSHOT) { + deleteSnapshot(data, callback); + } + } + + @Override + public void copyAsync(DataObject srcdata, DataObject destData, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + + @Override + public boolean canCopy(DataObject srcData, DataObject destData) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void resize(DataObject data, + AsyncCompletionCallback callback) { + // TODO Auto-generated method stub + + } + +} diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java new file mode 100644 index 00000000000..62dbfaebce8 --- /dev/null +++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java @@ -0,0 +1,161 @@ +// 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.cloudstack.storage.datastore.lifecycle; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.db.ImageStoreDao; +import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; +import org.apache.log4j.Logger; + +import com.cloud.agent.api.StoragePoolInfo; +import com.cloud.exception.DiscoveryException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.hypervisor.kvm.discoverer.KvmDummyResourceBase; +import com.cloud.resource.Discoverer; +import com.cloud.resource.ResourceListener; +import com.cloud.resource.ResourceManager; +import com.cloud.resource.ServerResource; +import com.cloud.storage.ScopeType; +import com.cloud.utils.UriUtils; + +public class SwiftImageStoreLifeCycleImpl implements ImageStoreLifeCycle { + + private static final Logger s_logger = Logger + .getLogger(SwiftImageStoreLifeCycleImpl.class); + @Inject + protected ResourceManager _resourceMgr; + @Inject + protected ImageStoreDao imageStoreDao; + @Inject + ImageStoreHelper imageStoreHelper; + @Inject + ImageStoreProviderManager imageStoreMgr; + + protected List _discoverers; + public List getDiscoverers() { + return _discoverers; + } + public void setDiscoverers(List _discoverers) { + this._discoverers = _discoverers; + } + + public SwiftImageStoreLifeCycleImpl() { + } + + + @Override + public DataStore initialize(Map dsInfos) { + + Long dcId = (Long) dsInfos.get("zoneId"); + String url = (String) dsInfos.get("url"); + ScopeType scope = (ScopeType)dsInfos.get("scope"); + String providerName = (String)dsInfos.get("providerName"); + Map details = (Map)dsInfos.get("details"); + + s_logger.info("Trying to add a swift store at " + url + " in data center " + dcId); + + // just need to insert an entry in DB + Map imageStoreParameters = new HashMap(); + imageStoreParameters.put("name", url); + imageStoreParameters.put("zoneId", dcId); + imageStoreParameters.put("url", url); + imageStoreParameters.put("protocol", "http"); + if (scope != null) { + imageStoreParameters.put("scope", scope); + } else { + imageStoreParameters.put("scope", ScopeType.REGION); + } + imageStoreParameters.put("providerName", providerName); + + ImageStoreVO ids = imageStoreHelper.createImageStore(imageStoreParameters); + return imageStoreMgr.getImageStore(ids.getId()); + } + + + @Override + public boolean attachCluster(DataStore store, ClusterScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachHost(DataStore store, HostScope scope, + StoragePoolInfo existingInfo) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean attachZone(DataStore dataStore, ZoneScope scope) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean dettach() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean unmanaged() { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean maintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean cancelMaintain(DataStore store) { + // TODO Auto-generated method stub + return false; + } + + + @Override + public boolean deleteDataStore(DataStore store) { + // TODO Auto-generated method stub + return false; + } +} diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/provider/SwiftImageStoreProviderImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/provider/SwiftImageStoreProviderImpl.java new file mode 100644 index 00000000000..625fcffb7ff --- /dev/null +++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/provider/SwiftImageStoreProviderImpl.java @@ -0,0 +1,92 @@ +/* + * 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.cloudstack.storage.datastore.provider; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import javax.inject.Inject; + +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; +import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener; +import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.datastore.driver.SwiftImageStoreDriverImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.SwiftImageStoreLifeCycleImpl; +import org.apache.cloudstack.storage.image.ImageStoreDriver; +import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; +import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; +import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; +import org.springframework.stereotype.Component; + +import com.cloud.storage.ScopeType; +import com.cloud.utils.component.ComponentContext; + +@Component +public class SwiftImageStoreProviderImpl implements ImageStoreProvider { + + private final String providerName = "Swift image store provider"; + protected ImageStoreLifeCycle lifeCycle; + protected ImageStoreDriver driver; + @Inject + ImageStoreProviderManager storeMgr; + @Inject + ImageStoreHelper helper; + + @Override + public DataStoreLifeCycle getDataStoreLifeCycle() { + return lifeCycle; + } + + @Override + public String getName() { + return this.providerName; + } + + @Override + public boolean configure(Map params) { + lifeCycle = ComponentContext.inject(SwiftImageStoreLifeCycleImpl.class); + driver = ComponentContext.inject(SwiftImageStoreDriverImpl.class); + + storeMgr.registerDriver(this.getName(), driver); + + return true; + } + + @Override + public DataStoreDriver getDataStoreDriver() { + return this.driver; + } + + @Override + public HypervisorHostListener getHostListener() { + return null; + } + + @Override + public Set getTypes() { + Set types = new HashSet(); + types.add(DataStoreProviderType.IMAGE); + return types; + } + +} diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 41f0759152f..6b8607f6a85 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -34,7 +34,7 @@ import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; -import org.apache.cloudstack.api.response.ObjectStoreResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.ProjectAccountResponse; import org.apache.cloudstack.api.response.ProjectInvitationResponse; import org.apache.cloudstack.api.response.ProjectResponse; @@ -56,7 +56,7 @@ import com.cloud.api.query.dao.DataCenterJoinDao; import com.cloud.api.query.dao.DiskOfferingJoinDao; import com.cloud.api.query.dao.DomainRouterJoinDao; import com.cloud.api.query.dao.HostJoinDao; -import com.cloud.api.query.dao.ImageDataStoreJoinDao; +import com.cloud.api.query.dao.ImageStoreJoinDao; import com.cloud.api.query.dao.InstanceGroupJoinDao; import com.cloud.api.query.dao.ProjectAccountJoinDao; import com.cloud.api.query.dao.ProjectInvitationJoinDao; @@ -75,7 +75,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; -import com.cloud.api.query.vo.ImageDataStoreJoinVO; +import com.cloud.api.query.vo.ImageStoreJoinVO; import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.api.query.vo.ProjectInvitationJoinVO; @@ -208,6 +208,7 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.storage.ImageStore; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; import com.cloud.storage.Storage.ImageFormat; @@ -365,7 +366,7 @@ public class ApiDBUtils { static HostJoinDao _hostJoinDao; static VolumeJoinDao _volJoinDao; static StoragePoolJoinDao _poolJoinDao; - static ImageDataStoreJoinDao _imageStoreJoinDao; + static ImageStoreJoinDao _imageStoreJoinDao; static AccountJoinDao _accountJoinDao; static AsyncJobJoinDao _jobJoinDao; @@ -470,7 +471,7 @@ public class ApiDBUtils { @Inject private HostJoinDao hostJoinDao; @Inject private VolumeJoinDao volJoinDao; @Inject private StoragePoolJoinDao poolJoinDao; - @Inject private ImageDataStoreJoinDao imageStoreJoinDao; + @Inject private ImageStoreJoinDao imageStoreJoinDao; @Inject private AccountJoinDao accountJoinDao; @Inject private AsyncJobJoinDao jobJoinDao; @@ -1541,16 +1542,16 @@ public class ApiDBUtils { return _poolJoinDao.newStoragePoolView(vr); } - public static ObjectStoreResponse newImageStoreResponse(ImageDataStoreJoinVO vr) { - return _imageStoreJoinDao.newObjectStoreResponse(vr); + public static ImageStoreResponse newImageStoreResponse(ImageStoreJoinVO vr) { + return _imageStoreJoinDao.newImageStoreResponse(vr); } - public static ObjectStoreResponse fillImageStoreDetails(ObjectStoreResponse vrData, ImageDataStoreJoinVO vr){ - return _imageStoreJoinDao.setObjectStoreResponse(vrData, vr); + public static ImageStoreResponse fillImageStoreDetails(ImageStoreResponse vrData, ImageStoreJoinVO vr){ + return _imageStoreJoinDao.setImageStoreResponse(vrData, vr); } - public static List newImageStoreView(ObjectStore vr){ - return _imageStoreJoinDao.newObjectStoreView(vr); + public static List newImageStoreView(ImageStore vr){ + return _imageStoreJoinDao.newImageStoreView(vr); } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 03ed97da640..527204556df 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -80,7 +80,7 @@ import org.apache.cloudstack.api.response.NetworkOfferingResponse; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.NicResponse; import org.apache.cloudstack.api.response.NicSecondaryIpResponse; -import org.apache.cloudstack.api.response.ObjectStoreResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.PhysicalNetworkResponse; import org.apache.cloudstack.api.response.PodResponse; import org.apache.cloudstack.api.response.PrivateGatewayResponse; @@ -142,7 +142,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; -import com.cloud.api.query.vo.ImageDataStoreJoinVO; +import com.cloud.api.query.vo.ImageStoreJoinVO; import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.api.query.vo.ProjectInvitationJoinVO; @@ -237,7 +237,7 @@ import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.storage.S3; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; @@ -892,9 +892,9 @@ public class ApiResponseHelper implements ResponseGenerator { @Override - public ObjectStoreResponse createObjectStoreResponse(ObjectStore os) { - List viewStores = ApiDBUtils.newImageStoreView(os); - List listStores = ViewResponseHelper.createObjectStoreResponse(viewStores.toArray(new ImageDataStoreJoinVO[viewStores.size()])); + public ImageStoreResponse createImageStoreResponse(ImageStore os) { + List viewStores = ApiDBUtils.newImageStoreView(os); + List listStores = ViewResponseHelper.createObjectStoreResponse(viewStores.toArray(new ImageStoreJoinVO[viewStores.size()])); assert listStores != null && listStores.size() == 1 : "There should be one image data store returned"; return listStores.get(0); diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java index a1d1bf824a1..90b900c57a3 100644 --- a/server/src/com/cloud/api/query/ViewResponseHelper.java +++ b/server/src/com/cloud/api/query/ViewResponseHelper.java @@ -30,7 +30,7 @@ import org.apache.cloudstack.api.response.DomainRouterResponse; import org.apache.cloudstack.api.response.EventResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; -import org.apache.cloudstack.api.response.ObjectStoreResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.ProjectAccountResponse; import org.apache.cloudstack.api.response.ProjectInvitationResponse; import org.apache.cloudstack.api.response.ProjectResponse; @@ -52,7 +52,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; -import com.cloud.api.query.vo.ImageDataStoreJoinVO; +import com.cloud.api.query.vo.ImageStoreJoinVO; import com.cloud.api.query.vo.InstanceGroupJoinVO; import com.cloud.api.query.vo.ProjectAccountJoinVO; import com.cloud.api.query.vo.ProjectInvitationJoinVO; @@ -265,11 +265,11 @@ public class ViewResponseHelper { return new ArrayList(vrDataList.values()); } - public static List createObjectStoreResponse(ImageDataStoreJoinVO... stores) { - Hashtable vrDataList = new Hashtable(); + public static List createObjectStoreResponse(ImageStoreJoinVO... stores) { + Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data - for (ImageDataStoreJoinVO vr : stores) { - ObjectStoreResponse vrData = vrDataList.get(vr.getId()); + for (ImageStoreJoinVO vr : stores) { + ImageStoreResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this vm vrData = ApiDBUtils.newImageStoreResponse(vr); @@ -280,7 +280,7 @@ public class ViewResponseHelper { } vrDataList.put(vr.getId(), vrData); } - return new ArrayList(vrDataList.values()); + return new ArrayList(vrDataList.values()); } diff --git a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java b/server/src/com/cloud/api/query/dao/ImageStoreJoinDao.java similarity index 62% rename from server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java rename to server/src/com/cloud/api/query/dao/ImageStoreJoinDao.java index b92fbe60f4b..c1f6325c19b 100644 --- a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDao.java +++ b/server/src/com/cloud/api/query/dao/ImageStoreJoinDao.java @@ -18,19 +18,19 @@ package com.cloud.api.query.dao; import java.util.List; -import org.apache.cloudstack.api.response.ObjectStoreResponse; -import com.cloud.api.query.vo.ImageDataStoreJoinVO; -import com.cloud.storage.ObjectStore; +import org.apache.cloudstack.api.response.ImageStoreResponse; +import com.cloud.api.query.vo.ImageStoreJoinVO; +import com.cloud.storage.ImageStore; import com.cloud.utils.db.GenericDao; -public interface ImageDataStoreJoinDao extends GenericDao { +public interface ImageStoreJoinDao extends GenericDao { - ObjectStoreResponse newObjectStoreResponse(ImageDataStoreJoinVO os); + ImageStoreResponse newImageStoreResponse(ImageStoreJoinVO os); - ObjectStoreResponse setObjectStoreResponse(ObjectStoreResponse response, ImageDataStoreJoinVO os); + ImageStoreResponse setImageStoreResponse(ImageStoreResponse response, ImageStoreJoinVO os); - List newObjectStoreView(ObjectStore os); + List newImageStoreView(ImageStore os); - List searchByIds(Long... spIds); + List searchByIds(Long... spIds); } diff --git a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java similarity index 69% rename from server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java rename to server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java index c58f954e03a..b2fa0c20529 100644 --- a/server/src/com/cloud/api/query/dao/ImageDataStoreJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java @@ -22,33 +22,33 @@ import java.util.List; import javax.ejb.Local; import javax.inject.Inject; -import org.apache.cloudstack.api.response.ObjectStoreDetailResponse; -import org.apache.cloudstack.api.response.ObjectStoreResponse; +import org.apache.cloudstack.api.response.ImageStoreDetailResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.api.query.vo.ImageDataStoreJoinVO; +import com.cloud.api.query.vo.ImageStoreJoinVO; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @Component -@Local(value={ImageDataStoreJoinDao.class}) -public class ImageDataStoreJoinDaoImpl extends GenericDaoBase implements ImageDataStoreJoinDao { - public static final Logger s_logger = Logger.getLogger(ImageDataStoreJoinDaoImpl.class); +@Local(value={ImageStoreJoinDao.class}) +public class ImageStoreJoinDaoImpl extends GenericDaoBase implements ImageStoreJoinDao { + public static final Logger s_logger = Logger.getLogger(ImageStoreJoinDaoImpl.class); @Inject private ConfigurationDao _configDao; - private final SearchBuilder dsSearch; + private final SearchBuilder dsSearch; - private final SearchBuilder dsIdSearch; + private final SearchBuilder dsIdSearch; - protected ImageDataStoreJoinDaoImpl() { + protected ImageStoreJoinDaoImpl() { dsSearch = createSearchBuilder(); dsSearch.and("idIN", dsSearch.entity().getId(), SearchCriteria.Op.IN); @@ -66,8 +66,8 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase 0 ){ - ObjectStoreDetailResponse osdResponse = new ObjectStoreDetailResponse(detailName, ids.getDetailValue()); + ImageStoreDetailResponse osdResponse = new ImageStoreDetailResponse(detailName, ids.getDetailValue()); osResponse.addDetail(osdResponse); } - osResponse.setObjectName("objectstore"); + osResponse.setObjectName("imagestore"); return osResponse; } @@ -93,10 +92,10 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase 0 ){ - ObjectStoreDetailResponse osdResponse = new ObjectStoreDetailResponse(detailName, ids.getDetailValue()); + ImageStoreDetailResponse osdResponse = new ImageStoreDetailResponse(detailName, ids.getDetailValue()); response.addDetail(osdResponse); } return response; @@ -105,8 +104,8 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase newObjectStoreView(ObjectStore os) { - SearchCriteria sc = dsIdSearch.create(); + public List newImageStoreView(ImageStore os) { + SearchCriteria sc = dsIdSearch.create(); sc.setParameters("id", os.getId()); return searchIncludingRemoved(sc, null, null, false); @@ -115,7 +114,7 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase searchByIds(Long... spIds) { + public List searchByIds(Long... spIds) { // set detail batch query size int DETAILS_BATCH_SIZE = 2000; String batchCfg = _configDao.getValue("detail.batch.query.size"); @@ -123,7 +122,7 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase uvList = new ArrayList(); + List uvList = new ArrayList(); // query details by batches int curr_index = 0; if ( spIds.length > DETAILS_BATCH_SIZE ){ @@ -132,9 +131,9 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase sc = dsSearch.create(); + SearchCriteria sc = dsSearch.create(); sc.setParameters("idIN", ids); - List vms = searchIncludingRemoved(sc, null, null, false); + List vms = searchIncludingRemoved(sc, null, null, false); if (vms != null) { uvList.addAll(vms); } @@ -148,9 +147,9 @@ public class ImageDataStoreJoinDaoImpl extends GenericDaoBase sc = dsSearch.create(); + SearchCriteria sc = dsSearch.create(); sc.setParameters("idIN", ids); - List vms = searchIncludingRemoved(sc, null, null, false); + List vms = searchIncludingRemoved(sc, null, null, false); if (vms != null) { uvList.addAll(vms); } diff --git a/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java b/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java similarity index 87% rename from server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java rename to server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java index 5858dffb148..62c4a8f1a13 100644 --- a/server/src/com/cloud/api/query/vo/ImageDataStoreJoinVO.java +++ b/server/src/com/cloud/api/query/vo/ImageStoreJoinVO.java @@ -22,6 +22,8 @@ import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; + +import com.cloud.storage.ImageStore; import com.cloud.storage.ScopeType; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; @@ -31,8 +33,8 @@ import org.apache.cloudstack.api.InternalIdentity; * */ @Entity -@Table(name="image_data_store_view") -public class ImageDataStoreJoinVO extends BaseViewVO implements InternalIdentity, Identity { +@Table(name="image_store_view") +public class ImageStoreJoinVO extends BaseViewVO implements InternalIdentity, Identity { @Id @Column(name="id") @@ -66,11 +68,8 @@ public class ImageDataStoreJoinVO extends BaseViewVO implements InternalIdentity @Column(name="data_center_name") private String zoneName; - @Column(name="region_id") - private long regionId; - - @Column(name="region_name") - private String regionName; + @Column(name="state") + private ImageStore.State state; @Column(name="detail_name") private String detailName; @@ -160,20 +159,13 @@ public class ImageDataStoreJoinVO extends BaseViewVO implements InternalIdentity this.scope = scope; } - public long getRegionId() { - return regionId; + + public ImageStore.State getState() { + return state; } - public void setRegionId(long regionId) { - this.regionId = regionId; - } - - public String getRegionName() { - return regionName; - } - - public void setRegionName(String regionName) { - this.regionName = regionName; + public void setState(ImageStore.State state) { + this.state = state; } public void setName(String name) { diff --git a/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java b/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java index bab39907ebe..004ba3dd1e2 100644 --- a/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java +++ b/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java @@ -25,13 +25,14 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; import com.cloud.org.Cluster; +import com.cloud.storage.ScopeType; import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.db.GenericDao; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; + /** * Storage Pool DB view. @@ -125,7 +126,7 @@ public class StoragePoolJoinVO extends BaseViewVO implements InternalIdentity, I @Column(name="job_status") private int jobStatus; - + @Column(name = "scope") @Enumerated(value = EnumType.STRING) private ScopeType scope; diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index e9b0c827ab7..27df1affb20 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -41,20 +41,17 @@ import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd; import org.apache.cloudstack.api.command.admin.host.ReconnectHostCmd; import org.apache.cloudstack.api.command.admin.host.UpdateHostCmd; import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd; +import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd; import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd; -import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; -import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.region.RegionVO; import org.apache.cloudstack.region.dao.RegionDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; @@ -118,7 +115,7 @@ import com.cloud.org.Grouping.AllocationState; import com.cloud.org.Managed; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.GuestOSCategoryVO; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.storage.S3; import com.cloud.storage.S3VO; import com.cloud.storage.ScopeType; @@ -167,94 +164,95 @@ import com.cloud.vm.dao.VMInstanceDao; @Component @Local({ ResourceManager.class, ResourceService.class }) -public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ResourceService, - Manager { - private static final Logger s_logger = Logger - .getLogger(ResourceManagerImpl.class); +public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ResourceService, Manager { + private static final Logger s_logger = Logger.getLogger(ResourceManagerImpl.class); @Inject - AccountManager _accountMgr; + AccountManager _accountMgr; @Inject - AgentManager _agentMgr; + AgentManager _agentMgr; @Inject - StorageManager _storageMgr; + StorageManager _storageMgr; @Inject - protected SecondaryStorageVmManager _secondaryStorageMgr; + protected SecondaryStorageVmManager _secondaryStorageMgr; @Inject - DataStoreProviderManager _dataStoreProviderMgr; + DataStoreProviderManager _dataStoreProviderMgr; @Inject - protected RegionDao _regionDao; + protected RegionDao _regionDao; @Inject - protected DataCenterDao _dcDao; + protected DataCenterDao _dcDao; @Inject - protected HostPodDao _podDao; + protected HostPodDao _podDao; @Inject - protected ClusterDetailsDao _clusterDetailsDao; + protected ClusterDetailsDao _clusterDetailsDao; @Inject - protected ClusterDao _clusterDao; + protected ClusterDao _clusterDao; @Inject - protected CapacityDao _capacityDao; + protected CapacityDao _capacityDao; @Inject - protected HostDao _hostDao; + protected HostDao _hostDao; @Inject protected SwiftManager _swiftMgr; @Inject - protected S3Manager _s3Mgr; + protected S3Manager _s3Mgr; @Inject - protected HostDetailsDao _hostDetailsDao; + protected HostDetailsDao _hostDetailsDao; @Inject protected ConfigurationDao _configDao; @Inject - protected HostTagsDao _hostTagsDao; + protected HostTagsDao _hostTagsDao; @Inject - protected GuestOSCategoryDao _guestOSCategoryDao; + protected GuestOSCategoryDao _guestOSCategoryDao; @Inject - protected PrimaryDataStoreDao _storagePoolDao; + protected PrimaryDataStoreDao _storagePoolDao; @Inject - protected DataCenterIpAddressDao _privateIPAddressDao; + protected DataCenterIpAddressDao _privateIPAddressDao; @Inject - protected IPAddressDao _publicIPAddressDao; + protected IPAddressDao _publicIPAddressDao; @Inject - protected VirtualMachineManager _vmMgr; + protected VirtualMachineManager _vmMgr; @Inject - protected VMInstanceDao _vmDao; + protected VMInstanceDao _vmDao; @Inject - protected HighAvailabilityManager _haMgr; + protected HighAvailabilityManager _haMgr; @Inject - protected StorageService _storageSvr; + protected StorageService _storageSvr; @Inject DataStoreManager _dataStoreMgr; - protected List _discoverers; + public List getDiscoverers() { - return _discoverers; - } - public void setDiscoverers(List _discoverers) { - this._discoverers = _discoverers; - } + return _discoverers; + } + + public void setDiscoverers(List _discoverers) { + this._discoverers = _discoverers; + } - @Inject - protected ClusterManager _clusterMgr; @Inject - protected StoragePoolHostDao _storagePoolHostDao; + protected ClusterManager _clusterMgr; + @Inject + protected StoragePoolHostDao _storagePoolHostDao; + + protected List _podAllocators; - protected List _podAllocators; public List getPodAllocators() { - return _podAllocators; - } - public void setPodAllocators(List _podAllocators) { - this._podAllocators = _podAllocators; - } + return _podAllocators; + } - @Inject - protected VMTemplateDao _templateDao; - @Inject - protected ConfigurationManager _configMgr; - @Inject - protected ClusterVSMMapDao _clusterVSMMapDao; + public void setPodAllocators(List _podAllocators) { + this._podAllocators = _podAllocators; + } - protected long _nodeId = ManagementServerNode.getManagementServerId(); + @Inject + protected VMTemplateDao _templateDao; + @Inject + protected ConfigurationManager _configMgr; + @Inject + protected ClusterVSMMapDao _clusterVSMMapDao; + + protected long _nodeId = ManagementServerNode.getManagementServerId(); protected HashMap _resourceStateAdapters = new HashMap(); @@ -271,8 +269,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } if (lst.contains(listener)) { - throw new CloudRuntimeException("Duplicate resource lisener:" - + listener.getClass().getSimpleName()); + throw new CloudRuntimeException("Duplicate resource lisener:" + listener.getClass().getSimpleName()); } lst.add(listener); @@ -288,31 +285,22 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, insertListener(ResourceListener.EVENT_DISCOVER_AFTER, listener); } if ((event & ResourceListener.EVENT_DELETE_HOST_BEFORE) != 0) { - insertListener(ResourceListener.EVENT_DELETE_HOST_BEFORE, - listener); + insertListener(ResourceListener.EVENT_DELETE_HOST_BEFORE, listener); } if ((event & ResourceListener.EVENT_DELETE_HOST_AFTER) != 0) { - insertListener(ResourceListener.EVENT_DELETE_HOST_AFTER, - listener); + insertListener(ResourceListener.EVENT_DELETE_HOST_AFTER, listener); } if ((event & ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE) != 0) { - insertListener( - ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE, - listener); + insertListener(ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE, listener); } if ((event & ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER) != 0) { - insertListener(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, - listener); + insertListener(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, listener); } if ((event & ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE) != 0) { - insertListener( - ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE, - listener); + insertListener(ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE, listener); } if ((event & ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER) != 0) { - insertListener( - ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, - listener); + insertListener(ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, listener); } } } @@ -322,15 +310,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, synchronized (_lifeCycleListeners) { Iterator it = _lifeCycleListeners.entrySet().iterator(); while (it.hasNext()) { - Map.Entry> items = (Map.Entry>) it - .next(); + Map.Entry> items = (Map.Entry>) it.next(); List lst = items.getValue(); lst.remove(listener); } } } - protected void processResourceEvent(Integer event, Object... params) { + protected void processResourceEvent(Integer event, Object... params) { List lst = _lifeCycleListeners.get(event); if (lst == null || lst.size() == 0) { return; @@ -339,10 +326,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, String eventName; for (ResourceListener l : lst) { if (event == ResourceListener.EVENT_DISCOVER_BEFORE) { - l.processDiscoverEventBefore((Long) params[0], - (Long) params[1], (Long) params[2], (URI) params[3], - (String) params[4], (String) params[5], - (List) params[6]); + l.processDiscoverEventBefore((Long) params[0], (Long) params[1], (Long) params[2], (URI) params[3], (String) params[4], + (String) params[5], (List) params[6]); eventName = "EVENT_DISCOVER_BEFORE"; } else if (event == ResourceListener.EVENT_DISCOVER_AFTER) { l.processDiscoverEventAfter((Map>) params[0]); @@ -366,20 +351,16 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, l.processPrepareMaintenaceEventAfter((Long) params[0]); eventName = "EVENT_PREPARE_MAINTENANCE_AFTER"; } else { - throw new CloudRuntimeException("Unknown resource event:" - + event); + throw new CloudRuntimeException("Unknown resource event:" + event); } - s_logger.debug("Sent resource event " + eventName + " to listener " - + l.getClass().getSimpleName()); + s_logger.debug("Sent resource event " + eventName + " to listener " + l.getClass().getSimpleName()); } } @DB @Override - public List discoverCluster(AddClusterCmd cmd) - throws IllegalArgumentException, DiscoveryException, - ResourceInUseException { + public List discoverCluster(AddClusterCmd cmd) throws IllegalArgumentException, DiscoveryException, ResourceInUseException { long dcId = cmd.getZoneId(); long podId = cmd.getPodId(); String clusterName = cmd.getClusterName(); @@ -396,36 +377,31 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Check if the zone exists in the system DataCenterVO zone = _dcDao.findById(dcId); if (zone == null) { - InvalidParameterValueException ex = new InvalidParameterValueException( - "Can't find zone by the id specified"); + InvalidParameterValueException ex = new InvalidParameterValueException("Can't find zone by the id specified"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; } Account account = UserContext.current().getCaller(); - if (Grouping.AllocationState.Disabled == zone.getAllocationState() - && !_accountMgr.isRootAdmin(account.getType())) { - PermissionDeniedException ex = new PermissionDeniedException( - "Cannot perform this operation, Zone with specified id is currently disabled"); + if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) { + PermissionDeniedException ex = new PermissionDeniedException( + "Cannot perform this operation, Zone with specified id is currently disabled"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; } HostPodVO pod = _podDao.findById(podId); if (pod == null) { - throw new InvalidParameterValueException( - "Can't find pod with specified podId " + podId); + throw new InvalidParameterValueException("Can't find pod with specified podId " + podId); } // Check if the pod exists in the system if (_podDao.findById(podId) == null) { - throw new InvalidParameterValueException("Can't find pod by id " - + podId); + throw new InvalidParameterValueException("Can't find pod by id " + podId); } // check if pod belongs to the zone if (!Long.valueOf(pod.getDataCenterId()).equals(dcId)) { - InvalidParameterValueException ex = new InvalidParameterValueException( - "Pod with specified id doesn't belong to the zone " + dcId); + InvalidParameterValueException ex = new InvalidParameterValueException("Pod with specified id doesn't belong to the zone " + dcId); ex.addProxyObject(pod, podId, "podId"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; @@ -433,22 +409,17 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Verify cluster information and create a new cluster if needed if (clusterName == null || clusterName.isEmpty()) { - throw new InvalidParameterValueException( - "Please specify cluster name"); + throw new InvalidParameterValueException("Please specify cluster name"); } if (cmd.getHypervisor() == null || cmd.getHypervisor().isEmpty()) { - throw new InvalidParameterValueException( - "Please specify a hypervisor"); + throw new InvalidParameterValueException("Please specify a hypervisor"); } - Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType - .getType(cmd.getHypervisor()); + Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(cmd.getHypervisor()); if (hypervisorType == null) { - s_logger.error("Unable to resolve " + cmd.getHypervisor() - + " to a valid supported hypervisor type"); - throw new InvalidParameterValueException("Unable to resolve " - + cmd.getHypervisor() + " to a supported "); + s_logger.error("Unable to resolve " + cmd.getHypervisor() + " to a valid supported hypervisor type"); + throw new InvalidParameterValueException("Unable to resolve " + cmd.getHypervisor() + " to a supported "); } Cluster.ClusterType clusterType = null; @@ -460,16 +431,11 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } Grouping.AllocationState allocationState = null; - if (cmd.getAllocationState() != null - && !cmd.getAllocationState().isEmpty()) { + if (cmd.getAllocationState() != null && !cmd.getAllocationState().isEmpty()) { try { - allocationState = Grouping.AllocationState.valueOf(cmd - .getAllocationState()); + allocationState = Grouping.AllocationState.valueOf(cmd.getAllocationState()); } catch (IllegalArgumentException ex) { - throw new InvalidParameterValueException( - "Unable to resolve Allocation State '" - + cmd.getAllocationState() - + "' to a supported state"); + throw new InvalidParameterValueException("Unable to resolve Allocation State '" + cmd.getAllocationState() + "' to a supported state"); } } if (allocationState == null) { @@ -479,9 +445,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, Discoverer discoverer = getMatchingDiscover(hypervisorType); if (discoverer == null) { - throw new InvalidParameterValueException( - "Could not find corresponding resource manager for " - + cmd.getHypervisor()); + throw new InvalidParameterValueException("Could not find corresponding resource manager for " + cmd.getHypervisor()); } if (hypervisorType == HypervisorType.VMware) { @@ -501,9 +465,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, cluster = _clusterDao.persist(cluster); } catch (Exception e) { // no longer tolerate exception during the cluster creation phase - CloudRuntimeException ex = new CloudRuntimeException( - "Unable to create cluster " + clusterName - + " in pod and data center with specified ids", e); + CloudRuntimeException ex = new CloudRuntimeException("Unable to create cluster " + clusterName + + " in pod and data center with specified ids", e); // Get the pod VO object's table name. ex.addProxyObject(pod, podId, "podId"); ex.addProxyObject(zone, dcId, "dcId"); @@ -512,10 +475,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, clusterId = cluster.getId(); result.add(cluster); - ClusterDetailsVO cluster_detail_cpu = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", Float.toString(cmd.getCpuOvercommitRatio())); - ClusterDetailsVO cluster_detail_ram = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", Float.toString(cmd.getMemoryOvercommitRaito())); - _clusterDetailsDao.persist(cluster_detail_cpu); - _clusterDetailsDao.persist(cluster_detail_ram); + ClusterDetailsVO cluster_detail_cpu = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", Float.toString(cmd.getCpuOvercommitRatio())); + ClusterDetailsVO cluster_detail_ram = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", Float.toString(cmd.getMemoryOvercommitRaito())); + _clusterDetailsDao.persist(cluster_detail_cpu); + _clusterDetailsDao.persist(cluster_detail_ram); if (clusterType == Cluster.ClusterType.CloudManaged) { return result; @@ -530,66 +493,53 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, _clusterDetailsDao.persist(cluster_detail_cpu); _clusterDetailsDao.persist(cluster_detail_ram); - //create a new entry only if the overcommit ratios are greater than 1. - if(cmd.getCpuOvercommitRatio().compareTo(1f) > 0) { + // create a new entry only if the overcommit ratios are greater than 1. + if (cmd.getCpuOvercommitRatio().compareTo(1f) > 0) { cluster_detail_cpu = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", Float.toString(cmd.getCpuOvercommitRatio())); _clusterDetailsDao.persist(cluster_detail_cpu); } - - if(cmd.getMemoryOvercommitRaito().compareTo(1f) > 0) { - cluster_detail_ram = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", Float.toString(cmd.getMemoryOvercommitRaito())); + if (cmd.getMemoryOvercommitRaito().compareTo(1f) > 0) { + cluster_detail_ram = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", Float.toString(cmd.getMemoryOvercommitRaito())); _clusterDetailsDao.persist(cluster_detail_ram); } - boolean success = false; try { try { uri = new URI(UriUtils.encodeURIComponent(url)); if (uri.getScheme() == null) { - throw new InvalidParameterValueException( - "uri.scheme is null " + url - + ", add http:// as a prefix"); + throw new InvalidParameterValueException("uri.scheme is null " + url + ", add http:// as a prefix"); } else if (uri.getScheme().equalsIgnoreCase("http")) { - if (uri.getHost() == null - || uri.getHost().equalsIgnoreCase("") - || uri.getPath() == null - || uri.getPath().equalsIgnoreCase("")) { - throw new InvalidParameterValueException( - "Your host and/or path is wrong. Make sure it's of the format http://hostname/path"); + if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("") || uri.getPath() == null || uri.getPath().equalsIgnoreCase("")) { + throw new InvalidParameterValueException("Your host and/or path is wrong. Make sure it's of the format http://hostname/path"); } } } catch (URISyntaxException e) { - throw new InvalidParameterValueException(url - + " is not a valid uri"); + throw new InvalidParameterValueException(url + " is not a valid uri"); } List hosts = new ArrayList(); Map> resources = null; - resources = discoverer.find(dcId, podId, clusterId, uri, username, - password, null); + resources = discoverer.find(dcId, podId, clusterId, uri, username, password, null); if (resources != null) { - for (Map.Entry> entry : resources - .entrySet()) { + for (Map.Entry> entry : resources.entrySet()) { ServerResource resource = entry.getKey(); - // For Hyper-V, we are here means agent have already started - // and connected to management server + // For Hyper-V, we are here means agent have already started + // and connected to management server if (hypervisorType == Hypervisor.HypervisorType.Hyperv) { break; } - HostVO host = (HostVO) createHostAndAgent(resource, - entry.getValue(), true, null, false); + HostVO host = (HostVO) createHostAndAgent(resource, entry.getValue(), true, null, false); if (host != null) { hosts.add(host); } discoverer.postDiscovery(hosts, _nodeId); } - s_logger.info("External cluster has been successfully discovered by " - + discoverer.getName()); + s_logger.info("External cluster has been successfully discovered by " + discoverer.getName()); success = true; return result; } @@ -605,19 +555,16 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public Discoverer getMatchingDiscover( - Hypervisor.HypervisorType hypervisorType) { - for (Discoverer discoverer : _discoverers) { - if (discoverer.getHypervisorType() == hypervisorType) + public Discoverer getMatchingDiscover(Hypervisor.HypervisorType hypervisorType) { + for (Discoverer discoverer : _discoverers) { + if (discoverer.getHypervisorType() == hypervisorType) return discoverer; - } + } return null; } @Override - public List discoverHosts(AddHostCmd cmd) - throws IllegalArgumentException, DiscoveryException, - InvalidParameterValueException { + public List discoverHosts(AddHostCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { Long dcId = cmd.getZoneId(); Long podId = cmd.getPodId(); Long clusterId = cmd.getClusterId(); @@ -627,8 +574,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, String password = cmd.getPassword(); List hostTags = cmd.getHostTags(); - dcId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current() - .getCaller(), dcId); + dcId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), dcId); // this is for standalone option if (clusterName == null && clusterId == null) { @@ -638,16 +584,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (clusterId != null) { ClusterVO cluster = _clusterDao.findById(clusterId); if (cluster == null) { - InvalidParameterValueException ex = new InvalidParameterValueException( - "can not find cluster for specified clusterId"); + InvalidParameterValueException ex = new InvalidParameterValueException("can not find cluster for specified clusterId"); ex.addProxyObject(cluster, clusterId, "clusterId"); throw ex; } else { if (cluster.getGuid() == null) { List hosts = listAllHostsInCluster(clusterId); if (!hosts.isEmpty()) { - CloudRuntimeException ex = new CloudRuntimeException( - "Guid is not updated for cluster with specified cluster id; need to wait for hosts in this cluster to come up"); + CloudRuntimeException ex = new CloudRuntimeException( + "Guid is not updated for cluster with specified cluster id; need to wait for hosts in this cluster to come up"); ex.addProxyObject(cluster, clusterId, "clusterId"); throw ex; } @@ -655,17 +600,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } } - return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor(), hostTags, cmd.getFullUrlParams(), true); + return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor(), hostTags, cmd.getFullUrlParams(), + true); } - - - - @Override - public List discoverHosts(AddSecondaryStorageCmd cmd) - throws IllegalArgumentException, DiscoveryException, - InvalidParameterValueException { + public List discoverHosts(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, + InvalidParameterValueException { Long dcId = cmd.getZoneId(); String url = cmd.getUrl(); return discoverHostsFull(dcId, null, null, null, url, null, null, "SecondaryStorage", null, null, false); @@ -678,7 +619,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public Pair, Integer> listSwifts(ListSwiftsCmd cmd) { - Pair, Integer> swifts = _swiftMgr.listSwifts(cmd); + Pair, Integer> swifts = _swiftMgr.listSwifts(cmd); return new Pair, Integer>(swifts.first(), swifts.second()); } @@ -693,53 +634,44 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, + public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { - String providerName = cmd.getImageProviderName(); + String providerName = cmd.getProviderName(); DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName); if (storeProvider == null) { storeProvider = _dataStoreProviderMgr.getDefaultImageDataStoreProvider(); if (storeProvider == null) { - throw new InvalidParameterValueException( - "can't find image store provider: " + providerName); + throw new InvalidParameterValueException("can't find image store provider: " + providerName); } } Long dcId = cmd.getZoneId(); - Long regionId = cmd.getRegionId(); String url = cmd.getUrl(); Map details = cmd.getDetails(); - ScopeType scopeType = ScopeType.ZONE; + ScopeType scopeType = null; String scope = cmd.getScope(); if (scope != null) { try { scopeType = Enum.valueOf(ScopeType.class, scope.toUpperCase()); } catch (Exception e) { - throw new InvalidParameterValueException("invalid scope" - + scope); + throw new InvalidParameterValueException("invalid scope" + scope); } } if (scopeType == ScopeType.ZONE && dcId == null) { - throw new InvalidParameterValueException( - "zone id can't be null, if scope is zone"); - } else if (scopeType == ScopeType.REGION && regionId == null) { - throw new InvalidParameterValueException( - "region id can't be null, if scope is region"); + throw new InvalidParameterValueException("zone id can't be null, if scope is zone"); } - if ( dcId != null ){ + if (dcId != null) { // Check if the zone exists in the system DataCenterVO zone = _dcDao.findById(dcId); if (zone == null) { - throw new InvalidParameterValueException("Can't find zone by id " - + dcId); + throw new InvalidParameterValueException("Can't find zone by id " + dcId); } Account account = UserContext.current().getCaller(); - if (Grouping.AllocationState.Disabled == zone.getAllocationState() - && !_accountMgr.isRootAdmin(account.getType())) { + if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) { PermissionDeniedException ex = new PermissionDeniedException( "Cannot perform this operation, Zone with specified id is currently disabled"); ex.addProxyObject(zone, dcId, "dcId"); @@ -747,57 +679,42 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } } - if ( regionId != null ){ - // Check if the region exists in the system - RegionVO region = _regionDao.findById(regionId.intValue()); - if (region == null) { - throw new InvalidParameterValueException("Can't find region by id " - + regionId); - } - } Map params = new HashMap(); params.put("zoneId", dcId); - params.put("regionId", regionId); params.put("url", cmd.getUrl()); params.put("name", cmd.getUrl()); params.put("details", details); + params.put("scope", scopeType); params.put("providerName", storeProvider.getName()); DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle(); DataStore store = null; try { store = lifeCycle.initialize(params); - - if (scopeType == ScopeType.ZONE) { - ZoneScope zoneScope = new ZoneScope(dcId); - lifeCycle.attachZone(store, zoneScope); - } } catch (Exception e) { s_logger.debug("Failed to add data store", e); throw new CloudRuntimeException("Failed to add data store", e); } - return (ObjectStore)_dataStoreMgr.getDataStore(store.getId(), - DataStoreRole.Image); + return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image); } - private List discoverHostsFull(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, String hypervisorType, List hostTags, - Map params, boolean deferAgentCreation) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { + private List discoverHostsFull(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, + String hypervisorType, List hostTags, Map params, boolean deferAgentCreation) throws IllegalArgumentException, + DiscoveryException, InvalidParameterValueException { URI uri = null; // Check if the zone exists in the system DataCenterVO zone = _dcDao.findById(dcId); if (zone == null) { - throw new InvalidParameterValueException("Can't find zone by id " - + dcId); + throw new InvalidParameterValueException("Can't find zone by id " + dcId); } Account account = UserContext.current().getCaller(); - if (Grouping.AllocationState.Disabled == zone.getAllocationState() - && !_accountMgr.isRootAdmin(account.getType())) { - PermissionDeniedException ex = new PermissionDeniedException( - "Cannot perform this operation, Zone with specified id is currently disabled"); + if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(account.getType())) { + PermissionDeniedException ex = new PermissionDeniedException( + "Cannot perform this operation, Zone with specified id is currently disabled"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; } @@ -806,16 +723,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (podId != null) { HostPodVO pod = _podDao.findById(podId); if (pod == null) { - throw new InvalidParameterValueException( - "Can't find pod by id " + podId); + throw new InvalidParameterValueException("Can't find pod by id " + podId); } // check if pod belongs to the zone if (!Long.valueOf(pod.getDataCenterId()).equals(dcId)) { - InvalidParameterValueException ex = new InvalidParameterValueException( - "Pod with specified podId" - + podId - + " doesn't belong to the zone with specified zoneId" - + dcId); + InvalidParameterValueException ex = new InvalidParameterValueException("Pod with specified podId" + podId + + " doesn't belong to the zone with specified zoneId" + dcId); ex.addProxyObject(pod, podId, "podId"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; @@ -824,47 +737,40 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Verify cluster information and create a new cluster if needed if (clusterName != null && clusterId != null) { - throw new InvalidParameterValueException( - "Can't specify cluster by both id and name"); + throw new InvalidParameterValueException("Can't specify cluster by both id and name"); } if (hypervisorType == null || hypervisorType.isEmpty()) { - throw new InvalidParameterValueException( - "Need to specify Hypervisor Type"); + throw new InvalidParameterValueException("Need to specify Hypervisor Type"); } if ((clusterName != null || clusterId != null) && podId == null) { - throw new InvalidParameterValueException( - "Can't specify cluster without specifying the pod"); + throw new InvalidParameterValueException("Can't specify cluster without specifying the pod"); } if (clusterId != null) { if (_clusterDao.findById(clusterId) == null) { - throw new InvalidParameterValueException( - "Can't find cluster by id " + clusterId); - } + throw new InvalidParameterValueException("Can't find cluster by id " + clusterId); + } - if (hypervisorType.equalsIgnoreCase(HypervisorType.VMware - .toString())) { - // VMware only allows adding host to an existing cluster, as we - // already have a lot of information - // in cluster object, to simplify user input, we will construct - // neccessary information here - Map clusterDetails = this._clusterDetailsDao - .findDetails(clusterId); + if (hypervisorType.equalsIgnoreCase(HypervisorType.VMware.toString())) { + // VMware only allows adding host to an existing cluster, as we + // already have a lot of information + // in cluster object, to simplify user input, we will construct + // neccessary information here + Map clusterDetails = this._clusterDetailsDao.findDetails(clusterId); username = clusterDetails.get("username"); - assert (username != null); + assert (username != null); password = clusterDetails.get("password"); - assert (password != null); + assert (password != null); try { uri = new URI(UriUtils.encodeURIComponent(url)); url = clusterDetails.get("url") + "/" + uri.getHost(); } catch (URISyntaxException e) { - throw new InvalidParameterValueException(url - + " is not a valid uri"); + throw new InvalidParameterValueException(url + " is not a valid uri"); } } } @@ -872,8 +778,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (clusterName != null) { HostPodVO pod = _podDao.findById(podId); if (pod == null) { - throw new InvalidParameterValueException( - "Can't find pod by id " + podId); + throw new InvalidParameterValueException("Can't find pod by id " + podId); } ClusterVO cluster = new ClusterVO(dcId, podId, clusterName); cluster.setHypervisorType(hypervisorType); @@ -882,22 +787,19 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } catch (Exception e) { cluster = _clusterDao.findBy(clusterName, podId); if (cluster == null) { - CloudRuntimeException ex = new CloudRuntimeException( - "Unable to create cluster " - + clusterName - + " in pod with specified podId and data center with specified dcID", - e); + CloudRuntimeException ex = new CloudRuntimeException("Unable to create cluster " + clusterName + + " in pod with specified podId and data center with specified dcID", e); ex.addProxyObject(pod, podId, "podId"); ex.addProxyObject(zone, dcId, "dcId"); throw ex; } } clusterId = cluster.getId(); - if (_clusterDetailsDao.findDetail(clusterId,"cpuOvercommitRatio") == null) { - ClusterDetailsVO cluster_cpu_detail = new ClusterDetailsVO(clusterId,"cpuOvercommitRatio","1"); - ClusterDetailsVO cluster_memory_detail = new ClusterDetailsVO(clusterId,"memoryOvercommitRatio","1"); - _clusterDetailsDao.persist(cluster_cpu_detail); - _clusterDetailsDao.persist(cluster_memory_detail); + if (_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio") == null) { + ClusterDetailsVO cluster_cpu_detail = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", "1"); + ClusterDetailsVO cluster_memory_detail = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", "1"); + _clusterDetailsDao.persist(cluster_cpu_detail); + _clusterDetailsDao.persist(cluster_memory_detail); } } @@ -905,26 +807,20 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, try { uri = new URI(UriUtils.encodeURIComponent(url)); if (uri.getScheme() == null) { - throw new InvalidParameterValueException("uri.scheme is null " - + url + ", add nfs:// as a prefix"); + throw new InvalidParameterValueException("uri.scheme is null " + url + ", add nfs:// as a prefix"); } else if (uri.getScheme().equalsIgnoreCase("nfs")) { - if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("") - || uri.getPath() == null - || uri.getPath().equalsIgnoreCase("")) { - throw new InvalidParameterValueException( - "Your host and/or path is wrong. Make sure it's of the format nfs://hostname/path"); + if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("") || uri.getPath() == null || uri.getPath().equalsIgnoreCase("")) { + throw new InvalidParameterValueException("Your host and/or path is wrong. Make sure it's of the format nfs://hostname/path"); } } } catch (URISyntaxException e) { - throw new InvalidParameterValueException(url - + " is not a valid uri"); + throw new InvalidParameterValueException(url + " is not a valid uri"); } List hosts = new ArrayList(); - s_logger.info("Trying to add a new host at " + url + " in data center " - + dcId); + s_logger.info("Trying to add a new host at " + url + " in data center " + dcId); boolean isHypervisorTypeSupported = false; - for (Discoverer discoverer : _discoverers) { + for (Discoverer discoverer : _discoverers) { if (params != null) { discoverer.putParam(params); } @@ -935,43 +831,35 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, isHypervisorTypeSupported = true; Map> resources = null; - processResourceEvent(ResourceListener.EVENT_DISCOVER_BEFORE, dcId, - podId, clusterId, uri, username, password, hostTags); + processResourceEvent(ResourceListener.EVENT_DISCOVER_BEFORE, dcId, podId, clusterId, uri, username, password, hostTags); try { - resources = discoverer.find(dcId, podId, clusterId, uri, - username, password, hostTags); - } catch (DiscoveryException e) { + resources = discoverer.find(dcId, podId, clusterId, uri, username, password, hostTags); + } catch (DiscoveryException e) { throw e; } catch (Exception e) { - s_logger.info("Exception in host discovery process with discoverer: " - + discoverer.getName() - + ", skip to another discoverer if there is any"); + s_logger.info("Exception in host discovery process with discoverer: " + discoverer.getName() + + ", skip to another discoverer if there is any"); } - processResourceEvent(ResourceListener.EVENT_DISCOVER_AFTER, - resources); + processResourceEvent(ResourceListener.EVENT_DISCOVER_AFTER, resources); if (resources != null) { - for (Map.Entry> entry : resources - .entrySet()) { + for (Map.Entry> entry : resources.entrySet()) { ServerResource resource = entry.getKey(); /* - * For KVM, if we go to here, that means kvm agent is - * already connected to mgt svr. + * For KVM, if we go to here, that means kvm agent is + * already connected to mgt svr. */ if (resource instanceof KvmDummyResourceBase) { Map details = entry.getValue(); String guid = details.get("guid"); - List kvmHosts = listAllUpAndEnabledHosts( - Host.Type.Routing, clusterId, podId, dcId); + List kvmHosts = listAllUpAndEnabledHosts(Host.Type.Routing, clusterId, podId, dcId); for (HostVO host : kvmHosts) { if (host.getGuid().equalsIgnoreCase(guid)) { - if (hostTags != null) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Adding Host Tags for KVM host, tags: :" - + hostTags); + if (hostTags != null) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Adding Host Tags for KVM host, tags: :" + hostTags); } - _hostTagsDao - .persist(host.getId(), hostTags); + _hostTagsDao.persist(host.getId(), hostTags); } hosts.add(host); return hosts; @@ -982,9 +870,9 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, HostVO host = null; if (deferAgentCreation) { - host = (HostVO)createHostAndAgentDeferred(resource, entry.getValue(), true, hostTags, false); + host = (HostVO) createHostAndAgentDeferred(resource, entry.getValue(), true, hostTags, false); } else { - host = (HostVO)createHostAndAgent(resource, entry.getValue(), true, hostTags, false); + host = (HostVO) createHostAndAgent(resource, entry.getValue(), true, hostTags, false); } if (host != null) { hosts.add(host); @@ -992,14 +880,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, discoverer.postDiscovery(hosts, _nodeId); } - s_logger.info("server resources successfully discovered by " - + discoverer.getName()); + s_logger.info("server resources successfully discovered by " + discoverer.getName()); return hosts; } } if (!isHypervisorTypeSupported) { - String msg = "Do not support HypervisorType " + hypervisorType - + " for " + url; + String msg = "Do not support HypervisorType " + hypervisorType + " for " + url; s_logger.warn(msg); throw new DiscoveryException(msg); } @@ -1013,42 +899,33 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @DB - protected boolean doDeleteHost(long hostId, boolean isForced, - boolean isForceDeleteStorage) { - User caller = _accountMgr.getActiveUser(UserContext.current() - .getCallerUserId()); + protected boolean doDeleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage) { + User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); // Verify that host exists HostVO host = _hostDao.findById(hostId); if (host == null) { - throw new InvalidParameterValueException("Host with id " + hostId - + " doesn't exist"); + throw new InvalidParameterValueException("Host with id " + hostId + " doesn't exist"); } - _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current() - .getCaller(), host.getDataCenterId()); + _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), host.getDataCenterId()); /* - * TODO: check current agent status and updateAgentStatus to removed. If - * it was already removed, that means someone is deleting host - * concurrently, return. And consider the situation of CloudStack - * shutdown during delete. A global lock? + * TODO: check current agent status and updateAgentStatus to removed. If + * it was already removed, that means someone is deleting host + * concurrently, return. And consider the situation of CloudStack + * shutdown during delete. A global lock? */ AgentAttache attache = _agentMgr.findAttache(hostId); - // Get storage pool host mappings here because they can be removed as a - // part of handleDisconnect later - // TODO: find out the bad boy, what's a buggy logic! - List pools = _storagePoolHostDao - .listByHostIdIncludingRemoved(hostId); + // Get storage pool host mappings here because they can be removed as a + // part of handleDisconnect later + // TODO: find out the bad boy, what's a buggy logic! + List pools = _storagePoolHostDao.listByHostIdIncludingRemoved(hostId); - ResourceStateAdapter.DeleteHostAnswer answer = (ResourceStateAdapter.DeleteHostAnswer) dispatchToStateAdapters( - ResourceStateAdapter.Event.DELETE_HOST, false, host, - new Boolean(isForced), new Boolean(isForceDeleteStorage)); + ResourceStateAdapter.DeleteHostAnswer answer = (ResourceStateAdapter.DeleteHostAnswer) dispatchToStateAdapters( + ResourceStateAdapter.Event.DELETE_HOST, false, host, new Boolean(isForced), new Boolean(isForceDeleteStorage)); if (answer == null) { - throw new CloudRuntimeException( - "No resource adapter respond to DELETE_HOST event for " - + host.getName() + " id = " + hostId - + ", hypervisorType is " + host.getHypervisorType() - + ", host type is " + host.getType()); + throw new CloudRuntimeException("No resource adapter respond to DELETE_HOST event for " + host.getName() + " id = " + hostId + + ", hypervisorType is " + host.getHypervisorType() + ", host type is " + host.getType()); } if (answer.getIsException()) { @@ -1062,8 +939,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, Transaction txn = Transaction.currentTxn(); txn.start(); - _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), - host.getDataCenterId(), null); + _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null); _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove); // delete host details @@ -1085,18 +961,16 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } try { - resourceStateTransitTo(host, ResourceState.Event.DeleteHost, - _nodeId); + resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId); } catch (NoTransitionException e) { - s_logger.debug("Cannot transmit host " + host.getId() - + "to Enabled state", e); + s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e); } // Delete the associated entries in host ref table _storagePoolHostDao.deletePrimaryRecordsForHost(hostId); - // For pool ids you got, delete local storage host entries in pool table - // where + // For pool ids you got, delete local storage host entries in pool table + // where for (StoragePoolHostVO pool : pools) { Long poolId = pool.getPoolId(); StoragePoolVO storagePool = _storagePoolDao.findById(poolId); @@ -1105,30 +979,24 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, storagePool.setClusterId(null); _storagePoolDao.update(poolId, storagePool); _storagePoolDao.remove(poolId); - s_logger.debug("Local storage id=" + poolId - + " is removed as a part of host removal id=" + hostId); + s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId); } } // delete the op_host_capacity entry - Object[] capacityTypes = { Capacity.CAPACITY_TYPE_CPU, - Capacity.CAPACITY_TYPE_MEMORY }; - SearchCriteria hostCapacitySC = _capacityDao - .createSearchCriteria(); + Object[] capacityTypes = { Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY }; + SearchCriteria hostCapacitySC = _capacityDao.createSearchCriteria(); hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId); - hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, - capacityTypes); + hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes); _capacityDao.remove(hostCapacitySC); txn.commit(); return true; } @Override - public boolean deleteHost(long hostId, boolean isForced, - boolean isForceDeleteStorage) { + public boolean deleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, - ResourceState.Event.DeleteHost); + Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.DeleteHost); if (result != null) { return result; } @@ -1148,58 +1016,47 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ClusterVO cluster = _clusterDao.lockRow(cmd.getId(), true); if (cluster == null) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Cluster: " + cmd.getId() - + " does not even exist. Delete call is ignored."); + s_logger.debug("Cluster: " + cmd.getId() + " does not even exist. Delete call is ignored."); } txn.rollback(); - throw new CloudRuntimeException("Cluster: " + cmd.getId() - + " does not exist"); + throw new CloudRuntimeException("Cluster: " + cmd.getId() + " does not exist"); } - Hypervisor.HypervisorType hypervisorType = cluster - .getHypervisorType(); + Hypervisor.HypervisorType hypervisorType = cluster.getHypervisorType(); List hosts = listAllHostsInCluster(cmd.getId()); if (hosts.size() > 0) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Cluster: " + cmd.getId() - + " still has hosts, can't remove"); + s_logger.debug("Cluster: " + cmd.getId() + " still has hosts, can't remove"); } txn.rollback(); - throw new CloudRuntimeException("Cluster: " + cmd.getId() - + " cannot be removed. Cluster still has hosts"); + throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has hosts"); } - // don't allow to remove the cluster if it has non-removed storage - // pools - List storagePools = _storagePoolDao - .listPoolsByCluster(cmd.getId()); + // don't allow to remove the cluster if it has non-removed storage + // pools + List storagePools = _storagePoolDao.listPoolsByCluster(cmd.getId()); if (storagePools.size() > 0) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Cluster: " + cmd.getId() - + " still has storage pools, can't remove"); + s_logger.debug("Cluster: " + cmd.getId() + " still has storage pools, can't remove"); } txn.rollback(); - throw new CloudRuntimeException("Cluster: " + cmd.getId() - + " cannot be removed. Cluster still has storage pools"); + throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has storage pools"); } - if (_clusterDao.remove(cmd.getId())) { + if (_clusterDao.remove(cmd.getId())) { _capacityDao.removeBy(null, null, null, cluster.getId(), null); - // If this cluster is of type vmware, and if the nexus vswitch - // global parameter setting is turned + // If this cluster is of type vmware, and if the nexus vswitch + // global parameter setting is turned // on, remove the row in cluster_vsm_map for this cluster id. - if (hypervisorType == HypervisorType.VMware - && Boolean.parseBoolean(_configDao - .getValue(Config.VmwareUseNexusVSwitch - .toString()))) { + if (hypervisorType == HypervisorType.VMware && Boolean.parseBoolean(_configDao.getValue(Config.VmwareUseNexusVSwitch.toString()))) { _clusterVSMMapDao.removeByClusterId(cmd.getId()); } } txn.commit(); return true; - } catch (CloudRuntimeException e) { + } catch (CloudRuntimeException e) { throw e; } catch (Throwable t) { s_logger.error("Unable to delete cluster: " + cmd.getId(), t); @@ -1210,21 +1067,18 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override @DB - public Cluster updateCluster(Cluster clusterToUpdate, String clusterType, - String hypervisor, String allocationState, String managedstate,Float memoryovercommitratio, Float cpuovercommitratio) { + public Cluster updateCluster(Cluster clusterToUpdate, String clusterType, String hypervisor, String allocationState, String managedstate, + Float memoryovercommitratio, Float cpuovercommitratio) { ClusterVO cluster = (ClusterVO) clusterToUpdate; // Verify cluster information and update the cluster if needed boolean doUpdate = false; if (hypervisor != null && !hypervisor.isEmpty()) { - Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType - .getType(hypervisor); + Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(hypervisor); if (hypervisorType == null) { - s_logger.error("Unable to resolve " + hypervisor - + " to a valid supported hypervisor type"); - throw new InvalidParameterValueException("Unable to resolve " - + hypervisor + " to a supported type"); + s_logger.error("Unable to resolve " + hypervisor + " to a valid supported hypervisor type"); + throw new InvalidParameterValueException("Unable to resolve " + hypervisor + " to a supported type"); } else { cluster.setHypervisorType(hypervisor); doUpdate = true; @@ -1236,14 +1090,11 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, try { newClusterType = Cluster.ClusterType.valueOf(clusterType); } catch (IllegalArgumentException ex) { - throw new InvalidParameterValueException("Unable to resolve " - + clusterType + " to a supported type"); + throw new InvalidParameterValueException("Unable to resolve " + clusterType + " to a supported type"); } if (newClusterType == null) { - s_logger.error("Unable to resolve " + clusterType - + " to a valid supported cluster type"); - throw new InvalidParameterValueException("Unable to resolve " - + clusterType + " to a supported type"); + s_logger.error("Unable to resolve " + clusterType + " to a valid supported cluster type"); + throw new InvalidParameterValueException("Unable to resolve " + clusterType + " to a supported type"); } else { cluster.setClusterType(newClusterType); doUpdate = true; @@ -1253,21 +1104,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, Grouping.AllocationState newAllocationState = null; if (allocationState != null && !allocationState.isEmpty()) { try { - newAllocationState = Grouping.AllocationState - .valueOf(allocationState); + newAllocationState = Grouping.AllocationState.valueOf(allocationState); } catch (IllegalArgumentException ex) { - throw new InvalidParameterValueException( - "Unable to resolve Allocation State '" - + allocationState + "' to a supported state"); + throw new InvalidParameterValueException("Unable to resolve Allocation State '" + allocationState + "' to a supported state"); } if (newAllocationState == null) { - s_logger.error("Unable to resolve " + allocationState - + " to a valid supported allocation State"); - throw new InvalidParameterValueException("Unable to resolve " - + allocationState + " to a supported state"); + s_logger.error("Unable to resolve " + allocationState + " to a valid supported allocation State"); + throw new InvalidParameterValueException("Unable to resolve " + allocationState + " to a supported state"); } else { - _capacityDao.updateCapacityState(null, null, cluster.getId(), - null, allocationState); + _capacityDao.updateCapacityState(null, null, cluster.getId(), null, allocationState); cluster.setAllocationState(newAllocationState); doUpdate = true; } @@ -1279,46 +1124,38 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, try { newManagedState = Managed.ManagedState.valueOf(managedstate); } catch (IllegalArgumentException ex) { - throw new InvalidParameterValueException( - "Unable to resolve Managed State '" + managedstate - + "' to a supported state"); + throw new InvalidParameterValueException("Unable to resolve Managed State '" + managedstate + "' to a supported state"); } if (newManagedState == null) { - s_logger.error("Unable to resolve Managed State '" - + managedstate + "' to a supported state"); - throw new InvalidParameterValueException( - "Unable to resolve Managed State '" + managedstate - + "' to a supported state"); + s_logger.error("Unable to resolve Managed State '" + managedstate + "' to a supported state"); + throw new InvalidParameterValueException("Unable to resolve Managed State '" + managedstate + "' to a supported state"); } else { doUpdate = true; } } - ClusterDetailsVO memory_detail = _clusterDetailsDao.findDetail(cluster.getId(),"memoryOvercommitRatio"); - if( memory_detail == null){ - if (memoryovercommitratio.compareTo(1f) > 0){ - memory_detail = new ClusterDetailsVO(cluster.getId(),"memoryOvercommitRatio",Float.toString(memoryovercommitratio)); - _clusterDetailsDao.persist(memory_detail); - } - } - else { - memory_detail.setValue(Float.toString(memoryovercommitratio)); - _clusterDetailsDao.update(memory_detail.getId(),memory_detail); - } + ClusterDetailsVO memory_detail = _clusterDetailsDao.findDetail(cluster.getId(), "memoryOvercommitRatio"); + if (memory_detail == null) { + if (memoryovercommitratio.compareTo(1f) > 0) { + memory_detail = new ClusterDetailsVO(cluster.getId(), "memoryOvercommitRatio", Float.toString(memoryovercommitratio)); + _clusterDetailsDao.persist(memory_detail); + } + } else { + memory_detail.setValue(Float.toString(memoryovercommitratio)); + _clusterDetailsDao.update(memory_detail.getId(), memory_detail); + } - ClusterDetailsVO cpu_detail = _clusterDetailsDao.findDetail(cluster.getId(),"cpuOvercommitRatio"); - if( cpu_detail == null){ - if (cpuovercommitratio.compareTo(1f) > 0){ - cpu_detail = new ClusterDetailsVO(cluster.getId(),"cpuOvercommitRatio",Float.toString(cpuovercommitratio)); + ClusterDetailsVO cpu_detail = _clusterDetailsDao.findDetail(cluster.getId(), "cpuOvercommitRatio"); + if (cpu_detail == null) { + if (cpuovercommitratio.compareTo(1f) > 0) { + cpu_detail = new ClusterDetailsVO(cluster.getId(), "cpuOvercommitRatio", Float.toString(cpuovercommitratio)); _clusterDetailsDao.persist(cpu_detail); } - } - else { + } else { cpu_detail.setValue(Float.toString(cpuovercommitratio)); - _clusterDetailsDao.update(cpu_detail.getId(),cpu_detail); + _clusterDetailsDao.update(cpu_detail.getId(), cpu_detail); } - if (doUpdate) { Transaction txn = Transaction.currentTxn(); try { @@ -1326,82 +1163,67 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, _clusterDao.update(cluster.getId(), cluster); txn.commit(); } catch (Exception e) { - s_logger.error( - "Unable to update cluster due to " + e.getMessage(), e); - throw new CloudRuntimeException( - "Failed to update cluster. Please contact Cloud Support."); + s_logger.error("Unable to update cluster due to " + e.getMessage(), e); + throw new CloudRuntimeException("Failed to update cluster. Please contact Cloud Support."); } } - if (newManagedState != null && !newManagedState.equals(oldManagedState)) { + if (newManagedState != null && !newManagedState.equals(oldManagedState)) { Transaction txn = Transaction.currentTxn(); - if (newManagedState.equals(Managed.ManagedState.Unmanaged)) { + if (newManagedState.equals(Managed.ManagedState.Unmanaged)) { boolean success = false; try { txn.start(); cluster.setManagedState(Managed.ManagedState.PrepareUnmanaged); _clusterDao.update(cluster.getId(), cluster); txn.commit(); - List hosts = listAllUpAndEnabledHosts( - Host.Type.Routing, cluster.getId(), - cluster.getPodId(), cluster.getDataCenterId()); - for (HostVO host : hosts) { - if (host.getType().equals(Host.Type.Routing) - && !host.getStatus().equals(Status.Down) - && !host.getStatus() - .equals(Status.Disconnected) - && !host.getStatus().equals(Status.Up) - && !host.getStatus().equals(Status.Alert)) { - String msg = "host " + host.getPrivateIpAddress() - + " should not be in " - + host.getStatus().toString() + " status"; - throw new CloudRuntimeException( - "PrepareUnmanaged Failed due to " + msg); + List hosts = listAllUpAndEnabledHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId()); + for (HostVO host : hosts) { + if (host.getType().equals(Host.Type.Routing) && !host.getStatus().equals(Status.Down) + && !host.getStatus().equals(Status.Disconnected) && !host.getStatus().equals(Status.Up) + && !host.getStatus().equals(Status.Alert)) { + String msg = "host " + host.getPrivateIpAddress() + " should not be in " + host.getStatus().toString() + " status"; + throw new CloudRuntimeException("PrepareUnmanaged Failed due to " + msg); } } - for (HostVO host : hosts) { - if (host.getStatus().equals(Status.Up)) { + for (HostVO host : hosts) { + if (host.getStatus().equals(Status.Up)) { umanageHost(host.getId()); } } int retry = 40; boolean lsuccess = true; - for (int i = 0; i < retry; i++) { + for (int i = 0; i < retry; i++) { lsuccess = true; try { Thread.sleep(5 * 1000); } catch (Exception e) { } - hosts = listAllUpAndEnabledHosts(Host.Type.Routing, - cluster.getId(), cluster.getPodId(), - cluster.getDataCenterId()); - for (HostVO host : hosts) { - if (!host.getStatus().equals(Status.Down) - && !host.getStatus().equals( - Status.Disconnected) + hosts = listAllUpAndEnabledHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId()); + for (HostVO host : hosts) { + if (!host.getStatus().equals(Status.Down) && !host.getStatus().equals(Status.Disconnected) && !host.getStatus().equals(Status.Alert)) { lsuccess = false; break; } } - if (lsuccess == true) { + if (lsuccess == true) { success = true; break; } } - if (success == false) { - throw new CloudRuntimeException( - "PrepareUnmanaged Failed due to some hosts are still in UP status after 5 Minutes, please try later "); + if (success == false) { + throw new CloudRuntimeException( + "PrepareUnmanaged Failed due to some hosts are still in UP status after 5 Minutes, please try later "); } } finally { txn.start(); - cluster.setManagedState(success ? Managed.ManagedState.Unmanaged - : Managed.ManagedState.PrepareUnmanagedError); + cluster.setManagedState(success ? Managed.ManagedState.Unmanaged : Managed.ManagedState.PrepareUnmanagedError); _clusterDao.update(cluster.getId(), cluster); txn.commit(); } - } else if (newManagedState.equals(Managed.ManagedState.Managed)) { + } else if (newManagedState.equals(Managed.ManagedState.Managed)) { txn.start(); cluster.setManagedState(Managed.ManagedState.Managed); _clusterDao.update(cluster.getId(), cluster); @@ -1420,18 +1242,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // verify input parameters HostVO host = _hostDao.findById(hostId); if (host == null || host.getRemoved() != null) { - throw new InvalidParameterValueException("Host with id " - + hostId.toString() + " doesn't exist"); + throw new InvalidParameterValueException("Host with id " + hostId.toString() + " doesn't exist"); } - processResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE, - hostId); + processResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_BEFORE, hostId); boolean success = cancelMaintenance(hostId); - processResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, - hostId); + processResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, hostId); if (!success) { - throw new CloudRuntimeException( - "Internal error cancelling maintenance."); + throw new CloudRuntimeException("Internal error cancelling maintenance."); } return host; } @@ -1442,63 +1260,51 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, HostVO host = _hostDao.findById(hostId); if (host == null) { - throw new InvalidParameterValueException("Host with id " - + hostId.toString() + " doesn't exist"); + throw new InvalidParameterValueException("Host with id " + hostId.toString() + " doesn't exist"); } return (_agentMgr.reconnect(hostId) ? host : null); } @Override - public boolean resourceStateTransitTo(Host host, ResourceState.Event event, - long msId) throws NoTransitionException { + public boolean resourceStateTransitTo(Host host, ResourceState.Event event, long msId) throws NoTransitionException { ResourceState currentState = host.getResourceState(); ResourceState nextState = currentState.getNextState(event); if (nextState == null) { - throw new NoTransitionException( - "No next resource state found for current state =" - + currentState + " event =" + event); + throw new NoTransitionException("No next resource state found for current state =" + currentState + " event =" + event); } - // TO DO - Make it more granular and have better conversion into - // capacity type + // TO DO - Make it more granular and have better conversion into + // capacity type - if (host.getType() == Type.Routing && host.getClusterId() != null) { - AllocationState capacityState = _configMgr - .findClusterAllocationState(ApiDBUtils.findClusterById(host - .getClusterId())); - if (capacityState == AllocationState.Enabled - && nextState != ResourceState.Enabled) { + if (host.getType() == Type.Routing && host.getClusterId() != null) { + AllocationState capacityState = _configMgr.findClusterAllocationState(ApiDBUtils.findClusterById(host.getClusterId())); + if (capacityState == AllocationState.Enabled && nextState != ResourceState.Enabled) { capacityState = AllocationState.Disabled; } - _capacityDao.updateCapacityState(null, null, null, host.getId(), - capacityState.toString()); + _capacityDao.updateCapacityState(null, null, null, host.getId(), capacityState.toString()); } - return _hostDao.updateResourceState(currentState, event, nextState, - host); + return _hostDao.updateResourceState(currentState, event, nextState, host); } private boolean doMaintain(final long hostId) { HostVO host = _hostDao.findById(hostId); - MaintainAnswer answer = (MaintainAnswer) _agentMgr.easySend(hostId, - new MaintainCommand()); + MaintainAnswer answer = (MaintainAnswer) _agentMgr.easySend(hostId, new MaintainCommand()); if (answer == null || !answer.getResult()) { s_logger.warn("Unable to send MaintainCommand to host: " + hostId); } try { - resourceStateTransitTo(host, - ResourceState.Event.AdminAskMaintenace, _nodeId); + resourceStateTransitTo(host, ResourceState.Event.AdminAskMaintenace, _nodeId); } catch (NoTransitionException e) { - String err = "Cannot transimit resource state of host " - + host.getId() + " to " + ResourceState.Maintenance; + String err = "Cannot transimit resource state of host " + host.getId() + " to " + ResourceState.Maintenance; s_logger.debug(err, e); throw new CloudRuntimeException(err + e.getMessage()); } _agentMgr.pullAgentToMaintenance(hostId); - /* TODO: move below to listener */ + /* TODO: move below to listener */ if (host.getType() == Host.Type.Routing) { final List vms = _vmDao.listByHostId(hostId); @@ -1506,9 +1312,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return true; } - List hosts = listAllUpAndEnabledHosts(Host.Type.Routing, - host.getClusterId(), host.getPodId(), - host.getDataCenterId()); + List hosts = listAllUpAndEnabledHosts(Host.Type.Routing, host.getClusterId(), host.getPodId(), host.getDataCenterId()); for (final VMInstanceVO vm : vms) { if (hosts == null || hosts.isEmpty() || !answer.getMigrate()) { // for the last host in this cluster, stop all the VMs @@ -1524,8 +1328,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public boolean maintain(final long hostId) throws AgentUnavailableException { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, - ResourceState.Event.AdminAskMaintenace); + Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.AdminAskMaintenace); if (result != null) { return result; } @@ -1540,39 +1343,29 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (host == null) { s_logger.debug("Unable to find host " + hostId); - throw new InvalidParameterValueException( - "Unable to find host with ID: " + hostId - + ". Please specify a valid host ID."); + throw new InvalidParameterValueException("Unable to find host with ID: " + hostId + ". Please specify a valid host ID."); } - if (_hostDao.countBy(host.getClusterId(), - ResourceState.PrepareForMaintenance, - ResourceState.ErrorInMaintenance) > 0) { - throw new InvalidParameterValueException( - "There are other servers in PrepareForMaintenance OR ErrorInMaintenance STATUS in cluster " - + host.getClusterId()); + if (_hostDao.countBy(host.getClusterId(), ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance) > 0) { + throw new InvalidParameterValueException("There are other servers in PrepareForMaintenance OR ErrorInMaintenance STATUS in cluster " + + host.getClusterId()); } if (_storageMgr.isLocalStorageActiveOnHost(host.getId())) { - throw new InvalidParameterValueException( - "There are active VMs using the host's local storage pool. Please stop all VMs on this host that use local storage."); + throw new InvalidParameterValueException( + "There are active VMs using the host's local storage pool. Please stop all VMs on this host that use local storage."); } try { - processResourceEvent( - ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE, hostId); + processResourceEvent(ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE, hostId); if (maintain(hostId)) { - processResourceEvent( - ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, - hostId); + processResourceEvent(ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, hostId); return _hostDao.findById(hostId); } else { - throw new CloudRuntimeException( - "Unable to prepare for maintenance host " + hostId); + throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId); } } catch (AgentUnavailableException e) { - throw new CloudRuntimeException( - "Unable to prepare for maintenance host " + hostId); + throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId); } } @@ -1584,18 +1377,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Verify that the host exists HostVO host = _hostDao.findById(hostId); if (host == null) { - throw new InvalidParameterValueException("Host with id " + hostId - + " doesn't exist"); + throw new InvalidParameterValueException("Host with id " + hostId + " doesn't exist"); } if (cmd.getAllocationState() != null) { - ResourceState.Event resourceEvent = ResourceState.Event.toEvent(cmd - .getAllocationState()); - if (resourceEvent != ResourceState.Event.Enable - && resourceEvent != ResourceState.Event.Disable) { - throw new CloudRuntimeException("Invalid allocation state:" - + cmd.getAllocationState() - + ", only Enable/Disable are allowed"); + ResourceState.Event resourceEvent = ResourceState.Event.toEvent(cmd.getAllocationState()); + if (resourceEvent != ResourceState.Event.Enable && resourceEvent != ResourceState.Event.Disable) { + throw new CloudRuntimeException("Invalid allocation state:" + cmd.getAllocationState() + ", only Enable/Disable are allowed"); } resourceStateTransitTo(host, resourceEvent, _nodeId); @@ -1605,22 +1393,16 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Verify that the guest OS Category exists if (guestOSCategoryId > 0) { if (_guestOSCategoryDao.findById(guestOSCategoryId) == null) { - throw new InvalidParameterValueException( - "Please specify a valid guest OS category."); + throw new InvalidParameterValueException("Please specify a valid guest OS category."); } } - GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao - .findById(guestOSCategoryId); - Map hostDetails = _hostDetailsDao - .findDetails(hostId); + GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId); + Map hostDetails = _hostDetailsDao.findDetails(hostId); - if (guestOSCategory != null - && !GuestOSCategoryVO.CATEGORY_NONE - .equalsIgnoreCase(guestOSCategory.getName())) { + if (guestOSCategory != null && !GuestOSCategoryVO.CATEGORY_NONE.equalsIgnoreCase(guestOSCategory.getName())) { // Save a new entry for guest.os.category.id - hostDetails.put("guest.os.category.id", - String.valueOf(guestOSCategory.getId())); + hostDetails.put("guest.os.category.id", String.valueOf(guestOSCategory.getId())); } else { // Delete any existing entry for guest.os.category.id hostDetails.remove("guest.os.category.id"); @@ -1630,8 +1412,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, List hostTags = cmd.getHostTags(); if (hostTags != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating Host Tags to :" + hostTags); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating Host Tags to :" + hostTags); } _hostTagsDao.persist(hostId, hostTags); } @@ -1651,16 +1433,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - _defaultSystemVMHypervisor = HypervisorType.getType(_configDao - .getValue(Config.SystemVMDefaultHypervisor.toString())); + public boolean configure(String name, Map params) throws ConfigurationException { + _defaultSystemVMHypervisor = HypervisorType.getType(_configDao.getValue(Config.SystemVMDefaultHypervisor.toString())); return true; } @Override - public List getSupportedHypervisorTypes(long zoneId, - boolean forVirtualRouter, Long podId) { + public List getSupportedHypervisorTypes(long zoneId, boolean forVirtualRouter, Long podId) { List hypervisorTypes = new ArrayList(); List clustersForZone = new ArrayList(); @@ -1672,8 +1451,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, for (ClusterVO cluster : clustersForZone) { HypervisorType hType = cluster.getHypervisorType(); - if (!forVirtualRouter - || (forVirtualRouter && hType != HypervisorType.BareMetal && hType != HypervisorType.Ovm)) { + if (!forVirtualRouter || (forVirtualRouter && hType != HypervisorType.BareMetal && hType != HypervisorType.Ovm)) { hypervisorTypes.add(hType); } } @@ -1693,14 +1471,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return HypervisorType.None; } _dcDao.loadDetails(dc); - String defaultHypervisorInZone = dc - .getDetail("defaultSystemVMHypervisorType"); + String defaultHypervisorInZone = dc.getDetail("defaultSystemVMHypervisorType"); if (defaultHypervisorInZone != null) { defaultHyper = HypervisorType.getType(defaultHypervisorInZone); } - List systemTemplates = _templateDao - .listAllSystemVMTemplates(); + List systemTemplates = _templateDao.listAllSystemVMTemplates(); boolean isValid = false; for (VMTemplateVO template : systemTemplates) { if (template.getHypervisorType() == defaultHyper) { @@ -1710,8 +1486,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } if (isValid) { - List clusters = _clusterDao.listByDcHyType(zoneId, - defaultHyper.toString()); + List clusters = _clusterDao.listByDcHyType(zoneId, defaultHyper.toString()); if (clusters.size() <= 0) { isValid = false; } @@ -1728,8 +1503,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, public HypervisorType getAvailableHypervisor(long zoneId) { HypervisorType defaultHype = getDefaultHypervisor(zoneId); if (defaultHype == HypervisorType.None) { - List supportedHypes = getSupportedHypervisorTypes( - zoneId, false, null); + List supportedHypes = getSupportedHypervisorTypes(zoneId, false, null); if (supportedHypes.size() > 0) { defaultHype = supportedHypes.get(0); } @@ -1742,8 +1516,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public void registerResourceStateAdapter(String name, - ResourceStateAdapter adapter) { + public void registerResourceStateAdapter(String name, ResourceStateAdapter adapter) { if (_resourceStateAdapters.get(name) != null) { throw new CloudRuntimeException(name + " has registered"); } @@ -1760,51 +1533,40 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } } - private Object dispatchToStateAdapters(ResourceStateAdapter.Event event, - boolean singleTaker, Object... args) { + private Object dispatchToStateAdapters(ResourceStateAdapter.Event event, boolean singleTaker, Object... args) { synchronized (_resourceStateAdapters) { Iterator it = _resourceStateAdapters.entrySet().iterator(); Object result = null; while (it.hasNext()) { - Map.Entry item = (Map.Entry) it - .next(); + Map.Entry item = (Map.Entry) it.next(); ResourceStateAdapter adapter = item.getValue(); - String msg = new String("Dispatching resource state event " - + event + " to " + item.getKey()); + String msg = new String("Dispatching resource state event " + event + " to " + item.getKey()); s_logger.debug(msg); if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_CONNECTED) { - result = adapter.createHostVOForConnectedAgent( - (HostVO) args[0], (StartupCommand[]) args[1]); + result = adapter.createHostVOForConnectedAgent((HostVO) args[0], (StartupCommand[]) args[1]); if (result != null && singleTaker) { break; } } else if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT) { - result = adapter.createHostVOForDirectConnectAgent( - (HostVO) args[0], (StartupCommand[]) args[1], - (ServerResource) args[2], - (Map) args[3], - (List) args[4]); + result = adapter.createHostVOForDirectConnectAgent((HostVO) args[0], (StartupCommand[]) args[1], (ServerResource) args[2], + (Map) args[3], (List) args[4]); if (result != null && singleTaker) { break; } } else if (event == ResourceStateAdapter.Event.DELETE_HOST) { try { - result = adapter.deleteHost((HostVO) args[0], - (Boolean) args[1], (Boolean) args[2]); + result = adapter.deleteHost((HostVO) args[0], (Boolean) args[1], (Boolean) args[2]); if (result != null) { break; } } catch (UnableDeleteHostException e) { - s_logger.debug("Adapter " + adapter.getName() - + " says unable to delete host", e); - result = new ResourceStateAdapter.DeleteHostAnswer( - false, true); + s_logger.debug("Adapter " + adapter.getName() + " says unable to delete host", e); + result = new ResourceStateAdapter.DeleteHostAnswer(false, true); } } else { - throw new CloudRuntimeException( - "Unknown resource state event:" + event); + throw new CloudRuntimeException("Unknown resource state event:" + event); } } @@ -1813,9 +1575,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public void checkCIDR(HostPodVO pod, DataCenterVO dc, - String serverPrivateIP, String serverPrivateNetmask) - throws IllegalArgumentException { + public void checkCIDR(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask) throws IllegalArgumentException { if (serverPrivateIP == null) { return; } @@ -1826,36 +1586,27 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // If the server's private IP address is not in the same subnet as the // pod's CIDR, return false String cidrSubnet = NetUtils.getCidrSubNet(cidrAddress, cidrSize); - String serverSubnet = NetUtils.getSubNet(serverPrivateIP, - serverPrivateNetmask); + String serverSubnet = NetUtils.getSubNet(serverPrivateIP, serverPrivateNetmask); if (!cidrSubnet.equals(serverSubnet)) { - s_logger.warn("The private ip address of the server (" - + serverPrivateIP - + ") is not compatible with the CIDR of pod: " - + pod.getName() + " and zone: " + dc.getName()); - throw new IllegalArgumentException( - "The private ip address of the server (" + serverPrivateIP - + ") is not compatible with the CIDR of pod: " - + pod.getName() + " and zone: " + dc.getName()); + s_logger.warn("The private ip address of the server (" + serverPrivateIP + ") is not compatible with the CIDR of pod: " + pod.getName() + + " and zone: " + dc.getName()); + throw new IllegalArgumentException("The private ip address of the server (" + serverPrivateIP + + ") is not compatible with the CIDR of pod: " + pod.getName() + " and zone: " + dc.getName()); } // If the server's private netmask is less inclusive than the pod's CIDR // netmask, return false - String cidrNetmask = NetUtils - .getCidrSubNet("255.255.255.255", cidrSize); + String cidrNetmask = NetUtils.getCidrSubNet("255.255.255.255", cidrSize); long cidrNetmaskNumeric = NetUtils.ip2Long(cidrNetmask); long serverNetmaskNumeric = NetUtils.ip2Long(serverPrivateNetmask); if (serverNetmaskNumeric > cidrNetmaskNumeric) { - throw new IllegalArgumentException( - "The private ip address of the server (" + serverPrivateIP - + ") is not compatible with the CIDR of pod: " - + pod.getName() + " and zone: " + dc.getName()); + throw new IllegalArgumentException("The private ip address of the server (" + serverPrivateIP + + ") is not compatible with the CIDR of pod: " + pod.getName() + " and zone: " + dc.getName()); } } - private boolean checkCIDR(HostPodVO pod, String serverPrivateIP, - String serverPrivateNetmask) { + private boolean checkCIDR(HostPodVO pod, String serverPrivateIP, String serverPrivateNetmask) { if (serverPrivateIP == null) { return true; } @@ -1866,16 +1617,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // If the server's private IP address is not in the same subnet as the // pod's CIDR, return false String cidrSubnet = NetUtils.getCidrSubNet(cidrAddress, cidrSize); - String serverSubnet = NetUtils.getSubNet(serverPrivateIP, - serverPrivateNetmask); + String serverSubnet = NetUtils.getSubNet(serverPrivateIP, serverPrivateNetmask); if (!cidrSubnet.equals(serverSubnet)) { return false; } // If the server's private netmask is less inclusive than the pod's CIDR // netmask, return false - String cidrNetmask = NetUtils - .getCidrSubNet("255.255.255.255", cidrSize); + String cidrNetmask = NetUtils.getCidrSubNet("255.255.255.255", cidrSize); long cidrNetmaskNumeric = NetUtils.ip2Long(cidrNetmask); long serverNetmaskNumeric = NetUtils.ip2Long(serverPrivateNetmask); if (serverNetmaskNumeric > cidrNetmaskNumeric) { @@ -1884,9 +1633,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return true; } - protected HostVO createHostVO(StartupCommand[] cmds, - ServerResource resource, Map details, - List hostTags, ResourceStateAdapter.Event stateEvent) { + protected HostVO createHostVO(StartupCommand[] cmds, ServerResource resource, Map details, List hostTags, + ResourceStateAdapter.Event stateEvent) { StartupCommand startup = cmds[0]; HostVO host = findHostByGuid(startup.getGuid()); boolean isNew = false; @@ -1902,16 +1650,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, String pod = startup.getPod(); String cluster = startup.getCluster(); - if (pod != null && dataCenter != null - && pod.equalsIgnoreCase("default") - && dataCenter.equalsIgnoreCase("default")) { + if (pod != null && dataCenter != null && pod.equalsIgnoreCase("default") && dataCenter.equalsIgnoreCase("default")) { List pods = _podDao.listAllIncludingRemoved(); for (HostPodVO hpv : pods) { - if (checkCIDR(hpv, startup.getPrivateIpAddress(), - startup.getPrivateNetmask())) { + if (checkCIDR(hpv, startup.getPrivateIpAddress(), startup.getPrivateNetmask())) { pod = hpv.getName(); - dataCenter = _dcDao.findById(hpv.getDataCenterId()) - .getName(); + dataCenter = _dcDao.findById(hpv.getDataCenterId()).getName(); break; } } @@ -1927,9 +1671,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } } if (dc == null) { - throw new IllegalArgumentException("Host " - + startup.getPrivateIpAddress() - + " sent incorrect data center: " + dataCenter); + throw new IllegalArgumentException("Host " + startup.getPrivateIpAddress() + " sent incorrect data center: " + dataCenter); } dcId = dc.getId(); @@ -1991,11 +1733,9 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, host.setResource(resource.getClass().getName()); } - host = (HostVO) dispatchToStateAdapters(stateEvent, true, host, cmds, - resource, details, hostTags); + host = (HostVO) dispatchToStateAdapters(stateEvent, true, host, cmds, resource, details, hostTags); if (host == null) { - throw new CloudRuntimeException( - "No resource state adapter response"); + throw new CloudRuntimeException("No resource state adapter response"); } if (isNew) { @@ -2005,28 +1745,23 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } try { - resourceStateTransitTo(host, ResourceState.Event.InternalCreated, - _nodeId); + resourceStateTransitTo(host, ResourceState.Event.InternalCreated, _nodeId); /* Agent goes to Connecting status */ - _agentMgr.agentStatusTransitTo(host, Status.Event.AgentConnected, - _nodeId); + _agentMgr.agentStatusTransitTo(host, Status.Event.AgentConnected, _nodeId); } catch (Exception e) { - s_logger.debug("Cannot transmit host " + host.getId() - + " to Creating state", e); + s_logger.debug("Cannot transmit host " + host.getId() + " to Creating state", e); _agentMgr.agentStatusTransitTo(host, Status.Event.Error, _nodeId); try { resourceStateTransitTo(host, ResourceState.Event.Error, _nodeId); } catch (NoTransitionException e1) { - s_logger.debug("Cannot transmit host " + host.getId() - + "to Error state", e); + s_logger.debug("Cannot transmit host " + host.getId() + "to Error state", e); } } return host; } - private boolean isFirstHostInCluster(HostVO host) - { + private boolean isFirstHostInCluster(HostVO host) { boolean isFirstHost = true; if (host.getClusterId() != null) { SearchBuilder sb = _hostDao.createSearchBuilder(); @@ -2045,7 +1780,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } private void markHostAsDisconnected(HostVO host, StartupCommand[] cmds) { - if (host == null) { // in case host is null due to some errors, try reloading the host from db + if (host == null) { // in case host is null due to some errors, try + // reloading the host from db if (cmds != null) { StartupCommand firstCmd = cmds[0]; host = findHostByGuid(firstCmd.getGuid()); @@ -2056,13 +1792,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } if (host != null) { - // Change agent status to Alert, so that host is considered for reconnection next time + // Change agent status to Alert, so that host is considered for + // reconnection next time _agentMgr.agentStatusTransitTo(host, Status.Event.AgentDisconnected, _nodeId); } } - private Host createHostAndAgent(ServerResource resource, Map details, boolean old, List hostTags, - boolean forRebalance) { + private Host createHostAndAgent(ServerResource resource, Map details, boolean old, List hostTags, boolean forRebalance) { HostVO host = null; AgentAttache attache = null; StartupCommand[] cmds = null; @@ -2076,17 +1812,16 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } /* Generate a random version in a dev setup situation */ - if (this.getClass().getPackage().getImplementationVersion() == null) { - for (StartupCommand cmd : cmds) { - if (cmd.getVersion() == null) { + if (this.getClass().getPackage().getImplementationVersion() == null) { + for (StartupCommand cmd : cmds) { + if (cmd.getVersion() == null) { cmd.setVersion(Long.toString(System.currentTimeMillis())); } } } if (s_logger.isDebugEnabled()) { - new Request(-1l, -1l, cmds, true, false).logD( - "Startup request from directly connected host: ", true); + new Request(-1l, -1l, cmds, true, false).logD("Startup request from directly connected host: ", true); } if (old) { @@ -2095,22 +1830,21 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (host == null) { host = findHostByGuid(firstCmd.getGuidWithoutResource()); } - if (host != null && host.getRemoved() == null) { // host already added, no need to add again + if (host != null && host.getRemoved() == null) { // host already + // added, no + // need to add + // again s_logger.debug("Found the host " + host.getId() + " by guid: " + firstCmd.getGuid() + ", old host reconnected as new"); - hostExists = true; // ensures that host status is left unchanged in case of adding same one again + hostExists = true; // ensures that host status is left + // unchanged in case of adding same one + // again return null; } } - host = createHostVO( - cmds, - resource, - details, - hostTags, - ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT); + host = createHostVO(cmds, resource, details, hostTags, ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT); if (host != null) { - attache = _agentMgr.handleDirectConnectAgent(host, cmds, - resource, forRebalance); + attache = _agentMgr.handleDirectConnectAgent(host, cmds, resource, forRebalance); /* reload myself from database */ host = _hostDao.findById(host.getId()); } @@ -2150,9 +1884,9 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } /* Generate a random version in a dev setup situation */ - if ( this.getClass().getPackage().getImplementationVersion() == null ) { - for ( StartupCommand cmd : cmds ) { - if ( cmd.getVersion() == null ) { + if (this.getClass().getPackage().getImplementationVersion() == null) { + for (StartupCommand cmd : cmds) { + if (cmd.getVersion() == null) { cmd.setVersion(Long.toString(System.currentTimeMillis())); } } @@ -2168,9 +1902,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (host == null) { host = findHostByGuid(firstCmd.getGuidWithoutResource()); } - if (host != null && host.getRemoved() == null) { // host already added, no need to add again + if (host != null && host.getRemoved() == null) { // host already + // added, no + // need to add + // again s_logger.debug("Found the host " + host.getId() + " by guid: " + firstCmd.getGuid() + ", old host reconnected as new"); - hostExists = true; // ensures that host status is left unchanged in case of adding same one again + hostExists = true; // ensures that host status is left + // unchanged in case of adding same one + // again return null; } } @@ -2178,11 +1917,30 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, host = null; GlobalLock addHostLock = GlobalLock.getInternLock("AddHostLock"); try { - if (addHostLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { // to safely determine first host in cluster in multi-MS scenario + if (addHostLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { // to + // safely + // determine + // first + // host + // in + // cluster + // in + // multi-MS + // scenario try { host = createHostVO(cmds, resource, details, hostTags, ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT); if (host != null) { - deferAgentCreation = !isFirstHostInCluster(host); // if first host in cluster no need to defer agent creation + deferAgentCreation = !isFirstHostInCluster(host); // if + // first + // host + // in + // cluster + // no + // need + // to + // defer + // agent + // creation } } finally { addHostLock.unlock(); @@ -2193,12 +1951,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } if (host != null) { - if (!deferAgentCreation) { // if first host in cluster then create agent otherwise defer it to scan task + if (!deferAgentCreation) { // if first host in cluster then + // create agent otherwise defer it to + // scan task attache = _agentMgr.handleDirectConnectAgent(host, cmds, resource, forRebalance); host = _hostDao.findById(host.getId()); // reload } else { host = _hostDao.findById(host.getId()); // reload - // force host status to 'Alert' so that it is loaded for connection during next scan task + // force host status to 'Alert' so that it is loaded for + // connection during next scan task _agentMgr.agentStatusTransitTo(host, Status.Event.AgentDisconnected, _nodeId); host = _hostDao.findById(host.getId()); // reload @@ -2207,7 +1968,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // schedule a scan task immediately if (_agentMgr instanceof ClusteredAgentManagerImpl) { - ClusteredAgentManagerImpl clusteredAgentMgr = (ClusteredAgentManagerImpl)_agentMgr; + ClusteredAgentManagerImpl clusteredAgentMgr = (ClusteredAgentManagerImpl) _agentMgr; if (s_logger.isDebugEnabled()) { s_logger.debug("Scheduling a host scan task"); } @@ -2242,29 +2003,24 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public Host createHostAndAgent(Long hostId, ServerResource resource, - Map details, boolean old, List hostTags, - boolean forRebalance) { + public Host createHostAndAgent(Long hostId, ServerResource resource, Map details, boolean old, List hostTags, + boolean forRebalance) { _agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Add); - Host host = createHostAndAgent(resource, details, old, hostTags, - forRebalance); + Host host = createHostAndAgent(resource, details, old, hostTags, forRebalance); _agentMgr.tapLoadingAgents(hostId, TapAgentsAction.Del); return host; } @Override - public Host addHost(long zoneId, ServerResource resource, Type hostType, - Map hostDetails) { + public Host addHost(long zoneId, ServerResource resource, Type hostType, Map hostDetails) { // Check if the zone exists in the system if (_dcDao.findById(zoneId) == null) { - throw new InvalidParameterValueException("Can't find zone with id " - + zoneId); + throw new InvalidParameterValueException("Can't find zone with id " + zoneId); } Map details = hostDetails; String guid = details.get("guid"); - List currentHosts = this - .listAllUpAndEnabledHostsInOneZoneByType(hostType, zoneId); + List currentHosts = this.listAllUpAndEnabledHostsInOneZoneByType(hostType, zoneId); for (HostVO currentHost : currentHosts) { if (currentHost.getGuid().equals(guid)) { return currentHost; @@ -2276,85 +2032,59 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public HostVO createHostVOForConnectedAgent(StartupCommand[] cmds) { - return createHostVO(cmds, null, null, null, - ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_CONNECTED); + return createHostVO(cmds, null, null, null, ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_CONNECTED); } - private void checkIPConflicts(HostPodVO pod, DataCenterVO dc, - String serverPrivateIP, String serverPrivateNetmask, - String serverPublicIP, String serverPublicNetmask) { + private void checkIPConflicts(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask, String serverPublicIP, + String serverPublicNetmask) { // If the server's private IP is the same as is public IP, this host has // a host-only private network. Don't check for conflicts with the // private IP address table. if (serverPrivateIP != serverPublicIP) { - if (!_privateIPAddressDao.mark(dc.getId(), pod.getId(), - serverPrivateIP)) { + if (!_privateIPAddressDao.mark(dc.getId(), pod.getId(), serverPrivateIP)) { // If the server's private IP address is already in the // database, return false - List existingPrivateIPs = _privateIPAddressDao - .listByPodIdDcIdIpAddress(pod.getId(), dc.getId(), - serverPrivateIP); + List existingPrivateIPs = _privateIPAddressDao.listByPodIdDcIdIpAddress(pod.getId(), dc.getId(), + serverPrivateIP); - assert existingPrivateIPs.size() <= 1 : " How can we get more than one ip address with " - + serverPrivateIP; + assert existingPrivateIPs.size() <= 1 : " How can we get more than one ip address with " + serverPrivateIP; if (existingPrivateIPs.size() > 1) { - throw new IllegalArgumentException( - "The private ip address of the server (" - + serverPrivateIP - + ") is already in use in pod: " - + pod.getName() + " and zone: " - + dc.getName()); + throw new IllegalArgumentException("The private ip address of the server (" + serverPrivateIP + ") is already in use in pod: " + + pod.getName() + " and zone: " + dc.getName()); } if (existingPrivateIPs.size() == 1) { DataCenterIpAddressVO vo = existingPrivateIPs.get(0); if (vo.getInstanceId() != null) { - throw new IllegalArgumentException( - "The private ip address of the server (" - + serverPrivateIP - + ") is already in use in pod: " - + pod.getName() + " and zone: " - + dc.getName()); + throw new IllegalArgumentException("The private ip address of the server (" + serverPrivateIP + + ") is already in use in pod: " + pod.getName() + " and zone: " + dc.getName()); } } } } - if (serverPublicIP != null - && !_publicIPAddressDao - .mark(dc.getId(), new Ip(serverPublicIP))) { + if (serverPublicIP != null && !_publicIPAddressDao.mark(dc.getId(), new Ip(serverPublicIP))) { // If the server's public IP address is already in the database, // return false - List existingPublicIPs = _publicIPAddressDao - .listByDcIdIpAddress(dc.getId(), serverPublicIP); + List existingPublicIPs = _publicIPAddressDao.listByDcIdIpAddress(dc.getId(), serverPublicIP); if (existingPublicIPs.size() > 0) { - throw new IllegalArgumentException( - "The public ip address of the server (" - + serverPublicIP - + ") is already in use in zone: " - + dc.getName()); + throw new IllegalArgumentException("The public ip address of the server (" + serverPublicIP + ") is already in use in zone: " + + dc.getName()); } } } @Override - public HostVO fillRoutingHostVO(HostVO host, StartupRoutingCommand ssCmd, - HypervisorType hyType, Map details, - List hostTags) { + public HostVO fillRoutingHostVO(HostVO host, StartupRoutingCommand ssCmd, HypervisorType hyType, Map details, + List hostTags) { if (host.getPodId() == null) { - s_logger.error("Host " + ssCmd.getPrivateIpAddress() - + " sent incorrect pod, pod id is null"); - throw new IllegalArgumentException("Host " - + ssCmd.getPrivateIpAddress() - + " sent incorrect pod, pod id is null"); + s_logger.error("Host " + ssCmd.getPrivateIpAddress() + " sent incorrect pod, pod id is null"); + throw new IllegalArgumentException("Host " + ssCmd.getPrivateIpAddress() + " sent incorrect pod, pod id is null"); } ClusterVO clusterVO = _clusterDao.findById(host.getClusterId()); if (clusterVO.getHypervisorType() != hyType) { - throw new IllegalArgumentException( - "Can't add host whose hypervisor type is: " + hyType - + " into cluster: " + clusterVO.getId() - + " whose hypervisor type is: " - + clusterVO.getHypervisorType()); + throw new IllegalArgumentException("Can't add host whose hypervisor type is: " + hyType + " into cluster: " + clusterVO.getId() + + " whose hypervisor type is: " + clusterVO.getHypervisorType()); } final Map hostDetails = ssCmd.getHostDetails(); @@ -2368,9 +2098,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, HostPodVO pod = _podDao.findById(host.getPodId()); DataCenterVO dc = _dcDao.findById(host.getDataCenterId()); - checkIPConflicts(pod, dc, ssCmd.getPrivateIpAddress(), - ssCmd.getPublicIpAddress(), ssCmd.getPublicIpAddress(), - ssCmd.getPublicNetmask()); + checkIPConflicts(pod, dc, ssCmd.getPrivateIpAddress(), ssCmd.getPublicIpAddress(), ssCmd.getPublicIpAddress(), ssCmd.getPublicNetmask()); host.setType(com.cloud.host.Host.Type.Routing); host.setDetails(details); host.setCaps(ssCmd.getCapabilities()); @@ -2383,69 +2111,48 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public void deleteRoutingHost(HostVO host, boolean isForced, - boolean forceDestroyStorage) throws UnableDeleteHostException { + public void deleteRoutingHost(HostVO host, boolean isForced, boolean forceDestroyStorage) throws UnableDeleteHostException { if (host.getType() != Host.Type.Routing) { - throw new CloudRuntimeException( - "Non-Routing host gets in deleteRoutingHost, id is " - + host.getId()); + throw new CloudRuntimeException("Non-Routing host gets in deleteRoutingHost, id is " + host.getId()); } if (s_logger.isDebugEnabled()) { - s_logger.debug("Deleting Host: " + host.getId() + " Guid:" - + host.getGuid()); + s_logger.debug("Deleting Host: " + host.getId() + " Guid:" + host.getGuid()); } - User caller = _accountMgr.getActiveUser(UserContext.current() - .getCallerUserId()); + User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); - if (forceDestroyStorage) { - // put local storage into mainenance mode, will set all the VMs on - // this local storage into stopped state - StoragePoolVO storagePool = _storageMgr.findLocalStorageOnHost(host - .getId()); + if (forceDestroyStorage) { + // put local storage into mainenance mode, will set all the VMs on + // this local storage into stopped state + StoragePoolVO storagePool = _storageMgr.findLocalStorageOnHost(host.getId()); if (storagePool != null) { - if (storagePool.getStatus() == StoragePoolStatus.Up - || storagePool.getStatus() == StoragePoolStatus.ErrorInMaintenance) { - try { - StoragePool pool = _storageSvr - .preparePrimaryStorageForMaintenance(storagePool - .getId()); - if (pool == null) { - s_logger.debug("Failed to set primary storage into maintenance mode"); + if (storagePool.getStatus() == StoragePoolStatus.Up || storagePool.getStatus() == StoragePoolStatus.ErrorInMaintenance) { + try { + StoragePool pool = _storageSvr.preparePrimaryStorageForMaintenance(storagePool.getId()); + if (pool == null) { + s_logger.debug("Failed to set primary storage into maintenance mode"); - throw new UnableDeleteHostException( - "Failed to set primary storage into maintenance mode"); + throw new UnableDeleteHostException("Failed to set primary storage into maintenance mode"); } } catch (Exception e) { - s_logger.debug("Failed to set primary storage into maintenance mode, due to: " - + e.toString()); - throw new UnableDeleteHostException( - "Failed to set primary storage into maintenance mode, due to: " - + e.toString()); + s_logger.debug("Failed to set primary storage into maintenance mode, due to: " + e.toString()); + throw new UnableDeleteHostException("Failed to set primary storage into maintenance mode, due to: " + e.toString()); } } - List vmsOnLocalStorage = _storageMgr - .listByStoragePool(storagePool.getId()); + List vmsOnLocalStorage = _storageMgr.listByStoragePool(storagePool.getId()); for (VMInstanceVO vm : vmsOnLocalStorage) { try { - if (!_vmMgr.destroy(vm, caller, - _accountMgr.getAccount(vm.getAccountId()))) { - String errorMsg = "There was an error Destory the vm: " - + vm - + " as a part of hostDelete id=" - + host.getId(); + if (!_vmMgr.destroy(vm, caller, _accountMgr.getAccount(vm.getAccountId()))) { + String errorMsg = "There was an error Destory the vm: " + vm + " as a part of hostDelete id=" + host.getId(); s_logger.warn(errorMsg); throw new UnableDeleteHostException(errorMsg); } } catch (Exception e) { - String errorMsg = "There was an error Destory the vm: " - + vm + " as a part of hostDelete id=" - + host.getId(); + String errorMsg = "There was an error Destory the vm: " + vm + " as a part of hostDelete id=" + host.getId(); s_logger.debug(errorMsg, e); - throw new UnableDeleteHostException(errorMsg + "," - + e.getMessage()); + throw new UnableDeleteHostException(errorMsg + "," + e.getMessage()); } } } @@ -2457,45 +2164,26 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, // Stop HA disabled vms and HA enabled vms in Stopping state // Restart HA enabled vms for (VMInstanceVO vm : vms) { - if (!vm.isHaEnabled() - || vm.getState() == State.Stopping) { - s_logger.debug("Stopping vm: " + vm - + " as a part of deleteHost id=" - + host.getId()); + if (!vm.isHaEnabled() || vm.getState() == State.Stopping) { + s_logger.debug("Stopping vm: " + vm + " as a part of deleteHost id=" + host.getId()); try { - if (!_vmMgr.advanceStop(vm, true, caller, - _accountMgr.getAccount(vm - .getAccountId()))) { - String errorMsg = "There was an error stopping the vm: " - + vm - + " as a part of hostDelete id=" - + host.getId(); + if (!_vmMgr.advanceStop(vm, true, caller, _accountMgr.getAccount(vm.getAccountId()))) { + String errorMsg = "There was an error stopping the vm: " + vm + " as a part of hostDelete id=" + host.getId(); s_logger.warn(errorMsg); - throw new UnableDeleteHostException( - errorMsg); + throw new UnableDeleteHostException(errorMsg); } } catch (Exception e) { - String errorMsg = "There was an error stopping the vm: " - + vm - + " as a part of hostDelete id=" - + host.getId(); + String errorMsg = "There was an error stopping the vm: " + vm + " as a part of hostDelete id=" + host.getId(); s_logger.debug(errorMsg, e); - throw new UnableDeleteHostException(errorMsg - + "," + e.getMessage()); - } - } else if (vm.isHaEnabled() - && (vm.getState() == State.Running || vm - .getState() == State.Starting)) { - s_logger.debug("Scheduling restart for vm: " + vm - + " " + vm.getState() + " on the host id=" - + host.getId()); + throw new UnableDeleteHostException(errorMsg + "," + e.getMessage()); + } + } else if (vm.isHaEnabled() && (vm.getState() == State.Running || vm.getState() == State.Starting)) { + s_logger.debug("Scheduling restart for vm: " + vm + " " + vm.getState() + " on the host id=" + host.getId()); _haMgr.scheduleRestart(vm, false); } } } else { - throw new UnableDeleteHostException( - "Unable to delete the host as there are vms in " - + vms.get(0).getState() + throw new UnableDeleteHostException("Unable to delete the host as there are vms in " + vms.get(0).getState() + " state using this host and isForced=false specified"); } } @@ -2510,35 +2198,31 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return true; } - /* - * TODO: think twice about returning true or throwing out exception, I - * really prefer to exception that always exposes bugs - */ - if (host.getResourceState() != ResourceState.PrepareForMaintenance - && host.getResourceState() != ResourceState.Maintenance - && host.getResourceState() != ResourceState.ErrorInMaintenance) { - throw new CloudRuntimeException( - "Cannot perform cancelMaintenance when resource state is " - + host.getResourceState() + ", hostId = " + hostId); + /* + * TODO: think twice about returning true or throwing out exception, I + * really prefer to exception that always exposes bugs + */ + if (host.getResourceState() != ResourceState.PrepareForMaintenance && host.getResourceState() != ResourceState.Maintenance + && host.getResourceState() != ResourceState.ErrorInMaintenance) { + throw new CloudRuntimeException("Cannot perform cancelMaintenance when resource state is " + host.getResourceState() + ", hostId = " + + hostId); } - /* TODO: move to listener */ + /* TODO: move to listener */ _haMgr.cancelScheduledMigrations(host); List vms = _haMgr.findTakenMigrationWork(); for (VMInstanceVO vm : vms) { if (vm.getHostId() != null && vm.getHostId() == hostId) { - s_logger.info("Unable to cancel migration because the vm is being migrated: " - + vm); + s_logger.info("Unable to cancel migration because the vm is being migrated: " + vm); return false; } } try { - resourceStateTransitTo(host, - ResourceState.Event.AdminCancelMaintenance, _nodeId); + resourceStateTransitTo(host, ResourceState.Event.AdminCancelMaintenance, _nodeId); _agentMgr.pullAgentOutMaintenance(hostId); - // for kvm, need to log into kvm host, restart cloudstack-agent + // for kvm, need to log into kvm host, restart cloudstack-agent if (host.getHypervisorType() == HypervisorType.KVM) { _hostDao.loadDetails(host); String password = host.getDetail("password"); @@ -2547,19 +2231,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, s_logger.debug("Can't find password/username"); return false; } - com.trilead.ssh2.Connection connection = SSHCmdHelper - .acquireAuthorizedConnection( - host.getPrivateIpAddress(), 22, username, - password); + com.trilead.ssh2.Connection connection = SSHCmdHelper.acquireAuthorizedConnection(host.getPrivateIpAddress(), 22, username, password); if (connection == null) { - s_logger.debug("Failed to connect to host: " - + host.getPrivateIpAddress()); + s_logger.debug("Failed to connect to host: " + host.getPrivateIpAddress()); return false; } try { - SSHCmdHelper.sshExecuteCmdOneShot(connection, - "service cloudstack-agent restart"); + SSHCmdHelper.sshExecuteCmdOneShot(connection, "service cloudstack-agent restart"); } catch (sshException e) { return false; } @@ -2567,16 +2246,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return true; } catch (NoTransitionException e) { - s_logger.debug("Cannot transmit host " + host.getId() - + "to Enabled state", e); + s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e); return false; } } private boolean cancelMaintenance(long hostId) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, - ResourceState.Event.AdminCancelMaintenance); + Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.AdminCancelMaintenance); if (result != null) { return result; @@ -2589,49 +2266,42 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } @Override - public boolean executeUserRequest(long hostId, ResourceState.Event event) - throws AgentUnavailableException { + public boolean executeUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException { if (event == ResourceState.Event.AdminAskMaintenace) { return doMaintain(hostId); } else if (event == ResourceState.Event.AdminCancelMaintenance) { return doCancelMaintenance(hostId); } else if (event == ResourceState.Event.DeleteHost) { - /* TODO: Ask alex why we assume the last two parameters are false */ + /* TODO: Ask alex why we assume the last two parameters are false */ return doDeleteHost(hostId, false, false); } else if (event == ResourceState.Event.Unmanaged) { return doUmanageHost(hostId); } else if (event == ResourceState.Event.UpdatePassword) { return doUpdateHostPassword(hostId); } else { - throw new CloudRuntimeException( - "Received an resource event we are not handling now, " - + event); + throw new CloudRuntimeException("Received an resource event we are not handling now, " + event); } } private boolean doUmanageHost(long hostId) { HostVO host = _hostDao.findById(hostId); if (host == null) { - s_logger.debug("Cannot find host " + hostId - + ", assuming it has been deleted, skip umanage"); + s_logger.debug("Cannot find host " + hostId + ", assuming it has been deleted, skip umanage"); return true; } if (host.getHypervisorType() == HypervisorType.KVM) { - MaintainAnswer answer = (MaintainAnswer) _agentMgr.easySend(hostId, - new MaintainCommand()); + MaintainAnswer answer = (MaintainAnswer) _agentMgr.easySend(hostId, new MaintainCommand()); } - _agentMgr.disconnectWithoutInvestigation(hostId, - Event.ShutdownRequested); + _agentMgr.disconnectWithoutInvestigation(hostId, Event.ShutdownRequested); return true; } @Override public boolean umanageHost(long hostId) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, - ResourceState.Event.Unmanaged); + Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.Unmanaged); if (result != null) { return result; @@ -2653,8 +2323,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, String username = nv.getValue(); nv = _hostDetailsDao.findDetail(hostId, ApiConstants.PASSWORD); String password = nv.getValue(); - UpdateHostPasswordCommand cmd = new UpdateHostPasswordCommand(username, - password); + UpdateHostPasswordCommand cmd = new UpdateHostPasswordCommand(username, password); attache.updatePassword(cmd); return true; } @@ -2664,8 +2333,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (cmd.getClusterId() == null) { // update agent attache password try { - Boolean result = _clusterMgr.propagateResourceEvent( - cmd.getHostId(), ResourceState.Event.UpdatePassword); + Boolean result = _clusterMgr.propagateResourceEvent(cmd.getHostId(), ResourceState.Event.UpdatePassword); if (result != null) { return result; } @@ -2678,12 +2346,11 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, List hosts = this.listAllHostsInCluster(cmd.getClusterId()); for (HostVO h : hosts) { try { - /* - * FIXME: this is a buggy logic, check with alex. Shouldn't - * return if propagation return non null - */ - Boolean result = _clusterMgr.propagateResourceEvent( - h.getId(), ResourceState.Event.UpdatePassword); + /* + * FIXME: this is a buggy logic, check with alex. Shouldn't + * return if propagation return non null + */ + Boolean result = _clusterMgr.propagateResourceEvent(h.getId(), ResourceState.Event.UpdatePassword); if (result != null) { return result; } @@ -2707,14 +2374,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return false; } else { try { - return resourceStateTransitTo(host, - ResourceState.Event.UnableToMigrate, _nodeId); + return resourceStateTransitTo(host, ResourceState.Event.UnableToMigrate, _nodeId); } catch (NoTransitionException e) { - s_logger.debug( - "No next resource state for host " + host.getId() - + " while current state is " - + host.getResourceState() + " with event " - + ResourceState.Event.UnableToMigrate, e); + s_logger.debug("No next resource state for host " + host.getId() + " while current state is " + host.getResourceState() + + " with event " + ResourceState.Event.UnableToMigrate, e); return false; } } @@ -2723,19 +2386,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public List findDirectlyConnectedHosts() { /* The resource column is not null for direct connected resource */ - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getResource(), Op.NNULL); - sc.addAnd(sc.getEntity().getResourceState(), Op.NIN, - ResourceState.Disabled); + sc.addAnd(sc.getEntity().getResourceState(), Op.NIN, ResourceState.Disabled); return sc.list(); } @Override - public List listAllUpAndEnabledHosts(Type type, Long clusterId, - Long podId, long dcId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + public List listAllUpAndEnabledHosts(Type type, Long clusterId, Long podId, long dcId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); if (type != null) { sc.addAnd(sc.getEntity().getType(), Op.EQ, type); } @@ -2747,23 +2406,19 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up); - sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, - ResourceState.Enabled); + sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, ResourceState.Enabled); return sc.list(); } @Override - public List listAllUpAndEnabledNonHAHosts(Type type, - Long clusterId, Long podId, long dcId) { + public List listAllUpAndEnabledNonHAHosts(Type type, Long clusterId, Long podId, long dcId) { String haTag = _haMgr.getHaTag(); - return _hostDao.listAllUpAndEnabledNonHAHosts(type, clusterId, podId, - dcId, haTag); + return _hostDao.listAllUpAndEnabledNonHAHosts(type, clusterId, podId, dcId, haTag); } @Override public List findHostByGuid(long dcId, String guid) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); sc.addAnd(sc.getEntity().getGuid(), Op.EQ, guid); return sc.list(); @@ -2771,53 +2426,44 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public List listAllHostsInCluster(long clusterId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getClusterId(), Op.EQ, clusterId); return sc.list(); } @Override public List listHostsInClusterByStatus(long clusterId, Status status) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getClusterId(), Op.EQ, clusterId); sc.addAnd(sc.getEntity().getStatus(), Op.EQ, status); return sc.list(); } @Override - public List listAllUpAndEnabledHostsInOneZoneByType(Type type, - long dcId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + public List listAllUpAndEnabledHostsInOneZoneByType(Type type, long dcId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getType(), Op.EQ, type); sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up); - sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, - ResourceState.Enabled); + sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, ResourceState.Enabled); return sc.list(); } @Override - public List listAllNotInMaintenanceHostsInOneZone(Type type, - Long dcId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); - if (dcId != null) { + public List listAllNotInMaintenanceHostsInOneZone(Type type, Long dcId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); + if (dcId != null) { sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); } sc.addAnd(sc.getEntity().getType(), Op.EQ, type); - sc.addAnd(sc.getEntity().getResourceState(), Op.NIN, - ResourceState.Maintenance, ResourceState.ErrorInMaintenance, - ResourceState.PrepareForMaintenance, ResourceState.Error); + sc.addAnd(sc.getEntity().getResourceState(), Op.NIN, ResourceState.Maintenance, ResourceState.ErrorInMaintenance, + ResourceState.PrepareForMaintenance, ResourceState.Error); return sc.list(); } @Override public List listAllHostsInOneZoneByType(Type type, long dcId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getType(), Op.EQ, type); sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); return sc.list(); @@ -2825,17 +2471,14 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public List listAllHostsInAllZonesByType(Type type) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getType(), Op.EQ, type); return sc.list(); } @Override - public List listAvailHypervisorInZone(Long hostId, - Long zoneId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + public List listAvailHypervisorInZone(Long hostId, Long zoneId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); if (zoneId != null) { sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, zoneId); } @@ -2854,35 +2497,30 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public HostVO findHostByGuid(String guid) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getGuid(), Op.EQ, guid); return sc.find(); } @Override public HostVO findHostByName(String name) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getName(), Op.EQ, name); return sc.find(); } @Override public List listHostsByNameLike(String name) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getName(), Op.LIKE, "%" + name + "%"); return sc.list(); } @Override - public Pair findPod(VirtualMachineTemplate template, - ServiceOfferingVO offering, DataCenterVO dc, long accountId, - Set avoids) { - for (PodAllocator allocator : _podAllocators) { - final Pair pod = allocator.allocateTo(template, - offering, dc, accountId, avoids); + public Pair findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long accountId, + Set avoids) { + for (PodAllocator allocator : _podAllocators) { + final Pair pod = allocator.allocateTo(template, offering, dc, accountId, avoids); if (pod != null) { return pod; } @@ -2892,9 +2530,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public HostStats getHostStatistics(long hostId) { - Answer answer = _agentMgr.easySend(hostId, new GetHostStatsCommand( - _hostDao.findById(hostId).getGuid(), _hostDao.findById(hostId) - .getName(), hostId)); + Answer answer = _agentMgr.easySend(hostId, new GetHostStatsCommand(_hostDao.findById(hostId).getGuid(), _hostDao.findById(hostId).getName(), + hostId)); if (answer != null && (answer instanceof UnsupportedAnswer)) { return null; @@ -2921,8 +2558,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return null; } else { _hostDao.loadDetails(host); - DetailVO detail = _hostDetailsDao.findDetail(hostId, - "guest.os.category.id"); + DetailVO detail = _hostDetailsDao.findDetail(hostId, "guest.os.category.id"); if (detail == null) { return null; } else { @@ -2958,16 +2594,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return pcs; } - @Override - public List listAllUpAndEnabledHostsInOneZoneByHypervisor( - HypervisorType type, long dcId) { - SearchCriteriaService sc = SearchCriteria2 - .create(HostVO.class); + @Override + public List listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType type, long dcId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getHypervisorType(), Op.EQ, type); sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up); - sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, - ResourceState.Enabled); + sc.addAnd(sc.getEntity().getResourceState(), Op.EQ, ResourceState.Enabled); return sc.list(); - } + } } diff --git a/server/src/com/cloud/storage/s3/S3Manager.java b/server/src/com/cloud/storage/s3/S3Manager.java index 0f74e431376..14da1da3577 100644 --- a/server/src/com/cloud/storage/s3/S3Manager.java +++ b/server/src/com/cloud/storage/s3/S3Manager.java @@ -19,6 +19,7 @@ package com.cloud.storage.s3; import java.util.List; +import java.util.Map; import com.cloud.agent.api.to.S3TO; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; @@ -40,6 +41,8 @@ public interface S3Manager extends Manager { S3 addS3(AddS3Cmd addS3Cmd) throws DiscoveryException; + void verifyS3Fields(Map params) throws DiscoveryException; + Long chooseZoneForTemplateExtract(VMTemplateVO template); boolean isS3Enabled(); diff --git a/server/src/com/cloud/storage/s3/S3ManagerImpl.java b/server/src/com/cloud/storage/s3/S3ManagerImpl.java index 61e5573394d..06106db432c 100644 --- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java +++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java @@ -46,6 +46,7 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; import org.apache.log4j.Logger; @@ -89,12 +90,13 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { private static final Logger LOGGER = Logger.getLogger(S3ManagerImpl.class); - @Inject + @Inject private AgentManager agentManager; @Inject private S3Dao s3Dao; + @Inject private VMTemplateZoneDao vmTemplateZoneDao; @@ -121,7 +123,7 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { public S3ManagerImpl() { } - + private void verifyConnection(final S3TO s3) throws DiscoveryException { if (!canConnect(s3)) { @@ -247,6 +249,26 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { } + + @Override + public void verifyS3Fields(Map params) throws DiscoveryException { + final S3VO s3VO = new S3VO(UUID.randomUUID().toString(), + params.get(ApiConstants.S3_ACCESS_KEY), + params.get(ApiConstants.S3_SECRET_KEY), + params.get(ApiConstants.S3_END_POINT), + params.get(ApiConstants.S3_BUCKET_NAME), + Boolean.valueOf(params.get(ApiConstants.S3_HTTPS_FLAG)), + Integer.valueOf(params.get(ApiConstants.S3_CONNECTION_TIMEOUT)), + Integer.valueOf(params.get(ApiConstants.S3_MAX_ERROR_RETRY)), + Integer.valueOf(params.get(ApiConstants.S3_SOCKET_TIMEOUT)), now()); + + this.validateFields(s3VO); + + final S3TO s3 = s3VO.toS3TO(); + this.verifyConnection(s3); + this.verifyBuckets(s3); + } + @Override public boolean isS3Enabled() { return Boolean diff --git a/server/test/com/cloud/resource/MockResourceManagerImpl.java b/server/test/com/cloud/resource/MockResourceManagerImpl.java index df62d2e6bc9..da4d3fb67c3 100644 --- a/server/test/com/cloud/resource/MockResourceManagerImpl.java +++ b/server/test/com/cloud/resource/MockResourceManagerImpl.java @@ -49,7 +49,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Cluster; import com.cloud.resource.ResourceState.Event; import com.cloud.service.ServiceOfferingVO; -import com.cloud.storage.ObjectStore; +import com.cloud.storage.ImageStore; import com.cloud.storage.S3; import com.cloud.storage.Swift; import com.cloud.template.VirtualMachineTemplate; @@ -610,7 +610,7 @@ public class MockResourceManagerImpl extends ManagerBase implements ResourceMana } @Override - public ObjectStore discoverObjectStore(AddSecondaryStorageCmd cmd) throws IllegalArgumentException, DiscoveryException, + public ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { // TODO Auto-generated method stub return null; diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index ed954619f49..38bad7ab9de 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -68,54 +68,53 @@ CREATE TABLE `cloud`.`object_datastore_ref` ( -- PRIMARY KEY(`id`) -- ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`image_data_store` ( +CREATE TABLE `cloud`.`image_store` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(255) NOT NULL COMMENT 'name of data store', - `image_provider_name` varchar(255) NOT NULL COMMENT 'id of image_data_store_provider', + `image_provider_name` varchar(255) NOT NULL COMMENT 'id of image_store_provider', `protocol` varchar(255) NOT NULL COMMENT 'protocol of data store', `url` varchar(255) COMMENT 'url for image data store', `data_center_id` bigint unsigned COMMENT 'datacenter id of data store', - `region_id` bigint unsigned COMMENT 'region id of data store', `scope` varchar(255) COMMENT 'scope of data store', `uuid` varchar(255) COMMENT 'uuid of data store', + `state` varchar(30) COMMENT 'state of data store', + `created` datetime COMMENT 'date the image store first signed on', + `removed` datetime COMMENT 'date removed if not null', PRIMARY KEY(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`image_data_store_details` ( +CREATE TABLE `cloud`.`image_store_details` ( `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', `store_id` bigint unsigned NOT NULL COMMENT 'store the detail is related to', `name` varchar(255) NOT NULL COMMENT 'name of the detail', `value` varchar(255) NOT NULL COMMENT 'value of the detail', PRIMARY KEY (`id`), - CONSTRAINT `fk_image_data_store_details__store_id` FOREIGN KEY `fk_image_data_store__store_id`(`store_id`) REFERENCES `image_data_store`(`id`) ON DELETE CASCADE, - INDEX `i_image_data_store__name__value`(`name`(128), `value`(128)) + CONSTRAINT `fk_image_store_details__store_id` FOREIGN KEY `fk_image_store__store_id`(`store_id`) REFERENCES `image_store`(`id`) ON DELETE CASCADE, + INDEX `i_image_store__name__value`(`name`(128), `value`(128)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -DROP VIEW IF EXISTS `cloud`.`image_data_store_view`; -CREATE VIEW `cloud`.`image_data_store_view` AS +DROP VIEW IF EXISTS `cloud`.`image_store_view`; +CREATE VIEW `cloud`.`image_store_view` AS select - image_data_store.id, - image_data_store.uuid, - image_data_store.name, - image_data_store.provider_name, - image_data_store.protocol, - image_data_store.url, - image_data_store.scope, + image_store.id, + image_store.uuid, + image_store.name, + image_store.image_provider_name, + image_store.protocol, + image_store.url, + image_store.scope, + image_store.state, data_center.id data_center_id, data_center.uuid data_center_uuid, data_center.name data_center_name, - region.id region_id, - region.name region_name, - image_data_store_details.name detail_name, - image_data_store_details.value detail_value + image_store_details.name detail_name, + image_store_details.value detail_value from - `cloud`.`image_data_store` + `cloud`.`image_store` left join - `cloud`.`data_center` ON image_data_store.data_center_id = data_center.id + `cloud`.`data_center` ON image_store.data_center_id = data_center.id left join - `cloud`.`region` ON image_data_store.region_id = region.id - left join - `cloud`.`image_data_store_details` ON image_data_store_details.store_id = image_data_store.id; + `cloud`.`image_store_details` ON image_store_details.store_id = image_store.id; CREATE TABLE `cloud`.`template_store_ref` (