blob: 98eeb6b4405a7c6c5ee1248cb15a43d5cf2846f6 [file] [log] [blame]
/*
* 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.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
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.PrimaryDataStoreDriver;
import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
import org.apache.cloudstack.storage.image.ImageStoreDriver;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.component.Registry;
@Component
public class DataStoreProviderManagerImpl extends ManagerBase implements DataStoreProviderManager, Registry<DataStoreProvider> {
private static final Logger s_logger = Logger.getLogger(DataStoreProviderManagerImpl.class);
List<DataStoreProvider> providers;
protected Map<String, DataStoreProvider> providerMap = new ConcurrentHashMap<String, DataStoreProvider>();
@Inject
PrimaryDataStoreProviderManager primaryDataStoreProviderMgr;
@Inject
ImageStoreProviderManager imageStoreProviderMgr;
@Override
public DataStoreProvider getDataStoreProvider(String name) {
if (name == null)
return null;
return providerMap.get(name);
}
public List<StorageProviderResponse> getPrimaryDataStoreProviders() {
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
for (DataStoreProvider provider : providerMap.values()) {
if (provider.getTypes().contains(DataStoreProviderType.PRIMARY)) {
StorageProviderResponse response = new StorageProviderResponse();
response.setName(provider.getName());
response.setType(DataStoreProvider.DataStoreProviderType.PRIMARY.toString());
providers.add(response);
}
}
return providers;
}
public List<StorageProviderResponse> getImageDataStoreProviders() {
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
for (DataStoreProvider provider : providerMap.values()) {
if (provider.getTypes().contains(DataStoreProviderType.IMAGE)) {
StorageProviderResponse response = new StorageProviderResponse();
response.setName(provider.getName());
response.setType(DataStoreProvider.DataStoreProviderType.IMAGE.toString());
providers.add(response);
}
}
return providers;
}
public List<StorageProviderResponse> getCacheDataStoreProviders() {
List<StorageProviderResponse> providers = new ArrayList<StorageProviderResponse>();
for (DataStoreProvider provider : providerMap.values()) {
if (provider.getTypes().contains(DataStoreProviderType.ImageCache)) {
StorageProviderResponse response = new StorageProviderResponse();
response.setName(provider.getName());
response.setType(DataStoreProviderType.ImageCache.toString());
providers.add(response);
}
}
return providers;
}
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
if (providers != null) {
for (DataStoreProvider provider : providers) {
registerProvider(provider);
}
}
providers = new CopyOnWriteArrayList<DataStoreProvider>(providers);
return true;
}
protected boolean registerProvider(DataStoreProvider provider) {
Map<String, Object> copyParams = new HashMap<String, Object>();
String providerName = provider.getName();
if (providerMap.get(providerName) != null) {
s_logger.debug("Did not register data store provider, provider name: " + providerName + " is not unique");
return false;
}
s_logger.debug("registering data store provider:" + provider.getName());
providerMap.put(providerName, provider);
try {
boolean registrationResult = provider.configure(copyParams);
if (!registrationResult) {
providerMap.remove(providerName);
s_logger.debug("Failed to register data store provider: " + providerName);
return false;
}
Set<DataStoreProviderType> types = provider.getTypes();
if (types.contains(DataStoreProviderType.PRIMARY)) {
primaryDataStoreProviderMgr.registerDriver(provider.getName(), (PrimaryDataStoreDriver)provider.getDataStoreDriver());
primaryDataStoreProviderMgr.registerHostListener(provider.getName(), provider.getHostListener());
} else if (types.contains(DataStoreProviderType.IMAGE)) {
imageStoreProviderMgr.registerDriver(provider.getName(), (ImageStoreDriver)provider.getDataStoreDriver());
}
} catch (Exception e) {
s_logger.debug("configure provider failed", e);
providerMap.remove(providerName);
return false;
}
return true;
}
@Override
public DataStoreProvider getDefaultPrimaryDataStoreProvider() {
return this.getDataStoreProvider(DataStoreProvider.DEFAULT_PRIMARY);
}
@Override
public DataStoreProvider getDefaultImageDataStoreProvider() {
return this.getDataStoreProvider(DataStoreProvider.NFS_IMAGE);
}
@Override
public DataStoreProvider getDefaultCacheDataStoreProvider() {
return this.getDataStoreProvider(DataStoreProvider.NFS_IMAGE);
}
@Override
public List<StorageProviderResponse> getDataStoreProviders(String type) {
if (type == null) {
throw new InvalidParameterValueException("Invalid parameter, need to specify type: either primary or image");
}
if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.PRIMARY.toString())) {
return this.getPrimaryDataStoreProviders();
} else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.IMAGE.toString())) {
return this.getImageDataStoreProviders();
} else if (type.equalsIgnoreCase(DataStoreProvider.DataStoreProviderType.ImageCache.toString())) {
return this.getCacheDataStoreProviders();
} else {
throw new InvalidParameterValueException("Invalid parameter: " + type);
}
}
@Override
public boolean register(DataStoreProvider type) {
if (registerProvider(type)) {
providers.add(type);
return true;
}
return false;
}
@Override
public void unregister(DataStoreProvider type) {
/* Sorry, no unregister supported... */
}
@Override
public List<DataStoreProvider> getRegistered() {
return Collections.unmodifiableList(providers);
}
@Inject
public void setProviders(List<DataStoreProvider> providers) {
this.providers = providers;
}
public void setPrimaryDataStoreProviderMgr(PrimaryDataStoreProviderManager primaryDataStoreProviderMgr) {
this.primaryDataStoreProviderMgr = primaryDataStoreProviderMgr;
}
public void setImageStoreProviderMgr(ImageStoreProviderManager imageDataStoreProviderMgr) {
this.imageStoreProviderMgr = imageDataStoreProviderMgr;
}
@Override
public List<DataStoreProvider> getProviders() {
return providers;
}
}