/*
*
* * Copyright 2000-2014 JetBrains s.r.o.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/
package jetbrains.buildServer.clouds.base;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import jetbrains.buildServer.clouds.CloudErrorInfo;
import jetbrains.buildServer.clouds.CloudImage;
import jetbrains.buildServer.clouds.CloudInstanceUserData;
import jetbrains.buildServer.clouds.base.beans.CloudImageDetails;
import jetbrains.buildServer.clouds.base.connector.AbstractInstance;
import jetbrains.buildServer.clouds.base.errors.CloudErrorMap;
import jetbrains.buildServer.clouds.base.errors.TypedCloudErrorInfo;
import jetbrains.buildServer.clouds.base.errors.UpdatableCloudErrorProvider;
import jetbrains.buildServer.clouds.vmware.errors.VmwareErrorMessages;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Sergey.Pak
* Date: 7/22/2014
* Time: 1:50 PM
*/
public abstract class AbstractCloudImage<T extends AbstractCloudInstance, G extends CloudImageDetails> implements CloudImage, UpdatableCloudErrorProvider {
protected final UpdatableCloudErrorProvider myErrorProvider = new CloudErrorMap(VmwareErrorMessages.getInstance());
private final Map<String, T> myInstances = new ConcurrentHashMap<String, T>();
private final String myName;
private final String myId;
protected AbstractCloudImage(String name, String id) {
myName = name;
myId = id;
}
@NotNull
public String getId() {
return myId;
}
@NotNull
public String getName() {
return myName;
}
public void updateErrors(TypedCloudErrorInfo... errors) {
myErrorProvider.updateErrors(errors);
}
@Nullable
public CloudErrorInfo getErrorInfo() {
return myErrorProvider.getErrorInfo();
}
@NotNull
public Collection<T> getInstances() {
return Collections.unmodifiableCollection(myInstances.values());
}
@Nullable
public T findInstanceById(@NotNull final String instanceId) {
return myInstances.get(instanceId);
}
public void removeInstance(@NotNull final String instanceId){
myInstances.remove(instanceId);
}
public void addInstance(@NotNull final T instance){
myInstances.put(instance.getInstanceId(), instance);
}
public abstract boolean canStartNewInstance();
public abstract void terminateInstance(@NotNull final T instance);
public abstract void restartInstance(@NotNull final T instance);
public abstract T startNewInstance(@NotNull final CloudInstanceUserData tag);
public abstract G getImageDetails();
protected abstract T createInstanceFromReal(final AbstractInstance realInstance);
public void detectNewInstances(final Map<String,? extends AbstractInstance> realInstances){
for (String instanceName : realInstances.keySet()) {
if (myInstances.get(instanceName) == null) {
final AbstractInstance realInstance = realInstances.get(instanceName);
final T newInstance = createInstanceFromReal(realInstance);
newInstance.setStatus(realInstance.getInstanceStatus());
myInstances.put(instanceName, newInstance);
}
}
}
public String toString() {
return getClass().getSimpleName() +"{" +"myName='" + getId() + '\'' +'}';
}
}