package io.fathom.cloud.compute.services;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.actions.StartInstancesAction.StartInstanceData;
import io.fathom.cloud.compute.networks.VirtualIp;
import io.fathom.cloud.compute.scheduler.AttachFloatingIpOperation;
import io.fathom.cloud.compute.scheduler.DetachFloatingIpOperation;
import io.fathom.cloud.compute.scheduler.SchedulerOperation;
import io.fathom.cloud.compute.scheduler.SchedulerQueue;
import io.fathom.cloud.compute.scheduler.StartInstanceOperation;
import io.fathom.cloud.compute.scheduler.StopInstanceOperation;
import io.fathom.cloud.compute.scheduler.UpdateFirewallOperation;
import io.fathom.cloud.protobuf.CloudModel.InstanceData;
import io.fathom.cloud.protobuf.CloudModel.SecurityGroupData;
import io.fathom.cloud.server.auth.Auth;
import io.fathom.cloud.server.model.Project;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import com.google.inject.Injector;
@Singleton
public class AsyncTasks {
@Inject
Injector injector;
@Inject
SchedulerQueue schedulerQueue;
public void attachFloatingIp(Project project, InstanceData instance, VirtualIp vip) {
AttachFloatingIpOperation op = injector.getInstance(AttachFloatingIpOperation.class);
op.init(project, instance, vip);
enqueue(op);
}
public void detachFloatingIp(Project project, InstanceData instance, VirtualIp vip) {
DetachFloatingIpOperation op = injector.getInstance(DetachFloatingIpOperation.class);
op.init(project, instance, vip);
enqueue(op);
}
public void updateInstanceSecurityGroups(Project project, InstanceData instance) throws CloudException {
UpdateFirewallOperation op = injector.getInstance(UpdateFirewallOperation.class);
op.init(project, instance);
enqueue(op);
}
public void updateSecurityGroupDefinition(Project project, SecurityGroupData securityGroup, long hostId) {
UpdateFirewallOperation op = injector.getInstance(UpdateFirewallOperation.class);
op.init(project, Collections.singletonList(securityGroup), hostId);
enqueue(op);
}
@Inject
Provider<StartInstanceOperation> startOperationProvider;
public void startInstances(Auth auth, Project project, List<StartInstanceData> starts) {
for (StartInstanceData start : starts) {
StartInstanceOperation op = startOperationProvider.get();
op.init(auth, project, start);
enqueue(op);
}
}
@Inject
Provider<StopInstanceOperation> stopOperationProvider;
public void stopInstances(List<InstanceData> instances) {
for (InstanceData instance : instances) {
StopInstanceOperation op = stopOperationProvider.get();
op.init(instance);
enqueue(op);
}
}
private void enqueue(SchedulerOperation operation) {
schedulerQueue.add(operation);
}
}