// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License.  Citrix Systems, Inc.
// reserves all rights not expressly granted by the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// 
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.alert;

import java.util.Map;

import javax.ejb.Local;
import javax.naming.ConfigurationException;

import org.apache.log4j.Logger;

import com.cloud.alert.AlertAdapter;
import com.cloud.alert.AlertManager;
import com.cloud.consoleproxy.ConsoleProxyManager;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.storage.secondary.SecStorageVmAlertEventArgs;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.utils.component.Inject;
import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.vm.SecondaryStorageVmVO;
import com.cloud.vm.dao.SecondaryStorageVmDao;

@Local(value=AlertAdapter.class)
public class SecondaryStorageVmAlertAdapter implements AlertAdapter {
	
	private static final Logger s_logger = Logger.getLogger(SecondaryStorageVmAlertAdapter.class);
    private String _name;
    
	@Inject private AlertManager _alertMgr;
	@Inject private DataCenterDao _dcDao;
	@Inject private SecondaryStorageVmDao _ssvmDao;
    
    public void onSSVMAlert(Object sender, SecStorageVmAlertEventArgs args) {
    	if(s_logger.isDebugEnabled())
    		s_logger.debug("received secondary storage vm alert");
    	
    	DataCenterVO dc = _dcDao.findById(args.getZoneId());
    	 SecondaryStorageVmVO secStorageVm = args.getSecStorageVm();
    	if(secStorageVm == null)
    		secStorageVm = _ssvmDao.findById(args.getSecStorageVmId());
    	
    	switch(args.getType()) {
    	case SecStorageVmAlertEventArgs.SSVM_CREATED :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("New secondary storage vm created, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			secStorageVm.getPrivateIpAddress());
			break;
    		
    	case SecStorageVmAlertEventArgs.SSVM_UP :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm is up, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			secStorageVm.getPrivateIpAddress());
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm up in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() 
				 	+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
			 	"Secondary Storage Vm up (zone " + dc.getName() + ")" 	
			);
			break;
    		
    	case SecStorageVmAlertEventArgs.SSVM_DOWN :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm is down, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			(secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm down in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() 
				 	+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
			 	"Secondary Storage Vm down (zone " + dc.getName() + ")" 	
			);
			break;
    		
    	case SecStorageVmAlertEventArgs.SSVM_REBOOTED :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm is rebooted, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			(secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm rebooted in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() 
				 	+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
			 	"Secondary Storage Vm rebooted (zone " + dc.getName() + ")" 	
			);
			break;
			
    	case SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm creation failure, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			(secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm creation failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() 
				 	+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()) 
				 	+ ", error details: " + args.getMessage(),
			 	"Secondary Storage Vm creation failure (zone " + dc.getName() + ")"
			);
    		break;
    		
    	case SecStorageVmAlertEventArgs.SSVM_START_FAILURE :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm startup failure, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			(secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm startup failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() 
				 	+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()) 
				 	+ ", error details: " + args.getMessage(),
			 	"Secondary Storage Vm startup failure (zone " + dc.getName() + ")" 	
			);
    		break;
    	
    	case SecStorageVmAlertEventArgs.SSVM_FIREWALL_ALERT :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm firewall alert, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			(secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_SSVM,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Failed to open secondary storage vm firewall port. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() 
					+ ", public IP: " + secStorageVm.getPublicIpAddress() 
					+ ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
				"Secondary Storage Vm alert (zone " + dc.getName() + ")"	
			);
    		break;
    	
    	case SecStorageVmAlertEventArgs.SSVM_STORAGE_ALERT :
        	if(s_logger.isDebugEnabled())
        		s_logger.debug("Secondary Storage Vm storage alert, zone: " + dc.getName() + ", secStorageVm: " + 
        			secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " + 
        			secStorageVm.getPrivateIpAddress() + ", message: " + args.getMessage());
    		
			_alertMgr.sendAlert(
				AlertManager.ALERT_TYPE_STORAGE_MISC,
				args.getZoneId(),
				secStorageVm.getPodIdToDeployIn(),
				"Secondary Storage Vm storage issue. zone: " + dc.getName() + ", message: " + args.getMessage(),
				"Secondary Storage Vm alert (zone " + dc.getName() + ")"
			);
    		break;
    	}
    }
    
	@Override
	public boolean configure(String name, Map<String, Object> params)
		throws ConfigurationException {
		
		if (s_logger.isInfoEnabled())
			s_logger.info("Start configuring secondary storage vm alert manager : " + name);
		
		try {
			SubscriptionMgr.getInstance().subscribe(SecondaryStorageVmManager.ALERT_SUBJECT, this, "onSSVMAlert");
		} catch (SecurityException e) {
			throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
		} catch (NoSuchMethodException e) {
			throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
		}
		
		return true;
	}

	@Override
	public String getName() {
		return _name;
	}

	@Override
	public boolean start() {
		return true;
	}

	@Override
	public boolean stop() {
		return true;
	}
}
