You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2013/01/31 20:40:11 UTC

[49/50] [abbrv] Merge latest master into javelin

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
index 0000000,1f3defb..3e21750
mode 000000,100755..100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
@@@ -1,0 -1,300 +1,300 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ // Apache License, Version 2.0 (the "License"); you may not use this
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // 
+ // Automatically generated by addcopyright.py at 04/03/2012
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.net.URI;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.ejb.Local;
++import javax.inject.Inject;
+ 
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.baremetal.IpmISetBootDevCommand;
+ import com.cloud.agent.api.baremetal.IpmISetBootDevCommand.BootDev;
+ import com.cloud.agent.api.baremetal.PreparePxeServerAnswer;
+ import com.cloud.agent.api.baremetal.PreparePxeServerCommand;
+ import com.cloud.agent.api.baremetal.prepareCreateTemplateCommand;
+ import com.cloud.baremetal.database.BaremetalPxeDao;
+ import com.cloud.baremetal.database.BaremetalPxeVO;
+ import com.cloud.baremetal.networkservice.BaremetalPxeManager.BaremetalPxeType;
+ import com.cloud.dc.DataCenterVO;
+ import com.cloud.dc.HostPodVO;
+ import com.cloud.deploy.DeployDestination;
+ import com.cloud.host.Host;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDetailsDao;
+ import com.cloud.network.PhysicalNetworkServiceProvider;
 -import com.cloud.network.PhysicalNetworkVO;
+ import com.cloud.network.dao.PhysicalNetworkDao;
+ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
++import com.cloud.network.dao.PhysicalNetworkVO;
+ import com.cloud.resource.ResourceManager;
+ import com.cloud.resource.ServerResource;
+ import com.cloud.uservm.UserVm;
 -import com.cloud.utils.component.Inject;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.SearchCriteria.Op;
+ import com.cloud.utils.db.SearchCriteria2;
+ import com.cloud.utils.db.SearchCriteriaService;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.NicProfile;
+ import com.cloud.vm.NicVO;
+ import com.cloud.vm.ReservationContext;
+ import com.cloud.vm.UserVmVO;
+ import com.cloud.vm.VirtualMachineProfile;
+ 
+ @Local(value=BaremetalPxeService.class)
+ public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements BaremetalPxeService {
+ 	private static final Logger s_logger = Logger.getLogger(BareMetalPingServiceImpl.class);
+ 	@Inject ResourceManager _resourceMgr;
+ 	@Inject PhysicalNetworkDao _physicalNetworkDao;
+ 	@Inject PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+ 	@Inject HostDetailsDao _hostDetailsDao;
+ 	@Inject BaremetalPxeDao _pxeDao;
+ 	
+ 	
+ 	@Override
+ 	public boolean prepare(VirtualMachineProfile<UserVmVO> profile, NicProfile pxeNic, DeployDestination dest, ReservationContext context) {
+ 	    SearchCriteriaService<BaremetalPxeVO, BaremetalPxeVO> sc = SearchCriteria2.create(BaremetalPxeVO.class);
+         sc.addAnd(sc.getEntity().getDeviceType(), Op.EQ, BaremetalPxeType.PING.toString());
+         sc.addAnd(sc.getEntity().getPodId(), Op.EQ, dest.getPod().getId());
+         BaremetalPxeVO pxeVo = sc.find();
+         if (pxeVo == null) {
+             throw new CloudRuntimeException("No PING PXE server found in pod: " + dest.getPod().getId() + ", you need to add it before starting VM");
+         }
+         long pxeServerId = pxeVo.getHostId();
+         
+ 	    String mac = pxeNic.getMacAddress();
+ 	    String ip = pxeNic.getIp4Address();
+ 	    String gateway = pxeNic.getGateway();
+ 	    String mask = pxeNic.getNetmask();
+ 	    String dns = pxeNic.getDns1();
+ 	    if (dns == null) {
+ 	    	dns = pxeNic.getDns2();
+ 	    }
+ 
+ 		try {
+ 			String tpl = profile.getTemplate().getUrl();
+ 			assert tpl != null : "How can a null template get here!!!";
+ 			PreparePxeServerCommand cmd = new PreparePxeServerCommand(ip, mac, mask, gateway, dns, tpl,
+ 					profile.getVirtualMachine().getInstanceName(), dest.getHost().getName());
+ 			PreparePxeServerAnswer ans = (PreparePxeServerAnswer) _agentMgr.send(pxeServerId, cmd);
+ 			if (!ans.getResult()) {
+ 				s_logger.warn("Unable tot program PXE server: " + pxeVo.getId() + " because " + ans.getDetails());
+ 				return false;
+ 			}
+ 			
+ 			IpmISetBootDevCommand bootCmd = new IpmISetBootDevCommand(BootDev.pxe);
+ 			Answer anw = _agentMgr.send(dest.getHost().getId(), bootCmd);
+ 			if (!anw.getResult()) {
+ 				s_logger.warn("Unable to set host: " + dest.getHost().getId() + " to PXE boot because " + anw.getDetails());
+ 			}
+ 			
+ 			return anw.getResult();
+ 		} catch (Exception e) {
+ 			s_logger.warn("Cannot prepare PXE server", e);
+ 			return false;
+ 		}
+ 	}
+ 
+ 	
+     @Override
+     public boolean prepareCreateTemplate(Long pxeServerId, UserVm vm, String templateUrl) {        
+         List<NicVO> nics = _nicDao.listByVmId(vm.getId());
+         if (nics.size() != 1) {
+             throw new CloudRuntimeException("Wrong nic number " + nics.size() + " of vm " + vm.getId());
+         }
+         
+         /* use last host id when VM stopped */
+         Long hostId = (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId());
+         HostVO host = _hostDao.findById(hostId);
+         DataCenterVO dc = _dcDao.findById(host.getDataCenterId());
+         NicVO nic = nics.get(0);
+         String mask = nic.getNetmask();
+         String mac = nic.getMacAddress();
+         String ip = nic.getIp4Address();
+         String gateway = nic.getGateway();
+         String dns = dc.getDns1();
+         if (dns == null) {
+             dns = dc.getDns2();
+         }
+         
+         try {
+             prepareCreateTemplateCommand cmd = new prepareCreateTemplateCommand(ip, mac, mask, gateway, dns, templateUrl);
+             Answer ans = _agentMgr.send(pxeServerId, cmd);
+             return ans.getResult();
+         } catch (Exception e) {
+             s_logger.debug("Prepare for creating baremetal template failed", e);
+             return false;
+         }
+     }
+ 
+ 
+     @Override
+     @DB
+     public BaremetalPxeVO addPxeServer(AddBaremetalPxeCmd cmd) {
+         AddBaremetalPxePingServerCmd pcmd = (AddBaremetalPxePingServerCmd)cmd;
+         
+         PhysicalNetworkVO pNetwork = null;
+         long zoneId;
+         
+         if (cmd.getPhysicalNetworkId() == null || cmd.getUrl() == null || cmd.getUsername() == null || cmd.getPassword() == null) {
+             throw new IllegalArgumentException("At least one of the required parameters(physical network id, url, username, password) is null");
+         } 
+         
+         pNetwork = _physicalNetworkDao.findById(cmd.getPhysicalNetworkId());
+         if (pNetwork == null) {
+             throw new IllegalArgumentException("Could not find phyical network with ID: " + cmd.getPhysicalNetworkId());
+         }
+         zoneId = pNetwork.getDataCenterId();
+         
+         PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), BaremetalPxeManager.BAREMETAL_PXE_SERVICE_PROVIDER.getName());
+         if (ntwkSvcProvider == null) {
+             throw new CloudRuntimeException("Network Service Provider: " + BaremetalPxeManager.BAREMETAL_PXE_SERVICE_PROVIDER.getName() +
+                     " is not enabled in the physical network: " + cmd.getPhysicalNetworkId() + "to add this device");
+         } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
+             throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() +
+                     " is in shutdown state in the physical network: " + cmd.getPhysicalNetworkId() + "to add this device");
+         }
+         
+         HostPodVO pod = _podDao.findById(cmd.getPodId());
+         if (pod == null) {
+             throw new IllegalArgumentException("Could not find pod with ID: " + cmd.getPodId());
+         } 
+         
+         List<HostVO> pxes = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.BaremetalPxe, null, cmd.getPodId(), zoneId);
+         if (pxes.size() != 0) {
+             throw new IllegalArgumentException("Already had a PXE server in Pod: " + cmd.getPodId() + " zone: " + zoneId);
+         }
+         
+         String storageServerIp = pcmd.getPingStorageServerIp();
+         if (storageServerIp == null) {
+             throw new IllegalArgumentException("No IP for storage server specified");
+         }
+         String pingDir = pcmd.getPingDir();
+         if (pingDir == null) {
+             throw new IllegalArgumentException("No direcotry for storage server specified");
+         }
+         String tftpDir = pcmd.getTftpDir();
+         if (tftpDir == null) {
+             throw new IllegalArgumentException("No TFTP directory specified");
+         }
+         
+         String cifsUsername = pcmd.getPingStorageServerUserName();
+         if (cifsUsername == null || cifsUsername.equalsIgnoreCase("")) {
+             cifsUsername = "xxx";
+         }
+         String cifsPassword = pcmd.getPingStorageServerPassword();
+         if (cifsPassword == null || cifsPassword.equalsIgnoreCase("")) {
+             cifsPassword = "xxx";
+         }
+         
+         
+         URI uri;
+         try {
+             uri = new URI(cmd.getUrl());
+         } catch (Exception e) {
+             s_logger.debug(e);
+             throw new IllegalArgumentException(e.getMessage());
+         }
+         String ipAddress = uri.getHost();
+         
+         String guid = getPxeServerGuid(Long.toString(zoneId)  + "-" + pod.getId(), BaremetalPxeType.PING.toString(), ipAddress);
+         
+         ServerResource resource = null;
+         Map params = new HashMap<String, String>();
+         params.put(BaremetalPxeService.PXE_PARAM_ZONE, Long.toString(zoneId));
+         params.put(BaremetalPxeService.PXE_PARAM_POD, String.valueOf(pod.getId()));
+         params.put(BaremetalPxeService.PXE_PARAM_IP, ipAddress);
+         params.put(BaremetalPxeService.PXE_PARAM_USERNAME, cmd.getUsername());
+         params.put(BaremetalPxeService.PXE_PARAM_PASSWORD, cmd.getPassword());
+         params.put(BaremetalPxeService.PXE_PARAM_PING_STORAGE_SERVER_IP, storageServerIp);
+         params.put(BaremetalPxeService.PXE_PARAM_PING_ROOT_DIR, pingDir);
+         params.put(BaremetalPxeService.PXE_PARAM_TFTP_DIR, tftpDir);
+         params.put(BaremetalPxeService.PXE_PARAM_PING_STORAGE_SERVER_USERNAME, cifsUsername);
+         params.put(BaremetalPxeService.PXE_PARAM_PING_STORAGE_SERVER_PASSWORD, cifsPassword);
+         params.put(BaremetalPxeService.PXE_PARAM_GUID, guid);
+         
+         resource = new BaremetalPingPxeResource();
+         try {
+             resource.configure("PING PXE resource", params);
+         } catch (Exception e) {
+             s_logger.debug(e);
+             throw new CloudRuntimeException(e.getMessage());
+         }
+         
+         Host pxeServer = _resourceMgr.addHost(zoneId, resource, Host.Type.BaremetalPxe, params);
+         if (pxeServer == null) {
+             throw new CloudRuntimeException("Cannot add PXE server as a host");
+         }
+         
+         BaremetalPxeVO vo = new BaremetalPxeVO();
+         Transaction txn = Transaction.currentTxn();
+         vo.setHostId(pxeServer.getId());
+         vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
+         vo.setPodId(pod.getId());
+         vo.setPhysicalNetworkId(pcmd.getPhysicalNetworkId());
+         vo.setDeviceType(BaremetalPxeType.PING.toString());
+         txn.start();
+         _pxeDao.persist(vo);
+         txn.commit();
+         return vo;
+     }
+ 
+     @Override
+     public BaremetalPxeResponse getApiResponse(BaremetalPxeVO vo) {
+         BaremetalPxePingResponse response = new BaremetalPxePingResponse();
+         response.setId(String.valueOf(vo.getId()));
+         response.setPhysicalNetworkId(String.valueOf(vo.getPhysicalNetworkId()));
+         response.setPodId(String.valueOf(vo.getPodId()));
+         Map<String, String> details = _hostDetailsDao.findDetails(vo.getHostId());
+         response.setPingStorageServerIp(details.get(BaremetalPxeService.PXE_PARAM_PING_STORAGE_SERVER_IP));
+         response.setPingDir(details.get(BaremetalPxeService.PXE_PARAM_PING_ROOT_DIR));
+         response.setTftpDir(details.get(BaremetalPxeService.PXE_PARAM_TFTP_DIR));
+         return response;
+     }
+ 
+ 
+     @Override
+     public List<BaremetalPxeResponse> listPxeServers(ListBaremetalPxePingServersCmd cmd) {
+         SearchCriteriaService<BaremetalPxeVO, BaremetalPxeVO> sc = SearchCriteria2.create(BaremetalPxeVO.class);
+         sc.addAnd(sc.getEntity().getDeviceType(), Op.EQ, BaremetalPxeType.PING.toString());
+         if (cmd.getPodId() != null) {
+             sc.addAnd(sc.getEntity().getPodId(), Op.EQ, cmd.getPodId());
+             if (cmd.getId() != null) {
+                 sc.addAnd(sc.getEntity().getId(), Op.EQ, cmd.getId());
+             }
+         }
+         List<BaremetalPxeVO> vos = sc.list();
+         List<BaremetalPxeResponse> responses = new ArrayList<BaremetalPxeResponse>(vos.size());
+         for (BaremetalPxeVO vo : vos) {
+             responses.add(getApiResponse(vo));
+         }
+         return responses;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPxeServiceBase.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPxeServiceBase.java
index 0000000,85a9b3c..cd1ada9
mode 000000,100644..100644
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPxeServiceBase.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPxeServiceBase.java
@@@ -1,0 -1,68 +1,47 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ // Apache License, Version 2.0 (the "License"); you may not use this
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // 
+ // Automatically generated by addcopyright.py at 04/03/2012
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.util.Map;
+ 
++import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+ 
+ import com.cloud.agent.AgentManager;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.HostPodDao;
+ import com.cloud.host.dao.HostDao;
 -import com.cloud.utils.component.Inject;
++import com.cloud.utils.component.ManagerBase;
+ import com.cloud.vm.dao.NicDao;
+ 
 -public abstract class BareMetalPxeServiceBase implements BaremetalPxeService {
 -	protected String _name;
++public abstract class BareMetalPxeServiceBase extends ManagerBase implements BaremetalPxeService {
+ 	@Inject DataCenterDao _dcDao;
+ 	@Inject HostDao _hostDao;
+ 	@Inject AgentManager _agentMgr;
+ 	@Inject HostPodDao _podDao;
+ 	@Inject NicDao _nicDao;
+ 	
 -	@Override
 -	public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
 -		_name = name;
 -		return true;
 -	}
 -
 -	@Override
 -	public String getName() {
 -		return _name;
 -	}
 -
 -	@Override
 -	public boolean start() {
 -		return true;
 -	}
 -
 -	@Override
 -	public boolean stop() {
 -		return true;
 -	}
 -
+ 	protected String getPxeServerGuid(String zoneId, String name, String ip) {
+ 		return zoneId + "-" + name + "-" + ip;
+ 	}
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalResourceBase.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalResourceBase.java
index 0000000,d615d1d..4c99f6b
mode 000000,100755..100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalResourceBase.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalResourceBase.java
@@@ -1,0 -1,618 +1,618 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ // Apache License, Version 2.0 (the "License"); you may not use this
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // 
+ // Automatically generated by addcopyright.py at 04/03/2012
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.ejb.Local;
+ import javax.naming.ConfigurationException;
+ 
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.agent.IAgentControl;
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.CheckNetworkAnswer;
+ import com.cloud.agent.api.CheckNetworkCommand;
+ import com.cloud.agent.api.CheckVirtualMachineAnswer;
+ import com.cloud.agent.api.CheckVirtualMachineCommand;
+ import com.cloud.agent.api.Command;
+ import com.cloud.agent.api.MaintainAnswer;
+ import com.cloud.agent.api.MaintainCommand;
+ import com.cloud.agent.api.MigrateAnswer;
+ import com.cloud.agent.api.MigrateCommand;
+ import com.cloud.agent.api.PingCommand;
+ import com.cloud.agent.api.PingRoutingCommand;
+ import com.cloud.agent.api.PrepareForMigrationAnswer;
+ import com.cloud.agent.api.PrepareForMigrationCommand;
+ import com.cloud.agent.api.ReadyAnswer;
+ import com.cloud.agent.api.ReadyCommand;
+ import com.cloud.agent.api.RebootAnswer;
+ import com.cloud.agent.api.RebootCommand;
+ import com.cloud.agent.api.SecurityGroupRulesCmd;
+ import com.cloud.agent.api.StartAnswer;
+ import com.cloud.agent.api.StartCommand;
+ import com.cloud.agent.api.StartupCommand;
+ import com.cloud.agent.api.StartupRoutingCommand;
+ import com.cloud.agent.api.StopAnswer;
+ import com.cloud.agent.api.StopCommand;
+ import com.cloud.agent.api.baremetal.IpmISetBootDevCommand;
+ import com.cloud.agent.api.baremetal.IpmISetBootDevCommand.BootDev;
+ import com.cloud.agent.api.baremetal.IpmiBootorResetCommand;
+ import com.cloud.agent.api.to.VirtualMachineTO;
+ import com.cloud.baremetal.manager.BaremetalManager;
+ import com.cloud.host.Host.Type;
+ import com.cloud.hypervisor.Hypervisor;
+ import com.cloud.resource.ServerResource;
+ import com.cloud.server.ManagementServer;
 -import com.cloud.utils.component.ComponentLocator;
++import com.cloud.utils.component.ComponentContext;
++import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.utils.script.OutputInterpreter;
+ import com.cloud.utils.script.Script;
+ import com.cloud.utils.script.Script2;
+ import com.cloud.utils.script.Script2.ParamType;
+ import com.cloud.vm.VMInstanceVO;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachine.State;
+ import com.cloud.vm.dao.VMInstanceDao;
+ 
+ import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
+ 
+ @Local(value = ServerResource.class)
 -public class BareMetalResourceBase implements ServerResource {
++public class BareMetalResourceBase extends ManagerBase implements ServerResource {
+ 	private static final Logger s_logger = Logger.getLogger(BareMetalResourceBase.class);
+ 	protected HashMap<String, State> _vms = new HashMap<String, State>(2);
+ 	protected String _name;
+ 	protected String _uuid;
+ 	protected String _zone;
+ 	protected String _pod;
+ 	protected Long hostId;
+ 	protected String _cluster;
+ 	protected long _memCapacity;
+ 	protected long _cpuCapacity;
+ 	protected long _cpuNum;
+ 	protected String _mac;
+ 	protected String _username;
+ 	protected String _password;
+ 	protected String _ip;
+ 	protected boolean _isEchoScAgent;
+ 	protected IAgentControl _agentControl;
+ 	protected Script2 _pingCommand;
+ 	protected Script2 _setPxeBootCommand;
+ 	protected Script2 _setDiskBootCommand;
+ 	protected Script2 _rebootCommand;
+ 	protected Script2 _getStatusCommand;
+ 	protected Script2 _powerOnCommand;
+ 	protected Script2 _powerOffCommand;
+ 	protected Script2 _forcePowerOffCommand;
+ 	protected Script2 _bootOrRebootCommand;
+ 	protected String _vmName;
+ 	protected VMInstanceDao vmDao;
+ 
+ 	private void changeVmState(String vmName, VirtualMachine.State state) {
+ 		synchronized (_vms) {
+ 			_vms.put(vmName, state);
+ 		}
+ 	}
+ 
+ 	private State removeVmState(String vmName) {
+ 		synchronized (_vms) {
+ 			return _vms.remove(vmName);
+ 		}
+ 	}
+ 
+ 	@Override
+ 	public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+ 		_name = name;
+ 		_uuid = (String) params.get("guid");
+ 		try {
+ 			_memCapacity = Long.parseLong((String) params.get(ApiConstants.MEMORY)) * 1024L * 1024L;
+ 			_cpuCapacity = Long.parseLong((String) params.get(ApiConstants.CPU_SPEED));
+ 			_cpuNum = Long.parseLong((String) params.get(ApiConstants.CPU_NUMBER));
+ 		} catch (NumberFormatException e) {
+ 			throw new ConfigurationException(String.format("Unable to parse number of CPU or memory capacity "
+ 			        + "or cpu capacity(cpu number = %1$s memCapacity=%2$s, cpuCapacity=%3$s", (String) params.get(ApiConstants.CPU_NUMBER),
+ 			        (String) params.get(ApiConstants.MEMORY), (String) params.get(ApiConstants.CPU_SPEED)));
+ 		}
+ 
+ 		_zone = (String) params.get("zone");
+ 		_pod = (String) params.get("pod");
+ 		_cluster = (String) params.get("cluster");
+ 		hostId = (Long) params.get("hostId");
+ 		_ip = (String) params.get(ApiConstants.PRIVATE_IP);
+ 		_mac = (String) params.get(ApiConstants.HOST_MAC);
+ 		_username = (String) params.get(ApiConstants.USERNAME);
+ 		_password = (String) params.get(ApiConstants.PASSWORD);
+ 		_vmName = (String) params.get("vmName");
+ 		String echoScAgent = (String) params.get(BaremetalManager.EchoSecurityGroupAgent);
+ 
+ 		if (_pod == null) {
+ 			throw new ConfigurationException("Unable to get the pod");
+ 		}
+ 
+ 		if (_cluster == null) {
+ 			throw new ConfigurationException("Unable to get the pod");
+ 		}
+ 		
+ 		if (_ip == null) {
+ 			throw new ConfigurationException("Unable to get the host address");
+ 		}
+ 
+ 		if (_mac.equalsIgnoreCase("unknown")) {
+ 			throw new ConfigurationException("Unable to get the host mac address");
+ 		}
+ 
+ 		if (_mac.split(":").length != 6) {
+ 			throw new ConfigurationException("Wrong MAC format(" + _mac
+ 			        + "). It must be in format of for example 00:11:ba:33:aa:dd which is not case sensitive");
+ 		}
+ 
+ 		if (_uuid == null) {
+ 			throw new ConfigurationException("Unable to get the uuid");
+ 		}
+ 		
+ 		if (echoScAgent != null) {
+ 		    _isEchoScAgent = Boolean.valueOf(echoScAgent);
+ 		}
+ 
+ 		String injectScript = "scripts/util/ipmi.py";
+ 		String scriptPath = Script.findScript("", injectScript);
+ 		if (scriptPath == null) {
+ 			throw new ConfigurationException("Cannot find ping script " + scriptPath);
+ 		}
+ 		_pingCommand = new Script2(scriptPath, s_logger);
+ 		_pingCommand.add("ping");
+ 		_pingCommand.add("hostname=" + _ip);
+ 		_pingCommand.add("usrname=" + _username);
+ 		_pingCommand.add("password=" + _password, ParamType.PASSWORD);
+ 
+ 		_setPxeBootCommand = new Script2(scriptPath, s_logger);
+ 		_setPxeBootCommand.add("boot_dev");
+ 		_setPxeBootCommand.add("hostname=" + _ip);
+ 		_setPxeBootCommand.add("usrname=" + _username);
+ 		_setPxeBootCommand.add("password=" + _password, ParamType.PASSWORD);
+ 		_setPxeBootCommand.add("dev=pxe");
+ 
+ 		_setDiskBootCommand = new Script2(scriptPath, s_logger);
+ 		_setDiskBootCommand.add("boot_dev");
+ 		_setDiskBootCommand.add("hostname=" + _ip);
+ 		_setDiskBootCommand.add("usrname=" + _username);
+ 		_setDiskBootCommand.add("password=" + _password, ParamType.PASSWORD);
+ 		_setDiskBootCommand.add("dev=disk");
+ 
+ 		_rebootCommand = new Script2(scriptPath, s_logger);
+ 		_rebootCommand.add("reboot");
+ 		_rebootCommand.add("hostname=" + _ip);
+ 		_rebootCommand.add("usrname=" + _username);
+ 		_rebootCommand.add("password=" + _password, ParamType.PASSWORD);
+ 
+ 		_getStatusCommand = new Script2(scriptPath, s_logger);
+ 		_getStatusCommand.add("ping");
+ 		_getStatusCommand.add("hostname=" + _ip);
+ 		_getStatusCommand.add("usrname=" + _username);
+ 		_getStatusCommand.add("password=" + _password, ParamType.PASSWORD);
+ 
+ 		_powerOnCommand = new Script2(scriptPath, s_logger);
+ 		_powerOnCommand.add("power");
+ 		_powerOnCommand.add("hostname=" + _ip);
+ 		_powerOnCommand.add("usrname=" + _username);
+ 		_powerOnCommand.add("password=" + _password, ParamType.PASSWORD);
+ 		_powerOnCommand.add("action=on");
+ 
+ 		_powerOffCommand = new Script2(scriptPath, s_logger);
+ 		_powerOffCommand.add("power");
+ 		_powerOffCommand.add("hostname=" + _ip);
+ 		_powerOffCommand.add("usrname=" + _username);
+ 		_powerOffCommand.add("password=" + _password, ParamType.PASSWORD);
+ 		_powerOffCommand.add("action=soft");
+ 
+ 		_forcePowerOffCommand = new Script2(scriptPath, s_logger);
+ 		_forcePowerOffCommand.add("power");
+ 		_forcePowerOffCommand.add("hostname=" + _ip);
+ 		_forcePowerOffCommand.add("usrname=" + _username);
+ 		_forcePowerOffCommand.add("password=" + _password, ParamType.PASSWORD);
+ 		_forcePowerOffCommand.add("action=off");
+ 
+ 		_bootOrRebootCommand = new Script2(scriptPath, s_logger);
+ 		_bootOrRebootCommand.add("boot_or_reboot");
+ 		_bootOrRebootCommand.add("hostname=" + _ip);
+ 		_bootOrRebootCommand.add("usrname=" + _username);
+ 		_bootOrRebootCommand.add("password=" + _password, ParamType.PASSWORD);
+ 
+ 		return true;
+ 	}
+ 
+ 	protected boolean doScript(Script cmd) {
+ 		return doScript(cmd, null);
+ 	}
+ 
+ 	protected boolean doScript(Script cmd, OutputInterpreter interpreter) {
+ 		int retry = 5;
+ 		String res = null;
+ 		while (retry-- > 0) {
+ 			if (interpreter == null) {
+ 				res = cmd.execute();
+ 			} else {
+ 				res = cmd.execute(interpreter);
+ 			}
+ 			if (res != null && res.startsWith("Error: Unable to establish LAN")) {
+ 				s_logger.warn("IPMI script timeout(" + cmd.toString() + "), will retry " + retry + " times");
+ 				continue;
+ 			} else if (res == null) {
+ 				return true;
+ 			} else {
+ 				break;
+ 			}
+ 		}
+ 
+ 		s_logger.warn("IPMI Scirpt failed due to " + res + "(" + cmd.toString() + ")");
+ 		return false;
+ 	}
+ 
+ 	@Override
+ 	public boolean start() {
+ 		return true;
+ 	}
+ 
+ 	@Override
+ 	public boolean stop() {
+ 		return true;
+ 	}
+ 
+ 	@Override
+ 	public String getName() {
+ 		return _name;
+ 	}
+ 
+ 	@Override
+ 	public Type getType() {
+ 		return com.cloud.host.Host.Type.Routing;
+ 	}
+ 
+ 	protected State getVmState() {
+ 		OutputInterpreter.AllLinesParser interpreter = new OutputInterpreter.AllLinesParser();
+ 		if (!doScript(_getStatusCommand, interpreter)) {
+ 			s_logger.warn("Cannot get power status of " + _name + ", assume VM state was not changed");
+ 			return null;
+ 		}
+ 		if (isPowerOn(interpreter.getLines())) {
+ 			return State.Running;
+ 		} else {
+ 			return State.Stopped;
+ 		}
+ 	}
+ 
+     protected Map<String, State> fullSync() {
+         Map<String, State> states = new HashMap<String, State>();
+         if (hostId != null) {
 -            ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name);
 -            vmDao = locator.getDao(VMInstanceDao.class);
++            vmDao = ComponentContext.getComponent(VMInstanceDao.class);
+             final List<? extends VMInstanceVO> vms = vmDao.listByHostId(hostId);
+             for (VMInstanceVO vm : vms) {
+                 states.put(vm.getInstanceName(), vm.getState());
+             }
+         }
+         /*
+          * Map<String, State> changes = new HashMap<String, State>();
+          * 
+          * if (_vmName != null) { State state = getVmState(); if (state != null)
+          * { changes.put(_vmName, state); } }
+          */
+ 
+         return states;
+     }
+ 
+ 	@Override
+ 	public StartupCommand[] initialize() {
+ 		StartupRoutingCommand cmd = new StartupRoutingCommand(0, 0, 0, 0, null, Hypervisor.HypervisorType.BareMetal, new HashMap<String, String>(), null);
+ 		cmd.setDataCenter(_zone);
+ 		cmd.setPod(_pod);
+ 		cmd.setCluster(_cluster);
+ 		cmd.setGuid(_uuid);
+ 		cmd.setName(_ip);
+ 		cmd.setPrivateIpAddress(_ip);
+ 		cmd.setStorageIpAddress(_ip);
+ 		cmd.setVersion(BareMetalResourceBase.class.getPackage().getImplementationVersion());
+ 		cmd.setCpus((int) _cpuNum);
+ 		cmd.setSpeed(_cpuCapacity);
+ 		cmd.setMemory(_memCapacity);
+ 		cmd.setPrivateMacAddress(_mac);
+ 		cmd.setPublicMacAddress(_mac);
+ 		cmd.setStateChanges(fullSync());
+ 		return new StartupCommand[] { cmd };
+ 	}
+ 
+ 	private boolean ipmiPing() {
+ 		return doScript(_pingCommand);
+ 	}
+ 
+ 	@Override
+ 	public PingCommand getCurrentStatus(long id) {
+ 		try {
+ 			if (!ipmiPing()) {
+ 				Thread.sleep(1000);
+ 				if (!ipmiPing()) {
+ 					s_logger.warn("Cannot ping ipmi nic " + _ip);
+ 					return null;
+ 				}
+ 			}
+ 		} catch (Exception e) {
+ 			s_logger.debug("Cannot ping ipmi nic " + _ip, e);
+ 			return null;
+ 		}
+ 
+ 		return new PingRoutingCommand(getType(), id, deltaSync());
+ 	}
+ 
+ 	protected Answer execute(IpmISetBootDevCommand cmd) {
+ 		Script bootCmd = null;
+ 		if (cmd.getBootDev() == BootDev.disk) {
+ 			bootCmd = _setDiskBootCommand;
+ 		} else if (cmd.getBootDev() == BootDev.pxe) {
+ 			bootCmd = _setPxeBootCommand;
+ 		} else {
+ 			throw new CloudRuntimeException("Unkonwn boot dev " + cmd.getBootDev());
+ 		}
+ 
+ 		String bootDev = cmd.getBootDev().name();
+ 		if (!doScript(bootCmd)) {
+ 			s_logger.warn("Set " + _ip + " boot dev to " + bootDev + "failed");
+ 			return new Answer(cmd, false, "Set " + _ip + " boot dev to " + bootDev + "failed");
+ 		}
+ 
+ 		s_logger.warn("Set " + _ip + " boot dev to " + bootDev + "Success");
+ 		return new Answer(cmd, true, "Set " + _ip + " boot dev to " + bootDev + "Success");
+ 	}
+ 
+ 	protected MaintainAnswer execute(MaintainCommand cmd) {
+ 		return new MaintainAnswer(cmd, false);
+ 	}
+ 
+ 	protected PrepareForMigrationAnswer execute(PrepareForMigrationCommand cmd) {
+ 		return new PrepareForMigrationAnswer(cmd);
+ 	}
+ 
+ 	protected MigrateAnswer execute(MigrateCommand cmd) {
+ 		if (!doScript(_powerOffCommand)) {
+ 			return new MigrateAnswer(cmd, false, "IPMI power off failed", null);
+ 		}
+ 		return new MigrateAnswer(cmd, true, "success", null);
+ 	}
+ 
+ 	protected CheckVirtualMachineAnswer execute(final CheckVirtualMachineCommand cmd) {
+ 		return new CheckVirtualMachineAnswer(cmd, State.Stopped, null);
+ 	}
+ 
+ 	protected Answer execute(IpmiBootorResetCommand cmd) {
+ 		if (!doScript(_bootOrRebootCommand)) {
+ 			return new Answer(cmd, false, "IPMI boot or reboot failed");
+ 		}
+ 		return new Answer(cmd, true, "Success");
+ 
+ 	}
+ 
+ 	protected CheckNetworkAnswer execute(CheckNetworkCommand cmd) {
+ 		return new CheckNetworkAnswer(cmd, true, "Success");
+ 	}
+ 	
+ 	protected Answer execute(SecurityGroupRulesCmd cmd) {
+ 	    SecurityGroupHttpClient hc = new SecurityGroupHttpClient();
+ 	    return hc.call(cmd.getGuestIp(), cmd);
+ 	}
+ 
+     @Override
+     public Answer executeRequest(Command cmd) {
+         try {
+             if (cmd instanceof ReadyCommand) {
+                 return execute((ReadyCommand) cmd);
+             } else if (cmd instanceof StartCommand) {
+                 return execute((StartCommand) cmd);
+             } else if (cmd instanceof StopCommand) {
+                 return execute((StopCommand) cmd);
+             } else if (cmd instanceof RebootCommand) {
+                 return execute((RebootCommand) cmd);
+             } else if (cmd instanceof IpmISetBootDevCommand) {
+                 return execute((IpmISetBootDevCommand) cmd);
+             } else if (cmd instanceof MaintainCommand) {
+                 return execute((MaintainCommand) cmd);
+             } else if (cmd instanceof PrepareForMigrationCommand) {
+                 return execute((PrepareForMigrationCommand) cmd);
+             } else if (cmd instanceof MigrateCommand) {
+                 return execute((MigrateCommand) cmd);
+             } else if (cmd instanceof CheckVirtualMachineCommand) {
+                 return execute((CheckVirtualMachineCommand) cmd);
+             } else if (cmd instanceof IpmiBootorResetCommand) {
+                 return execute((IpmiBootorResetCommand) cmd);
+             } else if (cmd instanceof SecurityGroupRulesCmd) {
+                 return execute((SecurityGroupRulesCmd) cmd);
+             } else if (cmd instanceof CheckNetworkCommand) {
+                 return execute((CheckNetworkCommand) cmd);
+             } else {
+                 return Answer.createUnsupportedCommandAnswer(cmd);
+             }
+         } catch (Throwable t) {
+             s_logger.debug(t.getMessage(), t);
+             return new Answer(cmd, false, t.getMessage());
+         }
+     }
+ 
+ 	protected boolean isPowerOn(String str) {
+ 		if (str.startsWith("Chassis Power is on")) {
+ 			return true;
+ 		} else if (str.startsWith("Chassis Power is off")) {
+ 			return false;
+ 		} else {
+ 			throw new CloudRuntimeException("Cannot parse IPMI power status " + str);
+ 		}
+ 	}
+ 
+ 	protected RebootAnswer execute(final RebootCommand cmd) {
+ 		if (!doScript(_rebootCommand)) {
+ 			return new RebootAnswer(cmd, "IPMI reboot failed", false);
+ 		}
+ 
+ 		return new RebootAnswer(cmd, "reboot succeeded", true);
+ 	}
+ 
+ 	protected StopAnswer execute(final StopCommand cmd) {
+ 		boolean success = false;
+ 		int count = 0;
+ 		Script powerOff = _powerOffCommand;
+ 
+ 		while (count < 10) {
+ 			if (!doScript(powerOff)) {
+ 				break;
+ 			}
+ 
+ 			try {
+ 				Thread.sleep(1000);
+ 			} catch (InterruptedException e) {
+ 				break;
+ 			}
+ 
+ 			OutputInterpreter.AllLinesParser interpreter = new OutputInterpreter.AllLinesParser();
+ 			if (!doScript(_getStatusCommand, interpreter)) {
+ 				s_logger.warn("Cannot get power status of " + _name + ", assume VM state was not changed");
+ 				break;
+ 			}
+ 
+ 			if (!isPowerOn(interpreter.getLines())) {
+ 				success = true;
+ 				break;
+ 			} else {
+ 				powerOff = _forcePowerOffCommand;
+ 			}
+ 
+ 			count++;
+ 		}
+ 
+ 		return success ? new StopAnswer(cmd, "Success", 0, true) : new StopAnswer(cmd, "IPMI power off failed", false);
+ 	}
+ 
+ 	protected StartAnswer execute(StartCommand cmd) {
+ 		VirtualMachineTO vm = cmd.getVirtualMachine();
+ 		State state = State.Stopped;
+ 
+ 		try {
+ 			changeVmState(vm.getName(), State.Starting);
+ 
+ 			OutputInterpreter.AllLinesParser interpreter = new OutputInterpreter.AllLinesParser();
+ 			if (!doScript(_getStatusCommand, interpreter)) {
+ 				return new StartAnswer(cmd, "Cannot get current power status of " + _name);
+ 			}
+ 
+ 			if (isPowerOn(interpreter.getLines())) {
+ 				if (!doScript(_rebootCommand)) {
+ 					return new StartAnswer(cmd, "IPMI reboot failed");
+ 				}
+ 			} else {
+ 				if (!doScript(_powerOnCommand)) {
+ 					return new StartAnswer(cmd, "IPMI power on failed");
+ 				}
+ 			}
+ 			
+ 			if (_isEchoScAgent) {
+ 			    SecurityGroupHttpClient hc = new SecurityGroupHttpClient();
+ 			    boolean echoRet = hc.echo(vm.getNics()[0].getIp(), TimeUnit.MINUTES.toMillis(30), TimeUnit.MINUTES.toMillis(1));
+ 			    if (!echoRet) {
+ 			        return new StartAnswer(cmd, String.format("Call security group agent on vm[%s] timeout", vm.getNics()[0].getIp()));
+ 			    }
+ 			}
+ 
+ 			s_logger.debug("Start bare metal vm " + vm.getName() + "successfully");
+ 			state = State.Running;
+ 			_vmName = vm.getName();
+ 			return new StartAnswer(cmd);
+ 		} finally {
+ 			if (state != State.Stopped) {
+ 				changeVmState(vm.getName(), state);
+ 			} else {
+ 				removeVmState(vm.getName());
+ 			}
+ 		}
+ 	}
+ 
+ 	protected HashMap<String, State> deltaSync() {
+ 		final HashMap<String, State> changes = new HashMap<String, State>();
+ 		/*
+ 		 * Disable sync until we find a way that only tracks status but not does
+ 		 * action
+ 		 * 
+ 		 * The scenario is: Baremetal will reboot host when creating template.
+ 		 * Given most servers take a long time to boot up, there would be a
+ 		 * period that mgmt server finds the host is stopped through fullsync.
+ 		 * Then mgmt server updates database with marking the host as stopped,
+ 		 * after that, the host comes up and full sync then indicates it's
+ 		 * running. Because in database the host is already stopped, mgmt server
+ 		 * sends out a stop command. As a result, creating image gets never
+ 		 * happened.
+ 		 * 
+ 		 * if (_vmName == null) { return null; }
+ 		 * 
+ 		 * State newState = getVmState(); if (newState == null) {
+ 		 * s_logger.warn("Cannot get power state of VM " + _vmName); return
+ 		 * null; }
+ 		 * 
+ 		 * final State oldState = removeVmState(_vmName); if (oldState == null)
+ 		 * { changeVmState(_vmName, newState); changes.put(_vmName, newState); }
+ 		 * else if (oldState == State.Starting) { if (newState == State.Running)
+ 		 * { changeVmState(_vmName, newState); } else if (newState ==
+ 		 * State.Stopped) { s_logger.debug("Ignoring vm " + _vmName +
+ 		 * " because of a lag in starting the vm."); } } else if (oldState ==
+ 		 * State.Migrating) {
+ 		 * s_logger.warn("How can baremetal VM get into migrating state???"); }
+ 		 * else if (oldState == State.Stopping) { if (newState == State.Stopped)
+ 		 * { changeVmState(_vmName, newState); } else if (newState ==
+ 		 * State.Running) { s_logger.debug("Ignoring vm " + _vmName +
+ 		 * " because of a lag in stopping the vm. "); } } else if (oldState !=
+ 		 * newState) { changeVmState(_vmName, newState); changes.put(_vmName,
+ 		 * newState); }
+ 		 */
+ 		return changes;
+ 
+ 	}
+ 
+ 	protected ReadyAnswer execute(ReadyCommand cmd) {
+ 		// derived resource should check if the PXE server is ready
+ 		s_logger.debug("Bare metal resource " + _name + " is ready");
+ 		return new ReadyAnswer(cmd);
+ 	}
+ 
+ 	@Override
+ 	public void disconnected() {
+ 
+ 	}
+ 
+ 	@Override
+ 	public IAgentControl getAgentControl() {
+ 		return _agentControl;
+ 	}
+ 
+ 	@Override
+ 	public void setAgentControl(IAgentControl agentControl) {
+ 		_agentControl = agentControl;
+ 	}
+ 
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
index 0000000,5414106..bec6e38
mode 000000,100755..100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
@@@ -1,0 -1,173 +1,173 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.net.URI;
+ 
+ import javax.ejb.Local;
++import javax.inject.Inject;
+ 
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.dc.DataCenter;
+ import com.cloud.dc.Pod;
+ import com.cloud.dc.PodVlanMapVO;
+ import com.cloud.dc.Vlan;
+ import com.cloud.dc.Vlan.VlanType;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.PodVlanMapDao;
+ import com.cloud.dc.dao.VlanDao;
+ import com.cloud.deploy.DeployDestination;
+ import com.cloud.exception.ConcurrentOperationException;
+ import com.cloud.exception.InsufficientAddressCapacityException;
+ import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.hypervisor.Hypervisor.HypervisorType;
 -import com.cloud.network.IPAddressVO;
+ import com.cloud.network.Network;
+ import com.cloud.network.NetworkManager;
+ import com.cloud.network.Networks.AddressFormat;
+ import com.cloud.network.Networks.BroadcastDomainType;
+ import com.cloud.network.addr.PublicIp;
+ import com.cloud.network.dao.IPAddressDao;
++import com.cloud.network.dao.IPAddressVO;
+ import com.cloud.network.guru.DirectPodBasedNetworkGuru;
+ import com.cloud.network.guru.NetworkGuru;
+ import com.cloud.offerings.dao.NetworkOfferingDao;
 -import com.cloud.utils.component.Inject;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.vm.NicProfile;
+ import com.cloud.vm.ReservationContext;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachineProfile;
+ 
+ @Local(value = { NetworkGuru.class })
+ public class BaremetaNetworkGuru extends DirectPodBasedNetworkGuru {
+     private static final Logger s_logger = Logger.getLogger(BaremetaNetworkGuru.class);
+     @Inject
+     private HostDao _hostDao;
+     @Inject
+     DataCenterDao _dcDao;
+     @Inject
+     VlanDao _vlanDao;
+     @Inject
+     NetworkManager _networkMgr;
+     @Inject
+     IPAddressDao _ipAddressDao;
+     @Inject
+     NetworkOfferingDao _networkOfferingDao;
+     @Inject
+     PodVlanMapDao _podVlanDao;
+ 
+     @Override
+     public void reserve(NicProfile nic, Network network, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context)
+             throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException {
+         if (dest.getHost().getHypervisorType() != HypervisorType.BareMetal) {
+             super.reserve(nic, network, vm, dest, context);
+             return;
+         }
+ 
+         HostVO host = _hostDao.findById(dest.getHost().getId());
+         _hostDao.loadDetails(host);
+         String intentIp = host.getDetail(ApiConstants.IP_ADDRESS);
+         if (intentIp == null) {
+             super.reserve(nic, network, vm, dest, context);
+             return;
+         }
+         
+         String oldIp = nic.getIp4Address();
+         boolean getNewIp = false;
+         if (oldIp == null) {
+             getNewIp = true;
+         } else {
+             // we need to get a new ip address if we try to deploy a vm in a
+             // different pod
+             IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
+             if (ipVO != null) {
+                 PodVlanMapVO mapVO = _podVlanDao.listPodVlanMapsByVlan(ipVO.getVlanId());
+                 if (mapVO.getPodId() != dest.getPod().getId()) {
+                     Transaction txn = Transaction.currentTxn();
+                     txn.start();
+ 
+                     // release the old ip here
+                     _networkMgr.markIpAsUnavailable(ipVO.getId());
+                     _ipAddressDao.unassignIpAddress(ipVO.getId());
+ 
+                     txn.commit();
+ 
+                     nic.setIp4Address(null);
+                     getNewIp = true;
+                 }
+             }
+         }
+ 
+         if (getNewIp) {
+             // we don't set reservationStrategy to Create because we need this
+             // method to be called again for the case when vm fails to deploy in
+             // Pod1, and we try to redeploy it in Pod2
+             getBaremetalIp(nic, dest.getPod(), vm, network, intentIp);
+         }
+ 
+         DataCenter dc = _dcDao.findById(network.getDataCenterId());
+         nic.setDns1(dc.getDns1());
+         nic.setDns2(dc.getDns2());
+ 
+         /*
+          * Pod pod = dest.getPod(); Pair<String, Long> ip =
+          * _dcDao.allocatePrivateIpAddress(dest.getDataCenter().getId(),
+          * dest.getPod().getId(), nic.getId(), context.getReservationId(),
+          * intentIp); if (ip == null) { throw new
+          * InsufficientAddressCapacityException
+          * ("Unable to get a management ip address", Pod.class, pod.getId()); }
+          * 
+          * nic.setIp4Address(ip.first());
+          * nic.setMacAddress(NetUtils.long2Mac(NetUtils
+          * .createSequenceBasedMacAddress(ip.second())));
+          * nic.setGateway(pod.getGateway()); nic.setFormat(AddressFormat.Ip4);
+          * String netmask = NetUtils.getCidrNetmask(pod.getCidrSize());
+          * nic.setNetmask(netmask);
+          * nic.setBroadcastType(BroadcastDomainType.Native);
+          * nic.setBroadcastUri(null); nic.setIsolationUri(null);
+          */
+ 
+         s_logger.debug("Allocated a nic " + nic + " for " + vm);
+     }
+ 
+     private void getBaremetalIp(NicProfile nic, Pod pod, VirtualMachineProfile<? extends VirtualMachine> vm, Network network, String requiredIp)
+             throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException {
+         DataCenter dc = _dcDao.findById(pod.getDataCenterId());
+         if (nic.getIp4Address() == null) {
+             s_logger.debug(String.format("Requiring ip address: %s", nic.getIp4Address()));
+             PublicIp ip = _networkMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), requiredIp, false);
+             nic.setIp4Address(ip.getAddress().toString());
+             nic.setFormat(AddressFormat.Ip4);
+             nic.setGateway(ip.getGateway());
+             nic.setNetmask(ip.getNetmask());
+             if (ip.getVlanTag() != null && ip.getVlanTag().equalsIgnoreCase(Vlan.UNTAGGED)) {
+                 nic.setIsolationUri(URI.create("ec2://" + Vlan.UNTAGGED));
+                 nic.setBroadcastUri(URI.create("vlan://" + Vlan.UNTAGGED));
+                 nic.setBroadcastType(BroadcastDomainType.Native);
+             }
+             nic.setReservationId(String.valueOf(ip.getVlanTag()));
+             nic.setMacAddress(ip.getMacAddress());
+         }
+         nic.setDns1(dc.getDns1());
+         nic.setDns2(dc.getDns2());
+     }
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
index 0000000,968aa6d..b72d1c8
mode 000000,100755..100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
@@@ -1,0 -1,178 +1,178 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ 
+ import javax.ejb.Local;
++import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+ 
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.baremetal.database.BaremetalDhcpVO;
+ import com.cloud.baremetal.database.BaremetalPxeVO;
+ import com.cloud.dc.Pod;
+ import com.cloud.dc.DataCenter.NetworkType;
+ import com.cloud.deploy.DeployDestination;
+ import com.cloud.exception.ConcurrentOperationException;
+ import com.cloud.exception.InsufficientCapacityException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.host.Host;
+ import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.network.Network;
+ import com.cloud.network.PhysicalNetworkServiceProvider;
+ import com.cloud.network.Network.Capability;
+ import com.cloud.network.Network.GuestType;
+ import com.cloud.network.Network.Provider;
+ import com.cloud.network.Network.Service;
+ import com.cloud.network.Networks.TrafficType;
+ import com.cloud.network.element.DhcpServiceProvider;
+ import com.cloud.network.element.IpDeployer;
+ import com.cloud.network.element.NetworkElement;
+ import com.cloud.offering.NetworkOffering;
+ import com.cloud.utils.component.AdapterBase;
 -import com.cloud.utils.component.Inject;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.SearchCriteria.Op;
+ import com.cloud.utils.db.SearchCriteria2;
+ import com.cloud.utils.db.SearchCriteriaService;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.vm.NicProfile;
+ import com.cloud.vm.NicVO;
+ import com.cloud.vm.ReservationContext;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachine.Type;
+ import com.cloud.vm.dao.NicDao;
+ import com.cloud.vm.VirtualMachineProfile;
+ 
+ @Local(value = NetworkElement.class)
+ public class BaremetalDhcpElement extends AdapterBase implements DhcpServiceProvider {
+     private static final Logger s_logger = Logger.getLogger(BaremetalDhcpElement.class);
+     private static final Map<Service, Map<Capability, String>> capabilities;
+     
+     @Inject NicDao _nicDao;
+     @Inject BaremetalDhcpManager _dhcpMgr;
+     
+     static {
+         Capability cap = new Capability(BaremetalDhcpManager.BAREMETAL_DHCP_SERVICE_CAPABITLITY);
+         Map<Capability, String> baremetalCaps = new HashMap<Capability, String>();
+         baremetalCaps.put(cap, null);
+         capabilities = new HashMap<Service, Map<Capability, String>>();
+         capabilities.put(Service.Dhcp, baremetalCaps);
+     }
+     
+     @Override
+     public Map<Service, Map<Capability, String>> getCapabilities() {
+         return capabilities;
+     }
+ 
+     @Override
+     public Provider getProvider() {
+         return BaremetalDhcpManager.BAREMETAL_DHCP_SERVICE_PROVIDER;
+     }
+ 
+     private boolean canHandle(DeployDestination dest, TrafficType trafficType, GuestType networkType) {
+         Pod pod = dest.getPod();
+         if (pod != null && dest.getDataCenter().getNetworkType() == NetworkType.Basic && trafficType == TrafficType.Guest) {
+             SearchCriteriaService<BaremetalDhcpVO, BaremetalDhcpVO> sc = SearchCriteria2.create(BaremetalDhcpVO.class);
+             sc.addAnd(sc.getEntity().getPodId(), Op.EQ, pod.getId());
+             return sc.find() != null;
+         }
+         
+         return false;
+     }
+     
+     @Override
+     public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context)
+             throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
+         if (offering.isSystemOnly() || !canHandle(dest, offering.getTrafficType(), network.getGuestType())) {
+             s_logger.debug("BaremetalDhcpElement can not handle networkoffering: " + offering.getName());
+             return false;
+         }
+         return true;
+     }
+ 
+     @Override
+     @DB
+     public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest,
+             ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
+         Host host = dest.getHost();
+         if (vm.getType() != Type.User || vm.getHypervisorType() != HypervisorType.BareMetal) {
+             return false;
+         }
+         
+         Transaction txn = Transaction.currentTxn();
+         txn.start();
+         nic.setMacAddress(host.getPrivateMacAddress());
+         NicVO vo = _nicDao.findById(nic.getId());
+         assert vo != null : "Where ths nic " + nic.getId() + " going???";
+         vo.setMacAddress(nic.getMacAddress());
+         _nicDao.update(vo.getId(), vo);
+         txn.commit();
+         return true;
+     }
+ 
+     @Override
+     public boolean release(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, ReservationContext context)
+             throws ConcurrentOperationException, ResourceUnavailableException {
+         return true;
+     }
+ 
+     @Override
+     public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
+         return true;
+     }
+ 
+     @Override
+     public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+         return true;
+     }
+ 
+     @Override
+     public boolean isReady(PhysicalNetworkServiceProvider provider) {
+         return true;
+     }
+ 
+     @Override
+     public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException,
+             ResourceUnavailableException {
+         return true;
+     }
+ 
+     @Override
+     public boolean canEnableIndividualServices() {
+         return false;
+     }
+ 
+     @Override
+     public boolean verifyServicesCombination(Set<Service> services) {
+         return true;
+     }
+     
+     public boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest,
+             ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
+         if (vm.getHypervisorType() != HypervisorType.BareMetal || !canHandle(dest, network.getTrafficType(), network.getGuestType())) {
+             return false;
+         }
+         return _dhcpMgr.addVirtualMachineIntoNetwork(network, nic, vm, dest, context);
+     }
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
index 0000000,ae8482c..9a01ac2
mode 000000,100755..100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
@@@ -1,0 -1,323 +1,324 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ // Apache License, Version 2.0 (the "License"); you may not use this
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // 
+ // Automatically generated by addcopyright.py at 04/03/2012
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.net.URI;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.ejb.Local;
++import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+ 
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.agent.AgentManager;
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.StartupCommand;
+ import com.cloud.agent.api.StartupExternalDhcpCommand;
+ import com.cloud.agent.api.routing.DhcpEntryCommand;
+ import com.cloud.baremetal.database.BaremetalDhcpDao;
+ import com.cloud.baremetal.database.BaremetalDhcpVO;
+ import com.cloud.dc.DataCenter;
+ import com.cloud.dc.DataCenterVO;
+ import com.cloud.dc.HostPodVO;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.HostPodDao;
+ import com.cloud.deploy.DeployDestination;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.host.Host;
+ import com.cloud.host.Host.Type;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.network.Network;
+ import com.cloud.network.PhysicalNetworkServiceProvider;
 -import com.cloud.network.PhysicalNetworkVO;
+ import com.cloud.network.dao.PhysicalNetworkDao;
+ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
++import com.cloud.network.dao.PhysicalNetworkVO;
+ import com.cloud.resource.ResourceManager;
+ import com.cloud.resource.ResourceStateAdapter;
+ import com.cloud.resource.ServerResource;
+ import com.cloud.resource.UnableDeleteHostException;
 -import com.cloud.utils.component.Inject;
++import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.SearchCriteria.Op;
+ import com.cloud.utils.db.SearchCriteria2;
+ import com.cloud.utils.db.SearchCriteriaService;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.NicProfile;
+ import com.cloud.vm.ReservationContext;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachineProfile;
+ import com.cloud.vm.dao.NicDao;
+ import com.cloud.vm.dao.UserVmDao;
+ 
+ @Local(value = { BaremetalDhcpManager.class })
 -public class BaremetalDhcpManagerImpl implements BaremetalDhcpManager, ResourceStateAdapter {
++public class BaremetalDhcpManagerImpl extends ManagerBase implements BaremetalDhcpManager, ResourceStateAdapter {
+     private static final org.apache.log4j.Logger s_logger = Logger.getLogger(BaremetalDhcpManagerImpl.class);
+     protected String _name;
+     @Inject
+     DataCenterDao _dcDao;
+     @Inject
+     HostDao _hostDao;
+     @Inject
+     AgentManager _agentMgr;
+     @Inject
+     HostPodDao _podDao;
+     @Inject
+     UserVmDao _userVmDao;
+     @Inject
+     ResourceManager _resourceMgr;
+     @Inject
+     NicDao _nicDao;
+     @Inject
+     PhysicalNetworkDao _physicalNetworkDao;
+     @Inject
+     PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
+     @Inject
+     BaremetalDhcpDao _extDhcpDao;
+ 
+     @Override
+     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+         _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this);
+         return true;
+     }
+ 
+     @Override
+     public boolean start() {
+         return true;
+     }
+ 
+     @Override
+     public boolean stop() {
+         _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName());
+         return true;
+     }
+ 
+     @Override
+     public String getName() {
+         return _name;
+     }
+ 
+     protected String getDhcpServerGuid(String zoneId, String name, String ip) {
+         return zoneId + "-" + name + "-" + ip;
+     }
+ 
+     @Override
+     public boolean addVirtualMachineIntoNetwork(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> profile,
+             DeployDestination dest, ReservationContext context) throws ResourceUnavailableException {
 -        Long zoneId = profile.getVirtualMachine().getDataCenterIdToDeployIn();
++        Long zoneId = profile.getVirtualMachine().getDataCenterId();
+         Long podId = profile.getVirtualMachine().getPodIdToDeployIn();
+         List<HostVO> hosts = _resourceMgr.listAllUpAndEnabledHosts(Type.BaremetalDhcp, null, podId, zoneId);
+         if (hosts.size() == 0) {
+             throw new CloudRuntimeException("No external Dhcp found in zone " + zoneId + " pod " + podId);
+         }
+ 
+         if (hosts.size() > 1) {
+             throw new CloudRuntimeException("Something wrong, more than 1 external Dhcp found in zone " + zoneId + " pod " + podId);
+         }
+ 
+         HostVO h = hosts.get(0);
+         String dns = nic.getDns1();
+         if (dns == null) {
+             dns = nic.getDns2();
+         }
+         DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), profile.getVirtualMachine().getHostName(), dns,
+                 nic.getGateway());
+         String errMsg = String.format("Set dhcp entry on external DHCP %1$s failed(ip=%2$s, mac=%3$s, vmname=%4$s)", h.getPrivateIpAddress(),
+                 nic.getIp4Address(), nic.getMacAddress(), profile.getVirtualMachine().getHostName());
+         // prepareBareMetalDhcpEntry(nic, dhcpCommand);
+         try {
+             Answer ans = _agentMgr.send(h.getId(), dhcpCommand);
+             if (ans.getResult()) {
+                 s_logger.debug(String.format("Set dhcp entry on external DHCP %1$s successfully(ip=%2$s, mac=%3$s, vmname=%4$s)", h.getPrivateIpAddress(),
+                         nic.getIp4Address(), nic.getMacAddress(), profile.getVirtualMachine().getHostName()));
+                 return true;
+             } else {
+                 s_logger.debug(errMsg + " " + ans.getDetails());
+                 throw new ResourceUnavailableException(errMsg, DataCenter.class, zoneId);
+             }
+         } catch (Exception e) {
+             s_logger.debug(errMsg, e);
+             throw new ResourceUnavailableException(errMsg + e.getMessage(), DataCenter.class, zoneId);
+         }
+     }
+ 
+     @Override
+     public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
+         // TODO Auto-generated method stub
+         return null;
+     }
+ 
+     @Override
+     public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details,
+             List<String> hostTags) {
+         if (!(startup[0] instanceof StartupExternalDhcpCommand)) {
+             return null;
+         }
+ 
+         host.setType(Host.Type.BaremetalDhcp);
+         return host;
+     }
+ 
+     @Override
+     public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException {
+         // TODO Auto-generated method stub
+         return null;
+     }
+ 
+ 
+     @Override
+     @DB
+     public BaremetalDhcpVO addDchpServer(AddBaremetalDhcpCmd cmd) {
+         PhysicalNetworkVO pNetwork = null;
+         long zoneId;
+ 
+         if (cmd.getPhysicalNetworkId() == null || cmd.getUrl() == null || cmd.getUsername() == null || cmd.getPassword() == null) {
+             throw new IllegalArgumentException("At least one of the required parameters(physical network id, url, username, password) is null");
+         }
+ 
+         pNetwork = _physicalNetworkDao.findById(cmd.getPhysicalNetworkId());
+         if (pNetwork == null) {
+             throw new IllegalArgumentException("Could not find phyical network with ID: " + cmd.getPhysicalNetworkId());
+         }
+         zoneId = pNetwork.getDataCenterId();
+         DataCenterVO zone = _dcDao.findById(zoneId);
+ 
+         PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(),
+         		BaremetalDhcpManager.BAREMETAL_DHCP_SERVICE_PROVIDER.getName());
+         if (ntwkSvcProvider == null) {
+             throw new CloudRuntimeException("Network Service Provider: " + BaremetalDhcpManager.BAREMETAL_DHCP_SERVICE_PROVIDER.getName() + " is not enabled in the physical network: "
+                     + cmd.getPhysicalNetworkId() + "to add this device");
+         } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) {
+             throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName()
+                     + " is in shutdown state in the physical network: " + cmd.getPhysicalNetworkId() + "to add this device");
+         }
+ 
+         HostPodVO pod = _podDao.findById(cmd.getPodId());
+         if (pod == null) {
+             throw new IllegalArgumentException("Could not find pod with ID: " + cmd.getPodId());
+         }
+ 
+         List<HostVO> dhcps = _resourceMgr.listAllUpAndEnabledHosts(Host.Type.BaremetalDhcp, null, cmd.getPodId(), zoneId);
+         if (dhcps.size() != 0) {
+             throw new IllegalArgumentException("Already had a DHCP server in Pod: " + cmd.getPodId() + " zone: " + zoneId);
+         }
+ 
+         URI uri;
+         try {
+             uri = new URI(cmd.getUrl());
+         } catch (Exception e) {
+             s_logger.debug(e);
+             throw new IllegalArgumentException(e.getMessage());
+         }
+ 
+         String ipAddress = uri.getHost();
+         String guid = getDhcpServerGuid(Long.toString(zoneId) + "-" + Long.toString(cmd.getPodId()), "ExternalDhcp", ipAddress);
+         Map params = new HashMap<String, String>();
+         params.put("type", cmd.getDhcpType());
+         params.put("zone", Long.toString(zoneId));
+         params.put("pod", cmd.getPodId().toString());
+         params.put("ip", ipAddress);
+         params.put("username", cmd.getUsername());
+         params.put("password", cmd.getPassword());
+         params.put("guid", guid);
+         params.put("gateway", pod.getGateway());
+         String dns = zone.getDns1();
+         if (dns == null) {
+             dns = zone.getDns2();
+         }
+         params.put("dns", dns);
+ 
+         ServerResource resource = null;
+         try {
+             if (cmd.getDhcpType().equalsIgnoreCase(BaremetalDhcpType.DNSMASQ.toString())) {
+                 resource = new BaremetalDnsmasqResource();
+                 resource.configure("Dnsmasq resource", params);
+             } else if (cmd.getDhcpType().equalsIgnoreCase(BaremetalDhcpType.DHCPD.toString())) {
+                 resource = new BaremetalDhcpdResource();
+                 resource.configure("Dhcpd resource", params);
+             } else {
+                 throw new CloudRuntimeException("Unsupport DHCP server type: " + cmd.getDhcpType());
+             }
+         } catch (Exception e) {
+             s_logger.debug(e);
+             throw new CloudRuntimeException(e.getMessage());
+         }
+ 
+         Host dhcpServer = _resourceMgr.addHost(zoneId, resource, Host.Type.BaremetalDhcp, params);
+         if (dhcpServer == null) {
+             throw new CloudRuntimeException("Cannot add external Dhcp server as a host");
+         }
+ 
+         BaremetalDhcpVO vo = new BaremetalDhcpVO();
+         vo.setDeviceType(cmd.getDhcpType());
+         vo.setHostId(dhcpServer.getId());
+         vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
+         vo.setPhysicalNetworkId(cmd.getPhysicalNetworkId());
+         vo.setPodId(cmd.getPodId());
+         Transaction txn = Transaction.currentTxn();
+         txn.start();
+         _extDhcpDao.persist(vo);
+         txn.commit();
+         return vo;
+     }
+ 
+     @Override
+     public BaremetalDhcpResponse generateApiResponse(BaremetalDhcpVO vo) {
+         BaremetalDhcpResponse response = new BaremetalDhcpResponse();
+         response.setDeviceType(vo.getDeviceType());
+         response.setId(String.valueOf(vo.getId()));
+         response.setPhysicalNetworkId(String.valueOf(vo.getPhysicalNetworkId()));
+         response.setProviderId(String.valueOf(vo.getNetworkServiceProviderId()));
+         return response;
+     }
+ 
+     @Override
+     public List<BaremetalDhcpResponse> listBaremetalDhcps(ListBaremetalDhcpCmd cmd) {
+         SearchCriteriaService<BaremetalDhcpVO, BaremetalDhcpVO> sc = SearchCriteria2.create(BaremetalDhcpVO.class);
+         if (cmd.getDeviceType() != null) {
+         	sc.addAnd(sc.getEntity().getDeviceType(), Op.EQ, cmd.getDeviceType());
+         }
+         if (cmd.getPodId() != null) {
+             sc.addAnd(sc.getEntity().getPodId(), Op.EQ, cmd.getPodId());
+             if (cmd.getId() != null) {
+                 sc.addAnd(sc.getEntity().getId(), Op.EQ, cmd.getId());
+             }
+         }
+         List<BaremetalDhcpVO> vos = sc.list();
+         List<BaremetalDhcpResponse> responses = new ArrayList<BaremetalDhcpResponse>(vos.size());
+         for (BaremetalDhcpVO vo : vos) {
+             responses.add(generateApiResponse(vo));
+         }
+         return responses;
+     }
+ 
+ 	@Override
+ 	public List<Class<?>> getCommands() {
+ 		return null;
+ 	}
+ }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b2b369e/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpResourceBase.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpResourceBase.java
index 0000000,0541415..4496d5d
mode 000000,100644..100644
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpResourceBase.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpResourceBase.java
@@@ -1,0 -1,174 +1,175 @@@
+ // Licensed to the Apache Software Foundation (ASF) under one
+ // or more contributor license agreements.  See the NOTICE file
+ // distributed with this work for additional information
+ // regarding copyright ownership.  The ASF licenses this file
+ // to you under the Apache License, Version 2.0 (the
+ // "License"); you may not use this file except in compliance
+ // with 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 01/29/2013
+ // Apache License, Version 2.0 (the "License"); you may not use this
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // 
+ // Automatically generated by addcopyright.py at 04/03/2012
+ package com.cloud.baremetal.networkservice;
+ 
+ import java.util.HashMap;
+ import java.util.Map;
+ 
+ import javax.naming.ConfigurationException;
+ 
+ import org.apache.log4j.Logger;
+ 
+ import com.cloud.agent.IAgentControl;
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.Command;
+ import com.cloud.agent.api.PingCommand;
+ import com.cloud.agent.api.PingRoutingCommand;
+ import com.cloud.agent.api.ReadyAnswer;
+ import com.cloud.agent.api.ReadyCommand;
+ import com.cloud.agent.api.StartupCommand;
+ import com.cloud.agent.api.StartupExternalDhcpCommand;
+ import com.cloud.agent.api.StartupPxeServerCommand;
+ import com.cloud.host.Host.Type;
+ import com.cloud.resource.ServerResource;
++import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.script.Script;
+ import com.cloud.utils.ssh.SSHCmdHelper;
+ import com.cloud.vm.VirtualMachine.State;
+ import com.trilead.ssh2.SCPClient;
+ 
 -public class BaremetalDhcpResourceBase implements ServerResource {
++public class BaremetalDhcpResourceBase extends ManagerBase implements ServerResource {
+ 	private static final Logger s_logger = Logger.getLogger(BaremetalDhcpResourceBase.class);
+ 	String _name;
+ 	String _guid;
+ 	String _username;
+ 	String _password;
+ 	String _ip;
+ 	String _zoneId;
+ 	String _podId;
+ 	String _gateway;
+ 	String _dns;
+ 	
+ 	@Override
+ 	public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+ 		_name = name;
+ 		_guid = (String)params.get("guid");
+ 		_ip = (String)params.get("ip");
+ 		_username = (String)params.get("username");
+ 		_password = (String)params.get("password");
+ 		_zoneId = (String)params.get("zone");
+ 		_podId = (String)params.get("pod");
+ 		_gateway = (String)params.get("gateway");
+ 		_dns = (String)params.get("dns");
+ 		
+ 		if (_guid == null) {
+ 			throw new ConfigurationException("No Guid specified");
+ 		}
+ 		
+ 		if (_zoneId == null) {
+ 			throw new ConfigurationException("No Zone specified");
+ 		}
+ 		
+ 		if (_podId == null) {
+ 			throw new ConfigurationException("No Pod specified");
+ 		}
+ 		
+ 		if (_ip == null) {
+ 			throw new ConfigurationException("No IP specified");
+ 		}
+ 		
+ 		if (_username == null) {
+ 			throw new ConfigurationException("No username specified");
+ 		}
+ 		
+ 		if (_password == null) {
+ 			throw new ConfigurationException("No password specified");
+ 		}
+ 		
+ 		if (_gateway == null) {
+ 			throw new ConfigurationException("No gateway specified");
+ 		}
+ 		
+ 		if (_dns == null) {
+ 			throw new ConfigurationException("No dns specified");
+ 		}
+ 		
+ 		return true;
+ 	}
+ 
+ 	@Override
+ 	public boolean start() {
+ 		return true;
+ 	}
+ 
+ 	@Override
+ 	public boolean stop() {
+ 		return true;
+ 	}
+ 
+ 	@Override
+ 	public String getName() {
+ 		return _name;
+ 	}
+ 
+ 	@Override
+ 	public Type getType() {
+ 		return Type.BaremetalDhcp;
+ 	}
+ 
+ 	@Override
+ 	public StartupCommand[] initialize() {
+ 		StartupExternalDhcpCommand cmd = new StartupExternalDhcpCommand();
+ 		cmd.setName(_name);
+ 		cmd.setDataCenter(_zoneId);
+ 		cmd.setPod(_podId);
+ 		cmd.setPrivateIpAddress(_ip);
+ 		cmd.setStorageIpAddress("");
+ 		cmd.setVersion("");
+ 		cmd.setGuid(_guid);
+ 		return new StartupCommand[]{cmd};
+ 	}
+ 
+ 	@Override
+ 	public PingCommand getCurrentStatus(long id) {
+ 		//TODO: check server
+ 		return new PingRoutingCommand(getType(), id, new HashMap<String, State>());
+ 	}
+ 
+ 	protected ReadyAnswer execute(ReadyCommand cmd) {
+ 		s_logger.debug("External DHCP resource " + _name + " is ready");
+ 		return new ReadyAnswer(cmd);
+ 	}
+ 	
+ 	@Override
+ 	public Answer executeRequest(Command cmd) {
+ 		if (cmd instanceof ReadyCommand) {
+ 			return execute((ReadyCommand) cmd);
+ 		} else {
+ 			return Answer.createUnsupportedCommandAnswer(cmd);
+ 		}
+ 	}
+ 
+ 	@Override
+ 	public void disconnected() {
+ 	}
+ 
+ 	@Override
+ 	public IAgentControl getAgentControl() {
+ 		return null;
+ 	}
+ 
+ 	@Override
+ 	public void setAgentControl(IAgentControl agentControl) {
+ 	}
+ 
+ }