package org.zstack.network.service.flat;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.Platform;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.header.managementnode.PrepareDbInitialValueExtensionPoint;
import org.zstack.header.network.NetworkException;
import org.zstack.header.network.l2.APICreateL2NetworkMsg;
import org.zstack.header.network.l2.L2NetworkCreateExtensionPoint;
import org.zstack.header.network.l2.L2NetworkInventory;
import org.zstack.header.network.service.*;
import org.zstack.network.service.eip.EipConstant;
import org.zstack.network.service.userdata.UserdataConstant;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by frank on 9/15/2015.
*/
public class FlatProviderFactory implements NetworkServiceProviderFactory, PrepareDbInitialValueExtensionPoint,
L2NetworkCreateExtensionPoint {
private static final CLogger logger = Utils.getLogger(FlatProviderFactory.class);
@Autowired
private DatabaseFacade dbf;
private NetworkServiceProviderInventory flatProvider;
@Override
public NetworkServiceProviderType getType() {
return FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE;
}
@Override
public void createNetworkServiceProvider(APIAddNetworkServiceProviderMsg msg, NetworkServiceProviderVO vo) {
}
@Override
public NetworkServiceProvider getNetworkServiceProvider(NetworkServiceProviderVO vo) {
return new FlatProvider(vo);
}
@Override
public void prepareDbInitialValue() {
SimpleQuery<NetworkServiceProviderVO> query = dbf.createQuery(NetworkServiceProviderVO.class);
query.add(NetworkServiceProviderVO_.type, Op.EQ, FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING);
NetworkServiceProviderVO rpvo = query.find();
if (rpvo != null) {
flatProvider = NetworkServiceProviderInventory.valueOf(rpvo);
// check if any network service type missing, if any, complement them
SimpleQuery<NetworkServiceTypeVO> q = dbf.createQuery(NetworkServiceTypeVO.class);
q.add(NetworkServiceTypeVO_.networkServiceProviderUuid, Op.EQ, flatProvider.getUuid());
List<NetworkServiceTypeVO> refs = q.list();
Set<String> types = new HashSet<String>();
for (NetworkServiceTypeVO ref : refs) {
types.add(ref.getType());
}
if (!types.contains(NetworkServiceType.DHCP.toString())) {
NetworkServiceTypeVO ref = new NetworkServiceTypeVO();
ref.setNetworkServiceProviderUuid(flatProvider.getUuid());
ref.setType(NetworkServiceType.DHCP.toString());
dbf.persist(ref);
}
if (!types.contains(UserdataConstant.USERDATA_TYPE_STRING)) {
NetworkServiceTypeVO ref = new NetworkServiceTypeVO();
ref.setNetworkServiceProviderUuid(flatProvider.getUuid());
ref.setType(UserdataConstant.USERDATA_TYPE_STRING);
dbf.persist(ref);
}
if (!types.contains(EipConstant.EIP_NETWORK_SERVICE_TYPE)) {
NetworkServiceTypeVO ref = new NetworkServiceTypeVO();
ref.setNetworkServiceProviderUuid(flatProvider.getUuid());
ref.setType(EipConstant.EIP_NETWORK_SERVICE_TYPE);
dbf.persist(ref);
}
return;
}
rpvo = new NetworkServiceProviderVO();
rpvo.setUuid(Platform.getUuid());
rpvo.setName("Flat Network Service Provider");
rpvo.setDescription("Flat Network Service Provider");
rpvo.getNetworkServiceTypes().add(NetworkServiceType.DHCP.toString());
rpvo.getNetworkServiceTypes().add(UserdataConstant.USERDATA_TYPE_STRING);
rpvo.getNetworkServiceTypes().add(EipConstant.EIP_NETWORK_SERVICE_TYPE);
//rpvo.getNetworkServiceTypes().add(NetworkServiceType.DNS.toString());
rpvo.setType(FlatNetworkServiceConstant.FLAT_NETWORK_SERVICE_TYPE_STRING);
rpvo = dbf.persistAndRefresh(rpvo);
flatProvider = NetworkServiceProviderInventory.valueOf(rpvo);
}
@Override
public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException {
}
@Override
public void afterCreateL2Network(L2NetworkInventory l2Network) {
NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO();
ref.setL2NetworkUuid(l2Network.getUuid());
ref.setNetworkServiceProviderUuid(flatProvider.getUuid());
dbf.persist(ref);
logger.debug(String.format("successfully attach flat network service provider[uuid:%s] to the L2 network[uuid:%s, name:%s]",
flatProvider.getUuid(), l2Network.getUuid(), l2Network.getName()));
}
}