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

[1/6] git commit: ProvisioningService:: registerZone changes and unit-test

ProvisioningService:: registerZone changes and unit-test


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/1eb64e61
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/1eb64e61
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/1eb64e61

Branch: refs/heads/javelin
Commit: 1eb64e6181706e70a17f30d8f640503bdcae1948
Parents: d7bc09f
Author: Prachi Damle <pr...@cloud.com>
Authored: Fri Dec 14 14:18:39 2012 +0530
Committer: Prachi Damle <pr...@cloud.com>
Committed: Thu Jan 3 11:44:36 2013 -0800

----------------------------------------------------------------------
 .../entity/api/DataCenterResourceEntity.java       |    5 +
 .../engine/datacenter/entity/api/ZoneEntity.java   |    7 +-
 .../engine/entity/api/CloudStackEntity.java        |   14 +-
 .../engine/service/api/ProvisioningService.java    |    8 +-
 engine/orchestration/pom.xml                       |   15 +
 .../entity/api/DataCenterResourceManager.java      |   19 +
 .../entity/api/DataCenterResourceManagerImpl.java  |   46 ++
 .../datacenter/entity/api/PodEntityImpl.java       |   59 +-
 .../datacenter/entity/api/ZoneEntityImpl.java      |  270 +++------
 .../datacenter/entity/api/db/ClusterDetailsVO.java |   68 ++
 .../datacenter/entity/api/db/DataCenterVO.java     |  478 +++++++++++++++
 .../datacenter/entity/api/db/DcDetailVO.java       |   67 ++
 .../entity/api/db/dao/DataCenterDao.java           |   56 ++
 .../entity/api/db/dao/DataCenterDaoImpl.java       |  333 ++++++++++
 .../datacenter/entity/api/db/dao/DcDetailsDao.java |   29 +
 .../entity/api/db/dao/DcDetailsDaoImpl.java        |   92 +++
 .../service/api/ProvisioningServiceImpl.java       |   94 ++-
 .../provisioning/test/ChildTestConfiguration.java  |   18 +
 .../engine/provisioning/test/ProvisioningTest.java |   61 ++
 .../test/resource/provisioningContext.xml          |   29 +
 .../datastore/PrimaryDataStoreEntityImpl.java      |   19 +-
 .../storage/image/TemplateEntityImpl.java          |   19 +-
 .../storage/snapshot/SnapshotEntityImpl.java       |   54 +-
 .../storage/volume/VolumeEntityImpl.java           |   55 +-
 24 files changed, 1570 insertions(+), 345 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceEntity.java b/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceEntity.java
index eccccd6..3e0b3f1 100755
--- a/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceEntity.java
@@ -19,6 +19,8 @@
 package org.apache.cloudstack.engine.datacenter.entity.api;
 
 import javax.ws.rs.GET;
+
+
 import javax.ws.rs.POST;
 import javax.ws.rs.Produces;
 
@@ -90,8 +92,11 @@ public interface DataCenterResourceEntity extends CloudStackEntity, StateObject<
     @POST
     boolean reactivate();
 
+
     @Override
     @GET
     State getState();
 
+    
+    public void persist();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntity.java b/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntity.java
index fb033b0..106e18d 100755
--- a/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntity.java
@@ -25,10 +25,6 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.cloudstack.engine.service.api.ProvisioningService;
-import org.apache.cloudstack.framework.ws.jackson.Url;
-
-import com.cloud.dc.DataCenter;
 
 /**
  * Describes a zone and operations that can be done in a zone. 
@@ -36,7 +32,8 @@ import com.cloud.dc.DataCenter;
 @Path("/zone/{zoneid}")
 @Produces({"application/json"})
 @XmlRootElement(name="zone")
-public interface ZoneEntity extends DataCenterResourceEntity, DataCenter {
+@Path("zone/{zone-id}")
+public interface ZoneEntity extends DataCenterResourceEntity {
     @GET
     @Path("/pods")
     List<PodEntity> listPods();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/api/src/org/apache/cloudstack/engine/entity/api/CloudStackEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/entity/api/CloudStackEntity.java b/engine/api/src/org/apache/cloudstack/engine/entity/api/CloudStackEntity.java
index 3b19cca..e1f41fa 100755
--- a/engine/api/src/org/apache/cloudstack/engine/entity/api/CloudStackEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/entity/api/CloudStackEntity.java
@@ -80,19 +80,13 @@ public interface CloudStackEntity {
     /**
      * @return details stored for this entity when created.
      */
-    Map<String, String> getDetails(
-            @QueryParam("source") String source);
+    Map<String, String> getDetails();
 
-    /**
-     * @return a list of sources that have added to the details.
-     */
-    List<String> getDetailSources();
-
-    void addDetail(String source, String name, String value);
+    void addDetail(String name, String value);
 
-    void delDetail(String source, String name, String value);
+    void delDetail(String name, String value);
 
-    void updateDetail(String source, String name, String value);
+    void updateDetail(String name, String value);
 
     /**
      * @return list of actions that can be performed on the object in its current state

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/api/src/org/apache/cloudstack/engine/service/api/ProvisioningService.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/service/api/ProvisioningService.java b/engine/api/src/org/apache/cloudstack/engine/service/api/ProvisioningService.java
index c2696bf..8b28aee 100755
--- a/engine/api/src/org/apache/cloudstack/engine/service/api/ProvisioningService.java
+++ b/engine/api/src/org/apache/cloudstack/engine/service/api/ProvisioningService.java
@@ -21,6 +21,8 @@ package org.apache.cloudstack.engine.service.api;
 import java.util.List;
 import java.util.Map;
 
+import javax.ws.rs.POST;
+
 import org.apache.cloudstack.engine.datacenter.entity.api.ClusterEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.PodEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
@@ -39,9 +41,11 @@ public interface ProvisioningService {
 
     StorageEntity registerStorage(String name, List<String> tags, Map<String, String> details);
 
-    ZoneEntity registerZone(String name, List<String> tags, Map<String, String> details);
+    @POST
+    ZoneEntity registerZone(String zoneUuid, String owner, List<String> tags, Map<String, String> details);
 
-    PodEntity registerPod(String name, List<String> tags, Map<String, String> details);
+    @POST
+    PodEntity registerPod(String name, Long zoneId, String gateway, String cidr, String startIp, String endIp, List<String> tags, Map<String, String> details);
 
     ClusterEntity registerCluster(String name, List<String> tags, Map<String, String> details);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/pom.xml
----------------------------------------------------------------------
diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml
index 2f03547..8b9210c 100755
--- a/engine/orchestration/pom.xml
+++ b/engine/orchestration/pom.xml
@@ -43,6 +43,21 @@
       <artifactId>cloud-engine-components-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cloudstack</groupId>
+      <artifactId>cloud-utils</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+    	<groupId>org.mockito</groupId>
+    	<artifactId>mockito-all</artifactId>
+    	<version>1.9.5</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+      <version>1</version>
+    </dependency>
   </dependencies>
   <build>
     <defaultGoal>install</defaultGoal>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManager.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManager.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManager.java
new file mode 100644
index 0000000..8bd3ca4
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManager.java
@@ -0,0 +1,19 @@
+package org.apache.cloudstack.engine.datacenter.entity.api;
+
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+
+import com.cloud.utils.fsm.NoTransitionException;
+
+
+
+public interface DataCenterResourceManager {
+	
+	DataCenterVO loadDataCenter(String dataCenterId);
+	
+	void saveDataCenter(DataCenterVO dc);
+	
+	boolean changeState(ZoneEntity dc, Event event) throws NoTransitionException;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManagerImpl.java
new file mode 100644
index 0000000..b36b11d
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/DataCenterResourceManagerImpl.java
@@ -0,0 +1,46 @@
+package org.apache.cloudstack.engine.datacenter.entity.api;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DataCenterDao;
+import org.springframework.stereotype.Component;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.utils.Pair;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
+import com.cloud.vm.VirtualMachine;
+
+@Component
+public class DataCenterResourceManagerImpl implements DataCenterResourceManager {
+
+   // @Inject
+    DataCenterDao _dataCenterDao;
+    
+    protected StateMachine2<State, Event, DataCenterResourceEntity> _stateMachine;
+
+	@Override
+	public DataCenterVO loadDataCenter(String dataCenterId) {
+    	DataCenterVO dataCenterVO = _dataCenterDao.findByUUID(dataCenterId);
+    	if(dataCenterVO == null){
+    		throw new InvalidParameterValueException("Zone does not exist");
+    	}
+    	return dataCenterVO;
+	}
+
+	@Override
+	public void saveDataCenter(DataCenterVO dc) {
+		_dataCenterDao.persist(dc);
+
+	}
+
+	@Override
+	public boolean changeState(ZoneEntity entity, Event event) throws NoTransitionException {
+		return _stateMachine.transitTo((DataCenterResourceEntity)entity, event, null, _dataCenterDao);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/PodEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/PodEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/PodEntityImpl.java
index 978bbcb..ba42959 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/PodEntityImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/PodEntityImpl.java
@@ -105,35 +105,6 @@ public class PodEntityImpl implements PodEntity {
         return null;
     }
 
-    @Override
-    public Map<String, String> getDetails(String source) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public List<String> getDetailSources() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void addDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void delDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void updateDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
 
     @Override
     public List<Method> getApplicableActions() {
@@ -194,4 +165,34 @@ public class PodEntityImpl implements PodEntity {
         return null;
     }
 
+	@Override
+	public void persist() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public Map<String, String> getDetails() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void delDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void updateDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntityImpl.java
index 71c1f25..ae35536 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntityImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/ZoneEntityImpl.java
@@ -24,53 +24,86 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
 
-public class ZoneEntityImpl implements ZoneEntity {
-    String _id;
-    String _name;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DataCenterDao;
+import org.apache.cloudstack.engine.service.api.ProvisioningService;
+
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.fsm.FiniteStateObject;
+import com.cloud.utils.fsm.NoTransitionException;
 
-    // This is a test constructor
-    public ZoneEntityImpl(String id, String name) {
-        _id = id;
-        _name = name;
-    }
 
-    public ZoneEntityImpl() {
+@Component
+@Path("/zone/{id}")
+public class ZoneEntityImpl implements ZoneEntity, FiniteStateObject<DataCenterResourceEntity.State, DataCenterResourceEntity.State.Event> {
+	
+	@Inject
+	DataCenterResourceManager manager;
+
+	
+	private DataCenterVO dataCenterVO;
+	
+	
+	public ZoneEntityImpl(String dataCenterId) {
+    	this.dataCenterVO = manager.loadDataCenter(dataCenterId);
     }
 
-    @Override
-    public boolean enable() {
-        // TODO Auto-generated method stub
-        return false;
+	@Override
+    @GET
+    public String getUuid() {
+        return dataCenterVO.getUuid();
     }
 
     @Override
-    public boolean disable() {
-        // TODO Auto-generated method stub
-        return false;
+    public long getId() {
+    	return dataCenterVO.getId();
     }
 
     @Override
-    public boolean deactivate() {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean enable() {
+    	try {
+			manager.changeState(this, Event.EnableRequest);
+		} catch (NoTransitionException e) {
+			return false;
+		}
+    	return true;
     }
 
     @Override
-    public boolean reactivate() {
-        // TODO Auto-generated method stub
-        return false;
+    public boolean disable() {
+    	try {
+			manager.changeState(this, Event.DisableRequest);
+		} catch (NoTransitionException e) {
+			return false;
+		}
+    	return true;
     }
 
     @Override
-    public String getUuid() {
-        return _id;
+    public boolean deactivate() {
+    	try {
+			manager.changeState(this, Event.DeactivateRequest);
+		} catch (NoTransitionException e) {
+			return false;
+		}
+    	return true;
     }
 
     @Override
-    public long getId() {
-        // TODO Auto-generated method stub
-        return 0;
+    public boolean reactivate() {
+    	try {
+			manager.changeState(this, Event.ActivatedRequest);
+		} catch (NoTransitionException e) {
+			return false;
+		}
+    	return true;
     }
 
     @Override
@@ -87,48 +120,45 @@ public class ZoneEntityImpl implements ZoneEntity {
 
     @Override
     public Date getCreatedTime() {
-        // TODO Auto-generated method stub
-        return new Date();
+        return dataCenterVO.getCreated();
     }
 
     @Override
     public Date getLastUpdatedTime() {
-        // TODO Auto-generated method stub
-        return new Date();
+        return  dataCenterVO.getLastUpdated();
     }
 
     @Override
     public String getOwner() {
-        // TODO Auto-generated method stub
-        return "owner";
+        return dataCenterVO.getOwner();
     }
 
-    @Override
-    public Map<String, String> getDetails(String source) {
-        // TODO Auto-generated method stub
-        return null;
+    public void setOwner(String owner) {
+    	dataCenterVO.setOwner(owner);
     }
-
+    
     @Override
-    public List<String> getDetailSources() {
-        // TODO Auto-generated method stub
-        return null;
+    public Map<String, String> getDetails() {
+    	return dataCenterVO.getDetails();
+	}
+
+    public void setDetails(Map<String,String> details) {
+    	dataCenterVO.setDetails(details);
     }
 
+    
     @Override
-    public void addDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
+    public void addDetail(String name, String value) {
+    	dataCenterVO.setDetail(name, value);
     }
 
     @Override
-    public void delDetail(String source, String name, String value) {
+    public void delDetail(String name, String value) {
         // TODO Auto-generated method stub
-
     }
 
     @Override
-    public void updateDetail(String source, String name, String value) {
+    public void updateDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
@@ -141,152 +171,26 @@ public class ZoneEntityImpl implements ZoneEntity {
 
     @Override
     public State getState() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDns1() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDns2() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getGuestNetworkCidr() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getName() {
-        return _name;
-    }
-
-    @Override
-    public Long getDomainId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDescription() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDomain() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public NetworkType getNetworkType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getInternalDns1() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getInternalDns2() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDnsProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getGatewayProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getFirewallProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDhcpProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getLoadBalancerProvider() {
-        // TODO Auto-generated method stub
-        return null;
+        return dataCenterVO.getState();
     }
 
-    @Override
-    public String getUserDataProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getVpnProvider() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isSecurityGroupEnabled() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public Map<String, String> getDetails() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
     @Override
-    public void setDetails(Map<String, String> details) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public AllocationState getAllocationState() {
+    public List<PodEntity> listPods() {
         // TODO Auto-generated method stub
         return null;
     }
 
-    @Override
-    public String getZoneToken() {
-        // TODO Auto-generated method stub
-        return null;
-    }
+	@Override
+	public void setState(State state) {
+		//use FSM to set state.
+	}
 
-    @Override
-    public boolean isLocalStorageEnabled() {
-        // TODO Auto-generated method stub
-        return false;
-    }
+	@Override
+	public void persist() {
+		manager.saveDataCenter(dataCenterVO);
+	}
 
-    @Override
-    public List<PodEntity> listPods() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
     @Override
     public List<String> listPodIds() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java
new file mode 100644
index 0000000..d735c47
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java
@@ -0,0 +1,68 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="cluster_details")
+public class ClusterDetailsVO {
+
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    private long id;
+    
+    @Column(name="cluster_id")
+    private long clusterId;
+    
+    @Column(name="name")
+    private String name;
+    
+    @Column(name="value")
+    private String value;
+    
+    protected ClusterDetailsVO() {
+    }
+    
+    public ClusterDetailsVO(long clusterId, String name, String value) {
+        this.clusterId = clusterId;
+        this.name = name;
+        this.value = value;
+    }
+
+    public long getClusterId() {
+        return clusterId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public long getId() {
+        return id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DataCenterVO.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DataCenterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DataCenterVO.java
new file mode 100644
index 0000000..9047cb9
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DataCenterVO.java
@@ -0,0 +1,478 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event;
+
+import com.cloud.api.Identity;
+import com.cloud.dc.DataCenter;
+import com.cloud.network.Network.Provider;
+import com.cloud.org.Grouping;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.utils.db.StateMachine;
+
+@Entity
+@Table(name="data_center")
+public class DataCenterVO implements DataCenter, Identity {
+    
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    private long id;
+    
+	@Column(name="name")
+	private String name = null;
+    
+    @Column(name="description")
+    private String description = null;
+    
+    @Column(name="dns1")
+    private String dns1 = null;
+    
+    @Column(name="dns2")
+    private String dns2 = null;
+    
+    @Column(name="internal_dns1")
+    private String internalDns1 = null;
+    
+    @Column(name="internal_dns2")
+    private String internalDns2 = null;
+    
+    @Column(name="router_mac_address", updatable = false, nullable=false)
+    private String routerMacAddress = "02:00:00:00:00:01";
+    
+    @Column(name="guest_network_cidr")
+    private String guestNetworkCidr = null;
+    
+    @Column(name="domain_id")
+    private Long domainId = null;
+
+    @Column(name="domain")
+    private String domain;
+    
+    @Column(name="networktype")
+    @Enumerated(EnumType.STRING) 
+    NetworkType networkType;
+    
+    @Column(name="dns_provider")
+    private String dnsProvider;
+    
+    @Column(name="dhcp_provider")
+    private String dhcpProvider;
+    
+    @Column(name="gateway_provider")
+    private String gatewayProvider;
+    
+    @Column(name="vpn_provider")
+    private String vpnProvider;
+    
+    @Column(name="userdata_provider")
+    private String userDataProvider;
+    
+    @Column(name="lb_provider")
+    private String loadBalancerProvider;
+    
+    @Column(name="firewall_provider")
+    private String firewallProvider;
+    
+    @Column(name="mac_address", nullable=false)
+    @TableGenerator(name="mac_address_sq", table="data_center", pkColumnName="id", valueColumnName="mac_address", allocationSize=1)
+    private long macAddress = 1;
+    
+	@Column(name="zone_token")
+	private String zoneToken;    
+	
+    @Column(name=GenericDao.REMOVED_COLUMN)
+    private Date removed;
+    
+    // This is a delayed load value.  If the value is null,
+    // then this field has not been loaded yet.
+    // Call the dao to load it.
+    @Transient
+    Map<String, String> details;
+    
+    @Column(name="allocation_state")
+    @Enumerated(value=EnumType.STRING)
+    AllocationState allocationState;
+
+	@Column(name="uuid")
+	private String uuid;    
+    
+    @Column(name="is_security_group_enabled")
+    boolean securityGroupEnabled;
+    
+    @Column(name="is_local_storage_enabled")
+    boolean localStorageEnabled;
+    
+    //orchestration
+    @Column(name="owner")
+    private String owner = null;
+    
+    @Column(name=GenericDao.CREATED_COLUMN)
+    protected Date created;
+
+    @Column(name="lastUpdated", updatable=true)
+    @Temporal(value=TemporalType.TIMESTAMP)
+    protected Date lastUpdated;
+    
+    /**
+     * Note that state is intentionally missing the setter.  Any updates to
+     * the state machine needs to go through the DAO object because someone
+     * else could be updating it as well.
+     */
+    @Enumerated(value=EnumType.STRING)
+    @StateMachine(state=State.class, event=Event.class)
+    @Column(name="state", updatable=true, nullable=false, length=32)
+    protected State state = null;
+
+
+    @Override
+    public String getDnsProvider() {
+        return dnsProvider;
+    }
+
+    public void setDnsProvider(String dnsProvider) {
+        this.dnsProvider = dnsProvider;
+    }
+
+    @Override
+    public String getDhcpProvider() {
+        return dhcpProvider;
+    }
+
+    public void setDhcpProvider(String dhcpProvider) {
+        this.dhcpProvider = dhcpProvider;
+    }
+
+    @Override
+    public String getGatewayProvider() {
+        return gatewayProvider;
+    }
+
+    public void setGatewayProvider(String gatewayProvider) {
+        this.gatewayProvider = gatewayProvider;
+    }
+
+    @Override
+    public String getLoadBalancerProvider() {
+        return loadBalancerProvider;
+    }
+
+    public void setLoadBalancerProvider(String loadBalancerProvider) {
+        this.loadBalancerProvider = loadBalancerProvider;
+    }
+
+    @Override
+    public String getFirewallProvider() {
+        return firewallProvider; 
+    }
+
+    public void setFirewallProvider(String firewallProvider) {
+        this.firewallProvider = firewallProvider;
+    }
+    
+    public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) {
+        this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix, false, false);
+        this.id = id;
+        this.allocationState = Grouping.AllocationState.Enabled;
+        this.uuid = UUID.randomUUID().toString();
+	}
+
+    public DataCenterVO(String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix, boolean securityGroupEnabled, boolean localStorageEnabled) {
+        this.name = name;
+        this.description = description;
+        this.dns1 = dns1;
+        this.dns2 = dns2;
+        this.internalDns1 = dns3;
+        this.internalDns2 = dns4;
+        this.guestNetworkCidr = guestCidr;
+        this.domain = domain;
+        this.domainId = domainId;
+        this.networkType = zoneType;
+        this.allocationState = Grouping.AllocationState.Enabled;
+        this.securityGroupEnabled = securityGroupEnabled;
+        this.localStorageEnabled = localStorageEnabled;
+        
+        if (zoneType == NetworkType.Advanced) {
+            loadBalancerProvider = Provider.VirtualRouter.getName();
+            firewallProvider = Provider.VirtualRouter.getName();
+            dhcpProvider = Provider.VirtualRouter.getName();
+            dnsProvider = Provider.VirtualRouter.getName();
+            gatewayProvider = Provider.VirtualRouter.getName();
+            vpnProvider = Provider.VirtualRouter.getName();
+            userDataProvider = Provider.VirtualRouter.getName();
+        } else if (zoneType == NetworkType.Basic){
+            dhcpProvider = Provider.VirtualRouter.getName();
+            dnsProvider = Provider.VirtualRouter.getName();
+            userDataProvider = Provider.VirtualRouter.getName();
+            loadBalancerProvider = Provider.ElasticLoadBalancerVm.getName();
+        }
+
+        this.zoneToken = zoneToken;
+        this.domain = domainSuffix;
+        this.uuid = UUID.randomUUID().toString();
+    }
+    
+    @Override
+    public String getVpnProvider() {
+        return vpnProvider;
+    }
+
+    public void setVpnProvider(String vpnProvider) {
+        this.vpnProvider = vpnProvider;
+    }
+
+    @Override
+    public String getUserDataProvider() {
+        return userDataProvider;
+    }
+
+    public void setUserDataProvider(String userDataProvider) {
+        this.userDataProvider = userDataProvider;
+    }
+    
+    @Override
+    public String getGuestNetworkCidr()
+    {
+    	return guestNetworkCidr;
+    }
+    
+    public void setGuestNetworkCidr(String guestNetworkCidr)
+    {
+    	this.guestNetworkCidr = guestNetworkCidr;
+    }
+
+    @Override
+    public Long getDomainId() {
+		return domainId;
+	}
+
+	public void setDomainId(Long domainId) {
+		this.domainId = domainId;
+	}
+    
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    public String getRouterMacAddress() {
+        return routerMacAddress;
+    }
+    
+    @Override
+    public String getDns1() {
+        return dns1;
+    }
+    
+    @Override
+    public String getDns2() {
+        return dns2;
+    }
+
+    @Override
+    public String getInternalDns1() {
+        return internalDns1;
+    }
+
+    @Override
+    public String getInternalDns2() {
+        return internalDns2;
+    }
+
+	protected DataCenterVO() {
+    }
+
+	@Override
+    public long getId() {
+		return id;
+	}
+	
+	@Override
+    public String getName() {
+	    return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public void setDns1(String dns1) {
+		this.dns1 = dns1;
+	}
+	
+	public void setDns2(String dns2) {
+		this.dns2 = dns2;
+	}
+	
+	public void setInternalDns1(String dns3) {
+		this.internalDns1 = dns3;
+	}
+	
+	public void setInternalDns2(String dns4) {
+		this.internalDns2 = dns4;
+	}
+
+    public void setRouterMacAddress(String routerMacAddress) {
+        this.routerMacAddress = routerMacAddress;
+    }
+    
+    @Override
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+    
+    public void setNetworkType(NetworkType zoneNetworkType) {
+        this.networkType = zoneNetworkType;
+    }
+
+    @Override
+    public NetworkType getNetworkType() {
+        return networkType;
+    }
+    
+    @Override 
+    public boolean isSecurityGroupEnabled() {
+        return securityGroupEnabled;
+    }
+    
+    public void setSecurityGroupEnabled(boolean enabled) {
+        this.securityGroupEnabled = enabled;
+    }
+    
+    @Override
+    public boolean isLocalStorageEnabled() {
+        return localStorageEnabled;
+    }
+
+    public void setLocalStorageEnabled(boolean enabled) {
+        this.localStorageEnabled = enabled;
+    }
+
+    @Override
+    public Map<String, String> getDetails() {
+        return details;
+    }
+
+    @Override
+    public void setDetails(Map<String, String> details2) {
+        details = details2;        
+    }
+    
+    public String getDetail(String name) {
+        assert (details != null) : "Did you forget to load the details?";
+        
+        return details != null ? details.get(name) : null;
+    }
+    
+    public void setDetail(String name, String value) {
+        assert (details != null) : "Did you forget to load the details?";
+        
+        details.put(name, value);
+    }
+    
+    public AllocationState getAllocationState() {
+    	return allocationState;
+    }
+    
+    public void setAllocationState(AllocationState allocationState) {
+		this.allocationState = allocationState;
+    }
+    
+    @Override
+    public int hashCode() {
+        return NumbersUtil.hash(id);
+    }
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof DataCenterVO)) {
+            return false;
+        }
+        DataCenterVO that = (DataCenterVO)obj;
+        return this.id == that.id;
+    }
+
+    @Override
+    public String getZoneToken() {
+ 	    return zoneToken;
+ 	}
+ 	
+ 	public void setZoneToken(String zoneToken) {
+ 		this.zoneToken = zoneToken;
+ 	}
+ 	
+ 	public Date getRemoved() {
+ 	    return removed;
+ 	}
+ 	
+ 	@Override
+ 	public String getUuid() {
+ 		return this.uuid;
+ 	}
+ 	
+ 	public void setUuid(String uuid) {
+ 		this.uuid = uuid;
+ 	}
+
+    public long getMacAddress() {
+        return macAddress;
+    }
+
+    public void setMacAddress(long macAddress) {
+        this.macAddress = macAddress;
+    }
+
+	public String getOwner() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner = owner;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public Date getLastUpdated() {
+		return lastUpdated;
+	}
+
+	public State getState() {
+		return state;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java
new file mode 100644
index 0000000..ef59118
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java
@@ -0,0 +1,67 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="data_center_details")
+public class DcDetailVO {
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    private long id;
+    
+    @Column(name="dc_id")
+    private long dcId;
+    
+    @Column(name="name")
+    private String name;
+    
+    @Column(name="value")
+    private String value;
+    
+    protected DcDetailVO() {
+    }
+    
+    public DcDetailVO(long dcId, String name, String value) {
+        this.dcId = dcId;
+        this.name = name;
+        this.value = value;
+    }
+
+    public long getDcId() {
+        return dcId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public long getId() {
+        return id;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDao.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDao.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDao.java
new file mode 100644
index 0000000..f34533e
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDao.java
@@ -0,0 +1,56 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.ZoneEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.utils.fsm.StateDao;
+
+
+public interface DataCenterDao extends GenericDao<DataCenterVO, Long>, StateDao<DataCenterResourceEntity.State, DataCenterResourceEntity.State.Event, DataCenterResourceEntity> {
+    DataCenterVO findByName(String name);
+    
+    /**
+     * @param id data center id
+     * @return a pair of mac address strings.  The first one is private and second is public.
+     */
+    String[] getNextAvailableMacAddressPair(long id);
+    String[] getNextAvailableMacAddressPair(long id, long mask);
+	List<DataCenterVO> findZonesByDomainId(Long domainId);
+
+	List<DataCenterVO> listPublicZones(String keyword);
+
+	List<DataCenterVO> findChildZones(Object[] ids, String keyword);
+
+    void loadDetails(DataCenterVO zone);
+    void saveDetails(DataCenterVO zone);
+    
+    List<DataCenterVO> listDisabledZones();
+    List<DataCenterVO> listEnabledZones();
+    DataCenterVO findByToken(String zoneToken);    
+    DataCenterVO findByTokenOrIdOrName(String tokenIdOrName);
+
+    
+
+	List<DataCenterVO> findZonesByDomainId(Long domainId, String keyword);
+
+	List<DataCenterVO> findByKeyword(String keyword);
+
+	DataCenterVO findByUUID(String uuid);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDaoImpl.java
new file mode 100644
index 0000000..a25b375
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DataCenterDaoImpl.java
@@ -0,0 +1,333 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db.dao;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+import javax.persistence.TableGenerator;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event;
+import org.apache.cloudstack.engine.datacenter.entity.api.ZoneEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+import org.apache.log4j.Logger;
+
+import com.cloud.org.Grouping;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.ComponentLocator;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SequenceFetcher;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.UpdateBuilder;
+import com.cloud.utils.net.NetUtils;
+
+/**
+ * @config
+ * {@table
+ *    || Param Name | Description | Values | Default ||
+ *    || mac.address.prefix | prefix to attach to all public and private mac addresses | number | 06 ||
+ *  }
+ **/
+@Local(value={DataCenterDao.class})
+public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implements DataCenterDao {
+    private static final Logger s_logger = Logger.getLogger(DataCenterDaoImpl.class);
+
+    protected SearchBuilder<DataCenterVO> NameSearch;
+    protected SearchBuilder<DataCenterVO> ListZonesByDomainIdSearch;
+    protected SearchBuilder<DataCenterVO> PublicZonesSearch;
+    protected SearchBuilder<DataCenterVO> ChildZonesSearch;
+    protected SearchBuilder<DataCenterVO> DisabledZonesSearch;
+    protected SearchBuilder<DataCenterVO> TokenSearch;
+    protected SearchBuilder<DataCenterVO> StateChangeSearch;
+    protected SearchBuilder<DataCenterVO> UUIDSearch;
+    
+    protected long _prefix;
+    protected Random _rand = new Random(System.currentTimeMillis());
+    protected TableGenerator _tgMacAddress;
+    
+    protected final DcDetailsDaoImpl _detailsDao = ComponentLocator.inject(DcDetailsDaoImpl.class);
+
+
+    @Override
+    public DataCenterVO findByName(String name) {
+    	SearchCriteria<DataCenterVO> sc = NameSearch.create();
+    	sc.setParameters("name", name);
+        return findOneBy(sc);
+    }
+
+    @Override
+    public DataCenterVO findByUUID(String uuid) {
+    	SearchCriteria<DataCenterVO> sc = UUIDSearch.create();
+    	sc.setParameters("uuid", uuid);
+        return findOneBy(sc);
+    }
+    
+    @Override
+    public DataCenterVO findByToken(String zoneToken){
+    	SearchCriteria<DataCenterVO> sc = TokenSearch.create();
+    	sc.setParameters("zoneToken", zoneToken);
+        return findOneBy(sc);
+    }
+    
+    @Override
+    public List<DataCenterVO> findZonesByDomainId(Long domainId){
+    	SearchCriteria<DataCenterVO> sc = ListZonesByDomainIdSearch.create();
+    	sc.setParameters("domainId", domainId);
+        return listBy(sc);    	
+    }
+    
+    @Override
+    public List<DataCenterVO> findZonesByDomainId(Long domainId, String keyword){
+    	SearchCriteria<DataCenterVO> sc = ListZonesByDomainIdSearch.create();
+    	sc.setParameters("domainId", domainId);
+    	if (keyword != null) {
+            SearchCriteria<DataCenterVO> ssc = createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+        return listBy(sc);    	
+    }
+    
+    @Override
+    public List<DataCenterVO> findChildZones(Object[] ids, String keyword){
+    	SearchCriteria<DataCenterVO> sc = ChildZonesSearch.create();
+    	sc.setParameters("domainid", ids);
+    	if (keyword != null) {
+            SearchCriteria<DataCenterVO> ssc = createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+        return listBy(sc);  
+    }
+    
+    @Override
+    public List<DataCenterVO> listPublicZones(String keyword){
+    	SearchCriteria<DataCenterVO> sc = PublicZonesSearch.create();
+    	if (keyword != null) {
+            SearchCriteria<DataCenterVO> ssc = createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+    	//sc.setParameters("domainId", domainId);
+        return listBy(sc);    	    	
+    }
+    
+    @Override
+    public List<DataCenterVO> findByKeyword(String keyword){
+    	SearchCriteria<DataCenterVO> ssc = createSearchCriteria();
+    	ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+    	ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+        return listBy(ssc);
+    }
+    
+
+    @Override
+    public String[] getNextAvailableMacAddressPair(long id) {
+        return getNextAvailableMacAddressPair(id, 0);
+    }
+
+    @Override
+    public String[] getNextAvailableMacAddressPair(long id, long mask) {
+        SequenceFetcher fetch = SequenceFetcher.getInstance();
+        
+        long seq = fetch.getNextSequence(Long.class, _tgMacAddress, id);
+        seq = seq | _prefix | ((id & 0x7f) << 32);
+        seq |= mask;
+        seq |= ((_rand.nextInt(Short.MAX_VALUE) << 16) & 0x00000000ffff0000l);
+        String[] pair = new String[2];
+        pair[0] = NetUtils.long2Mac(seq);
+        pair[1] = NetUtils.long2Mac(seq | 0x1l << 39);
+        return pair;
+    }
+
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        if (!super.configure(name, params)) {
+            return false;
+        }
+        
+        String value = (String)params.get("mac.address.prefix");
+        _prefix = (long)NumbersUtil.parseInt(value, 06) << 40;
+
+        return true;
+    }
+    
+    protected DataCenterDaoImpl() {
+        super();
+        NameSearch = createSearchBuilder();
+        NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ);
+        NameSearch.done();
+        
+        ListZonesByDomainIdSearch = createSearchBuilder();
+        ListZonesByDomainIdSearch.and("domainId", ListZonesByDomainIdSearch.entity().getDomainId(), SearchCriteria.Op.EQ);
+        ListZonesByDomainIdSearch.done();
+        
+        PublicZonesSearch = createSearchBuilder();
+        PublicZonesSearch.and("domainId", PublicZonesSearch.entity().getDomainId(), SearchCriteria.Op.NULL);
+        PublicZonesSearch.done();        
+        
+        ChildZonesSearch = createSearchBuilder();
+        ChildZonesSearch.and("domainid", ChildZonesSearch.entity().getDomainId(), SearchCriteria.Op.IN);
+        ChildZonesSearch.done();
+        
+        DisabledZonesSearch = createSearchBuilder();
+        DisabledZonesSearch.and("allocationState", DisabledZonesSearch.entity().getAllocationState(), SearchCriteria.Op.EQ);
+        DisabledZonesSearch.done();
+        
+        TokenSearch = createSearchBuilder();
+        TokenSearch.and("zoneToken", TokenSearch.entity().getZoneToken(), SearchCriteria.Op.EQ);
+        TokenSearch.done();
+        
+        StateChangeSearch = createSearchBuilder();
+        StateChangeSearch.and("id", StateChangeSearch.entity().getId(), SearchCriteria.Op.EQ);
+        StateChangeSearch.and("state", StateChangeSearch.entity().getState(), SearchCriteria.Op.EQ);
+        StateChangeSearch.done();
+        
+        UUIDSearch = createSearchBuilder();
+        UUIDSearch.and("uuid", UUIDSearch.entity().getUuid(), SearchCriteria.Op.EQ);
+        UUIDSearch.done();
+
+        
+        _tgMacAddress = _tgs.get("macAddress");
+        assert _tgMacAddress != null : "Couldn't get mac address table generator";
+    }
+
+    @Override @DB
+    public boolean update(Long zoneId, DataCenterVO zone) {
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        boolean persisted = super.update(zoneId, zone);
+        if (!persisted) {
+            return persisted;
+        }
+        saveDetails(zone);
+        txn.commit();
+        return persisted;
+    }
+    
+    @Override
+    public void loadDetails(DataCenterVO zone) {
+        Map<String, String> details =_detailsDao.findDetails(zone.getId());
+        zone.setDetails(details);
+    }
+
+    @Override
+    public void saveDetails(DataCenterVO zone) {
+        Map<String, String> details = zone.getDetails();
+        if (details == null) {
+            return;
+        }
+        _detailsDao.persist(zone.getId(), details);
+    }
+    
+    @Override
+    public List<DataCenterVO> listDisabledZones(){
+    	SearchCriteria<DataCenterVO> sc = DisabledZonesSearch.create();
+    	sc.setParameters("allocationState", Grouping.AllocationState.Disabled);
+    	
+    	List<DataCenterVO> dcs =  listBy(sc);
+    	
+    	return dcs;
+    }
+    
+    @Override
+    public List<DataCenterVO> listEnabledZones(){
+    	SearchCriteria<DataCenterVO> sc = DisabledZonesSearch.create();
+    	sc.setParameters("allocationState", Grouping.AllocationState.Enabled);
+    	
+    	List<DataCenterVO> dcs =  listBy(sc);
+    	
+    	return dcs;
+    }
+
+    @Override
+    public DataCenterVO findByTokenOrIdOrName(String tokenOrIdOrName) {
+        DataCenterVO result = findByToken(tokenOrIdOrName);
+        if (result == null) {
+            result = findByName(tokenOrIdOrName);
+            if (result == null) {
+                try {
+                    Long dcId = Long.parseLong(tokenOrIdOrName);
+                    return findById(dcId);
+                } catch (NumberFormatException nfe) {
+                    
+                }
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public boolean remove(Long id) {
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        DataCenterVO zone = createForUpdate();
+        zone.setName(null);
+        
+        update(id, zone);
+
+        boolean result = super.remove(id);
+        txn.commit();
+        return result;
+    }
+    
+
+	@Override
+	public boolean updateState(State currentState, Event event, State nextState, DataCenterResourceEntity zoneEntity, Object data) {
+		
+		DataCenterVO vo = findById(zoneEntity.getId());
+		
+		Date oldUpdatedTime = vo.getLastUpdated();
+
+		SearchCriteria<DataCenterVO> sc = StateChangeSearch.create();
+        sc.setParameters("id", vo.getId());
+        sc.setParameters("state", currentState);
+
+        UpdateBuilder builder = getUpdateBuilder(vo);
+        builder.set(vo, "state", nextState);
+        builder.set(vo, "lastUpdated", new Date());
+
+        int rows = update((DataCenterVO) vo, sc);
+        
+        if (rows == 0 && s_logger.isDebugEnabled()) {
+        	DataCenterVO dbDC = findByIdIncludingRemoved(vo.getId());
+            if (dbDC != null) {
+                StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString());
+                str.append(": DB Data={id=").append(dbDC.getId()).append("; state=").append(dbDC.getState()).append(";updatedTime=")
+                        .append(dbDC.getLastUpdated());
+                str.append(": New Data={id=").append(vo.getId()).append("; state=").append(nextState).append("; event=").append(event).append("; updatedTime=").append(vo.getLastUpdated());
+                str.append(": stale Data={id=").append(vo.getId()).append("; state=").append(currentState).append("; event=").append(event).append("; updatedTime=").append(oldUpdatedTime);
+            } else {
+                s_logger.debug("Unable to update dataCenter: id=" + vo.getId() + ", as there is no such dataCenter exists in the database anymore");
+            }
+        }
+        return rows > 0;
+		
+	}
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java
new file mode 100644
index 0000000..ef1b3a0
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java
@@ -0,0 +1,29 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db.dao;
+
+import java.util.Map;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DcDetailVO;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface DcDetailsDao extends GenericDao<DcDetailVO, Long> { 
+    Map<String, String> findDetails(long dcId);
+    
+    void persist(long dcId, Map<String, String> details);
+    
+    DcDetailVO findDetail(long dcId, String name);
+
+	void deleteDetails(long dcId);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
new file mode 100644
index 0000000..4092786
--- /dev/null
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
@@ -0,0 +1,92 @@
+// 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 org.apache.cloudstack.engine.datacenter.entity.api.db.dao;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DcDetailVO;
+
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
+
+@Local(value=DcDetailsDao.class)
+public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implements DcDetailsDao {
+    protected final SearchBuilder<DcDetailVO> DcSearch;
+    protected final SearchBuilder<DcDetailVO> DetailSearch;
+    
+    protected DcDetailsDaoImpl() {
+        DcSearch = createSearchBuilder();
+        DcSearch.and("dcId", DcSearch.entity().getDcId(), SearchCriteria.Op.EQ);
+        DcSearch.done();
+        
+        DetailSearch = createSearchBuilder();
+        DetailSearch.and("dcId", DetailSearch.entity().getDcId(), SearchCriteria.Op.EQ);
+        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
+        DetailSearch.done();
+    }
+
+    @Override
+    public DcDetailVO findDetail(long dcId, String name) {
+        SearchCriteria<DcDetailVO> sc = DetailSearch.create();
+        sc.setParameters("dcId", dcId);
+        sc.setParameters("name", name);
+        
+        return findOneIncludingRemovedBy(sc);
+    }
+
+    @Override
+    public Map<String, String> findDetails(long dcId) {
+        SearchCriteria<DcDetailVO> sc = DcSearch.create();
+        sc.setParameters("dcId", dcId);
+        
+        List<DcDetailVO> results = search(sc, null);
+        Map<String, String> details = new HashMap<String, String>(results.size());
+        for (DcDetailVO result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        return details;
+    }
+    
+    @Override
+    public void deleteDetails(long dcId) {
+        SearchCriteria sc = DcSearch.create();
+        sc.setParameters("dcId", dcId);
+        
+        List<DcDetailVO> results = search(sc, null);
+        for (DcDetailVO result : results) {
+        	remove(result.getId());
+        }
+    }
+
+    @Override
+    public void persist(long dcId, Map<String, String> details) {
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        SearchCriteria<DcDetailVO> sc = DcSearch.create();
+        sc.setParameters("dcId", dcId);
+        expunge(sc);
+        
+        for (Map.Entry<String, String> detail : details.entrySet()) {
+            DcDetailVO vo = new DcDetailVO(dcId, detail.getKey(), detail.getValue());
+            persist(vo);
+        }
+        txn.commit();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/src/org/apache/cloudstack/engine/service/api/ProvisioningServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/service/api/ProvisioningServiceImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/service/api/ProvisioningServiceImpl.java
index 2abceb8..a6dda3a 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/service/api/ProvisioningServiceImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/service/api/ProvisioningServiceImpl.java
@@ -22,21 +22,71 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
 import org.apache.cloudstack.engine.datacenter.entity.api.ClusterEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceManager;
 import org.apache.cloudstack.engine.datacenter.entity.api.PodEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.PodEntityImpl;
 import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.ZoneEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.ZoneEntityImpl;
 import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
 
+import com.cloud.dc.Pod;
 import com.cloud.host.Host;
 import com.cloud.host.Status;
 import com.cloud.storage.StoragePool;
 
-@Component
+
+
+@Service("provisioningService")
+@Path("/provisioning")
 public class ProvisioningServiceImpl implements ProvisioningService {
 
+	
+	@Override
+    public StorageEntity registerStorage(String name, List<String> tags, Map<String, String> details) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public ZoneEntity registerZone(String zoneUuid, String owner, List<String> tags, Map<String, String> details) {
+
+    	ZoneEntityImpl zoneEntity = new ZoneEntityImpl(zoneUuid);
+    	zoneEntity.setOwner(owner);
+    	zoneEntity.setDetails(details);
+    	zoneEntity.setState(State.Disabled);
+    	zoneEntity.persist();
+    	
+    	return zoneEntity;
+    }
+
+  //  @Override
+   // public PodEntity registerPod(String name, List<String> tags, Map<String, String> details) {
+     //   // TODO Auto-generated method stub
+     //   return null;
+    //}
+
+    @Override
+    public ClusterEntity registerCluster(String name, List<String> tags, Map<String, String> details) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String registerHost(String name, List<String> tags, Map<String, String> details) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
     @Override
     public void deregisterStorage(String uuid) {
         // TODO Auto-generated method stub
@@ -90,8 +140,8 @@ public class ProvisioningServiceImpl implements ProvisioningService {
     @Override
     public List<ZoneEntity> listZones() {
         List<ZoneEntity> zones = new ArrayList<ZoneEntity>();
-        zones.add(new ZoneEntityImpl("zone-uuid-1", "name1"));
-        zones.add(new ZoneEntityImpl("zone-uuid-2", "name2"));
+        zones.add(new ZoneEntityImpl("zone-uuid-1"));
+        zones.add(new ZoneEntityImpl("zone-uuid-2"));
         return zones;
     }
 
@@ -103,38 +153,18 @@ public class ProvisioningServiceImpl implements ProvisioningService {
 
     @Override
     public ZoneEntity getZone(String uuid) {
-        ZoneEntityImpl impl = new ZoneEntityImpl(uuid, "name");
+        ZoneEntityImpl impl = new ZoneEntityImpl(uuid);
         return impl;
     }
 
     @Override
-    public StorageEntity registerStorage(String name, List<String> tags, Map<String, String> details) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ZoneEntity registerZone(String name, List<String> tags, Map<String, String> details) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public PodEntity registerPod(String name, List<String> tags, Map<String, String> details) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ClusterEntity registerCluster(String name, List<String> tags, Map<String, String> details) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String registerHost(String name, List<String> tags, Map<String, String> details) {
-        // TODO Auto-generated method stub
-        return null;
-    }
+
+	public PodEntity registerPod(String arg0, Long arg1, String arg2,
+			String arg3, String arg4, String arg5, List<String> arg6,
+			Map<String, String> arg7) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ChildTestConfiguration.java b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ChildTestConfiguration.java
new file mode 100644
index 0000000..a8b2030
--- /dev/null
+++ b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ChildTestConfiguration.java
@@ -0,0 +1,18 @@
+package org.apache.cloudstack.engine.provisioning.test;
+
+
+import org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DataCenterDao;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+
+
+
+
+public class ChildTestConfiguration {
+	
+	@Bean
+	public DataCenterDao dataCenterDao() {
+		return Mockito.mock(DataCenterDao.class);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java
new file mode 100644
index 0000000..a7135fe
--- /dev/null
+++ b/engine/orchestration/test/org/apache/cloudstack/engine/provisioning/test/ProvisioningTest.java
@@ -0,0 +1,61 @@
+/**
+ * 
+ */
+package org.apache.cloudstack.engine.provisioning.test;
+
+import java.util.HashMap;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State;
+import org.apache.cloudstack.engine.datacenter.entity.api.ZoneEntity;
+import org.apache.cloudstack.engine.datacenter.entity.api.db.dao.DataCenterDao;
+import org.apache.cloudstack.engine.service.api.ProvisioningService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import org.apache.cloudstack.engine.datacenter.entity.api.db.DataCenterVO;
+import com.cloud.dc.DataCenter.NetworkType;
+
+import junit.framework.TestCase;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/resource/provisioningContext.xml")
+public class ProvisioningTest extends TestCase {
+	
+	@Inject
+	ProvisioningService service;
+	
+	@Inject
+	DataCenterDao dcDao;
+	
+    @Before
+	public void setUp() {
+    	
+    	DataCenterVO dc = new DataCenterVO(UUID.randomUUID().toString(), "test", "8.8.8.8", null, "10.0.0.1", null,  "10.0.0.1/24", 
+				null, null, NetworkType.Basic, null, null, true,  true);
+    	
+		Mockito.when(dcDao.findById(Mockito.anyLong())).thenReturn(dc);
+		Mockito.when(dcDao.persist((DataCenterVO) Mockito.anyObject())).thenReturn(dc);    	    	
+    }
+
+	private void registerAndEnableZone() {
+		ZoneEntity zone = service.registerZone("47547648", "owner", null, new HashMap<String, String>());
+		State state = zone.getState();
+		System.out.println("state:"+state);
+		boolean result = zone.enable();
+		System.out.println("state:"+zone.getState());
+	}
+
+	@Test
+	public void testProvisioning() {
+		registerAndEnableZone();
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/orchestration/test/resource/provisioningContext.xml
----------------------------------------------------------------------
diff --git a/engine/orchestration/test/resource/provisioningContext.xml b/engine/orchestration/test/resource/provisioningContext.xml
new file mode 100644
index 0000000..a5a9560
--- /dev/null
+++ b/engine/orchestration/test/resource/provisioningContext.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                         http://www.springframework.org/schema/tx 
+       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+       http://www.springframework.org/schema/aop
+       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                                 http://www.springframework.org/schema/context
+                                          http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+  <context:annotation-config />
+  <context:component-scan base-package="org.apache.cloudstack.engine" />
+  
+  <tx:annotation-driven transaction-manager="transactionManager" />
+  <!--  bean id="aopTestBean" class="org.apache.cloudstack.storage.test.AopTestAdvice"/-->
+  <!--  aop:config proxy-target-class="true" >
+    <aop:aspect id="AopTestAdvice" ref="aopTestBean">
+    <aop:pointcut id="aoptest"
+      expression="@annotation(com.cloud.utils.db.DB)" />
+      <aop:around pointcut-ref="aoptest" method="AopTestMethod"/> 
+    </aop:aspect>
+  </aop:config>
+   -->
+   
+  <bean class="org.apache.cloudstack.engine.provisioning.test.ChildTestConfiguration" />
+
+</beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
index 5763496..0ac57f4 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreEntityImpl.java
@@ -100,31 +100,26 @@ public class PrimaryDataStoreEntityImpl implements StorageEntity {
     }
 
     @Override
-    public Map<String, String> getDetails(String source) {
+    public Map<String, String> getDetails() {
         // TODO Auto-generated method stub
         return null;
     }
 
-    @Override
-    public List<String> getDetailSources() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
     @Override
-    public void addDetail(String source, String name, String value) {
+    public void addDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    public void delDetail(String source, String name, String value) {
+    public void delDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    public void updateDetail(String source, String name, String value) {
+    public void updateDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
@@ -246,4 +241,10 @@ public class PrimaryDataStoreEntityImpl implements StorageEntity {
         return null;
     }
 
+	@Override
+	public void persist() {
+		// TODO Auto-generated method stub
+		
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
index 6aacfee..d9eceb3 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
@@ -95,31 +95,26 @@ public class TemplateEntityImpl implements TemplateEntity {
     }
 
     @Override
-    public Map<String, String> getDetails(String source) {
+    public Map<String, String> getDetails() {
         // TODO Auto-generated method stub
         return null;
     }
 
-    @Override
-    public List<String> getDetailSources() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
     @Override
-    public void addDetail(String source, String name, String value) {
+    public void addDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    public void delDetail(String source, String name, String value) {
+    public void delDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    public void updateDetail(String source, String name, String value) {
+    public void updateDetail(String name, String value) {
         // TODO Auto-generated method stub
 
     }
@@ -257,12 +252,6 @@ public class TemplateEntityImpl implements TemplateEntity {
     }
 
     @Override
-    public Map getDetails() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
     public long getAccountId() {
         // TODO Auto-generated method stub
         return 0;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java
index 768f8ec..d57d078 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java
@@ -54,36 +54,6 @@ public class SnapshotEntityImpl implements SnapshotEntity {
 	}
 
 	@Override
-	public Map<String, String> getDetails(String source) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public List<String> getDetailSources() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void addDetail(String source, String name, String value) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void delDetail(String source, String name, String value) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void updateDetail(String source, String name, String value) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
 	public List<Method> getApplicableActions() {
 		// TODO Auto-generated method stub
 		return null;
@@ -179,4 +149,28 @@ public class SnapshotEntityImpl implements SnapshotEntity {
 
 	}
 
+	@Override
+	public Map<String, String> getDetails() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void delDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void updateDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1eb64e61/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
index 1a8d7bd..c3bdf4e 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
@@ -97,36 +97,7 @@ public class VolumeEntityImpl implements VolumeEntity {
         return volumeInfo.getOwner();
     }
 
-    @Override
-    public Map<String, String> getDetails(String source) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public List<String> getDetailSources() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void addDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void delDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void updateDetail(String source, String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
+  
     @Override
     public List<Method> getApplicableActions() {
         // TODO Auto-generated method stub
@@ -253,4 +224,28 @@ public class VolumeEntityImpl implements VolumeEntity {
         return null;
     }
 
+	@Override
+	public Map<String, String> getDetails() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void addDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void delDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void updateDetail(String name, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }