package io.fathom.cloud.network;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.lifecycle.LifecycleListener;
import io.fathom.cloud.protobuf.NetworkingModel.NetworkData;
import io.fathom.cloud.protobuf.NetworkingModel.SubnetData;
import io.fathom.cloud.server.auth.Auth;
import io.fathom.cloud.server.auth.Auth.Domain;
import io.fathom.cloud.tasks.TaskScheduler;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;
import com.google.inject.persist.Transactional;
@Singleton
@Transactional
public class NetworkServiceImpl implements NetworkService, LifecycleListener {
@Inject
TaskScheduler scheduler;
@Inject
NetworkStore store;
@Override
public void start() throws Exception {
// scheduler.schedule(UpdateClusterTask.class);
}
@Override
public NetworkData updateNetwork(Auth auth, long id, NetworkData.Builder builder) throws CloudException {
if (id == 0) {
throw new IllegalArgumentException();
}
requireDomainAdmin(auth);
NetworkData network = store.getSharedNetworks().find(id);
if (network == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
NetworkData.Builder merged = NetworkData.newBuilder(network);
merged.mergeFrom(builder.buildPartial());
merged.setId(id);
merged.setProject(auth.getProject().getId());
NetworkData updated = store.getSharedNetworks().update(merged);
return updated;
}
@Override
public NetworkData createNetwork(Auth auth, NetworkData.Builder builder) throws CloudException {
requireDomainAdmin(auth);
builder.setProject(auth.getProject().getId());
NetworkData network = store.getSharedNetworks().create(builder);
return network;
}
@Override
public SubnetData createSubnet(Auth auth, SubnetData.Builder builder) throws CloudException {
requireDomainAdmin(auth);
long networkId = builder.getNetwork();
NetworkData network = findNetwork(auth, networkId);
if (network == null) {
throw new WebApplicationException(Status.NOT_FOUND);
}
builder.setProject(auth.getProject().getId());
SubnetData subnet = store.getSharedSubnets().create(builder);
return subnet;
}
private Domain requireDomainAdmin(Auth auth) {
Domain domain = auth.findDomainWithAdminRole();
if (domain == null) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
return domain;
}
@Override
public Status deleteNetwork(Auth auth, long id) {
throw new UnsupportedOperationException();
}
@Override
public List<NetworkData> listNetworks(Auth auth) throws CloudException {
List<NetworkData> networks = store.getSharedNetworks().list();
return networks;
}
@Override
public NetworkData findNetwork(Auth auth, long id) throws CloudException {
NetworkData network = store.getSharedNetworks().find(id);
return network;
}
@Override
public List<SubnetData> listSubnets(Auth auth) throws CloudException {
List<SubnetData> networks = store.getSharedSubnets().list();
return networks;
}
@Override
public SubnetData findSubnet(Auth auth, long id) throws CloudException {
SubnetData network = store.getSharedSubnets().find(id);
return network;
}
}