package org.zstack.network.securitygroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.header.core.Completion;
import org.zstack.header.core.NoErrorCompletion;
import org.zstack.header.message.MessageReply;
import org.zstack.header.network.l3.L3NetworkInventory;
import org.zstack.header.network.service.NetworkServiceProviderType;
import org.zstack.header.network.service.NetworkServiceType;
import org.zstack.header.vm.VmInstanceSpec;
import org.zstack.network.service.AbstractNetworkServiceExtension;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.List;
import java.util.Map;
/**
*/
public class SecurityGroupNetworkServiceExtension extends AbstractNetworkServiceExtension {
private static final CLogger logger = Utils.getLogger(SecurityGroupNetworkServiceExtension.class);
@Autowired
private CloudBus bus;
@Override
public NetworkServiceExtensionPosition getNetworkServiceExtensionPosition() {
return NetworkServiceExtensionPosition.AFTER_VM_CREATED;
}
@Override
public NetworkServiceType getNetworkServiceType() {
return SecurityGroupProviderFactory.networkServiceType;
}
@Override
public void applyNetworkService(VmInstanceSpec servedVm, Map<String, Object> data, final Completion completion) {
Map<NetworkServiceProviderType, List<L3NetworkInventory>> map = getNetworkServiceProviderMap(SecurityGroupProviderFactory.networkServiceType, servedVm.getL3Networks());
if (map.isEmpty()) {
completion.success();
return;
}
RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg();
msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid());
msg.setHostUuid(servedVm.getDestHost().getUuid());
bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (reply.isSuccess()) {
completion.success();
} else {
completion.fail(reply.getError());
}
}
});
}
@Override
public void releaseNetworkService(final VmInstanceSpec servedVm, Map<String, Object> data, final NoErrorCompletion completion) {
RefreshSecurityGroupRulesOnVmMsg msg = new RefreshSecurityGroupRulesOnVmMsg();
msg.setVmInstanceUuid(servedVm.getVmInventory().getUuid());
msg.setHostUuid(servedVm.getDestHost().getUuid());
msg.setDeleteAllRules(true);
bus.makeLocalServiceId(msg, SecurityGroupConstant.SERVICE_ID);
bus.send(msg, new CloudBusCallBack(completion) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
logger.debug(String.format("failed to remove security group rules for vm[uuid:%s], %s", servedVm.getVmInventory().getUuid(), reply.getError()));
}
completion.done();
}
});
}
}