package org.zstack.network.securitygroup;
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.core.Completion;
import org.zstack.header.managementnode.PrepareDbInitialValueExtensionPoint;
import org.zstack.header.network.*;
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.l3.L3NetworkInventory;
import org.zstack.header.network.l3.L3NetworkVO;
import org.zstack.header.network.service.*;
import org.zstack.header.vm.VmInstanceSpec;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.List;
public class SecurityGroupProviderFactory implements NetworkServiceProviderFactory, L2NetworkCreateExtensionPoint, PrepareDbInitialValueExtensionPoint, ApplyNetworkServiceExtensionPoint {
private static CLogger logger = Utils.getLogger(SecurityGroupProviderFactory.class);
static NetworkServiceProviderType type = new NetworkServiceProviderType(SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE);
static NetworkServiceType networkServiceType = new NetworkServiceType(SecurityGroupConstant.SECURITY_GROUP_NETWORK_SERVICE_TYPE);
private List<String> supportedL2NetworkTypes;
private NetworkServiceProviderVO provider;
@Autowired
private DatabaseFacade dbf;
@Override
public NetworkServiceProviderType getType() {
return type;
}
@Override
public void createNetworkServiceProvider(APIAddNetworkServiceProviderMsg msg, NetworkServiceProviderVO vo) {
}
@Override
public NetworkServiceProvider getNetworkServiceProvider(NetworkServiceProviderVO vo) {
return new SecurityGroupProvider();
}
@Override
public void beforeCreateL2Network(APICreateL2NetworkMsg msg) throws NetworkException {
}
@Override
public void afterCreateL2Network(L2NetworkInventory l2Network) {
if (!supportedL2NetworkTypes.contains(l2Network.getType())) {
return;
}
SimpleQuery<NetworkServiceProviderVO> q = dbf.createQuery(NetworkServiceProviderVO.class);
q.add(NetworkServiceProviderVO_.type, Op.EQ, SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE);
NetworkServiceProviderVO vo = q.find();
NetworkServiceProviderL2NetworkRefVO ref = new NetworkServiceProviderL2NetworkRefVO();
ref.setNetworkServiceProviderUuid(vo.getUuid());
ref.setL2NetworkUuid(l2Network.getUuid());
dbf.persist(ref);
String info = String.format("successfully attach network service provider[uuid:%s, name:%s, type:%s] to l2network[uuid:%s, name:%s, type:%s]",
vo.getUuid(), vo.getName(), vo.getType(), l2Network.getUuid(), l2Network.getName(), l2Network.getType());
logger.debug(info);
}
public List<String> getSupportedL2NetworkTypes() {
return supportedL2NetworkTypes;
}
public void setSupportedL2NetworkTypes(List<String> supportedL2NetworkTypes) {
this.supportedL2NetworkTypes = supportedL2NetworkTypes;
}
@Override
public void prepareDbInitialValue() {
SimpleQuery<NetworkServiceProviderVO> query = dbf.createQuery(NetworkServiceProviderVO.class);
query.add(NetworkServiceProviderVO_.type, Op.EQ, SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE);
provider = query.find();
if (provider != null) {
return;
}
NetworkServiceProviderVO vo = new NetworkServiceProviderVO();
vo.setUuid(Platform.getUuid());
vo.setName(SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE);
vo.setDescription("zstack security group network service provider");
vo.getNetworkServiceTypes().add(networkServiceType.toString());
vo.setType(SecurityGroupConstant.SECURITY_GROUP_PROVIDER_TYPE);
provider = dbf.persistAndRefresh(vo);
}
public boolean isL3NetworkNeedSecurityGroupService(L3NetworkInventory l3) {
return !l3.getNetworkServiceTypesFromProvider(provider.getUuid()).isEmpty();
}
public boolean isL3NetworkNeedSecurityGroupService(String l3NetworkUuid) {
L3NetworkVO l3 = dbf.findByUuid(l3NetworkUuid, L3NetworkVO.class);
L3NetworkInventory l3inv = L3NetworkInventory.valueOf(l3);
return isL3NetworkNeedSecurityGroupService(l3inv);
}
@Override
public NetworkServiceProviderType getProviderType() {
return type;
}
@Override
public void applyNetworkService(VmInstanceSpec servedVm, Completion complete) {
complete.success();
}
@Override
public void releaseNetworkService(VmInstanceSpec servedVm, Completion complete) {
complete.success();
}
}