def addInstance(self, clusterName, instanceConfig):
        """
        Returns void
        Parameters:
            clusterName: StringinstanceConfig: InstanceConfig
        @Override


        """
        if not ZKUtil.isClusterSetup(clusterName, _zkClient): 
            raise HelixException("cluster " + clusterName + " is not setup yet")


        # String
        instanceConfigsPath = PropertyPathConfig.getPath(PropertyType.CONFIGS, clusterName, ConfigScopeProperty.PARTICIPANT.toString())
        # String
        nodeId = instanceConfig.getId()
        # String
        instanceConfigPath = instanceConfigsPath + "/" + nodeId
        if _zkClient.exists(instanceConfigPath): 
            raise HelixException("Node " + nodeId + " already exists in cluster " + clusterName)


        ZKUtil.createChildren(_zkClient, instanceConfigsPath, instanceConfig.getRecord())
        _zkClient.createPersistent(HelixUtil.getMessagePath(clusterName, nodeId), True)
        _zkClient.createPersistent(HelixUtil.getCurrentStateBasePath(clusterName, nodeId), True)
        _zkClient.createPersistent(HelixUtil.getErrorsPath(clusterName, nodeId), True)
        _zkClient.createPersistent(HelixUtil.getStatusUpdatesPath(clusterName, nodeId), True)
    def addStateModelDef(self, clusterName, stateModelDef, stateModel):
        """
        Returns void
        Parameters:
            clusterName: StringstateModelDef: StringstateModel: StateModelDefinition
        @Override


        """
        if not ZKUtil.isClusterSetup(clusterName, _zkClient): 
            raise HelixException("cluster " + clusterName + " is not setup yet")


        # String
        stateModelDefPath = HelixUtil.getStateModelDefinitionPath(clusterName)
        # String
        stateModelPath = stateModelDefPath + "/" + stateModelDef
        if _zkClient.exists(stateModelPath): 
            logger.warn("Skip the operation.State Model directory exists:" + stateModelPath)
            raise HelixException("State model path " + stateModelPath + " already exists.")


        # ZKHelixDataAccessor
        accessor = ZKHelixDataAccessor(clusterName, ZkBaseDataAccessor<ZNRecord>(_zkClient))
        # Builder
        keyBuilder = accessor.keyBuilder()
        accessor.setProperty(keyBuilder.stateModelDef(stateModel.getId()), stateModel)
    def dropInstance(self, clusterName, instanceConfig):
        """
        Returns void
        Parameters:
            clusterName: StringinstanceConfig: InstanceConfig
        @Override


        """
        # String
        instanceConfigsPath = PropertyPathConfig.getPath(PropertyType.CONFIGS, clusterName, ConfigScopeProperty.PARTICIPANT.toString())
        # String
        nodeId = instanceConfig.getId()
        # String
        instanceConfigPath = instanceConfigsPath + "/" + nodeId
        # String
        instancePath = HelixUtil.getInstancePath(clusterName, nodeId)
        if not _zkClient.exists(instanceConfigPath): 
            raise HelixException("Node " + nodeId + " does not exist in config for cluster " + clusterName)


        if not _zkClient.exists(instancePath): 
            raise HelixException("Node " + nodeId + " does not exist in instances for cluster " + clusterName)


        ZKUtil.dropChildren(_zkClient, instanceConfigsPath, instanceConfig.getRecord())
        _zkClient.deleteRecursive(instancePath)
    def getStateModelDefs(self, clusterName):
        """
        Returns List<String>
        Parameters:
            clusterName: String
        @Override


        """
        return _zkClient.getChildren(HelixUtil.getStateModelDefinitionPath(clusterName))
    def getResourcesInCluster(self, clusterName):
        """
        Returns List<String>
        Parameters:
            clusterName: String
        @Override


        """
        return _zkClient.getChildren(HelixUtil.getIdealStatePath(clusterName))
    def getInstancesInCluster(self, clusterName):
        """
        Returns List<String>
        Parameters:
            clusterName: String
        @Override


        """
        # String
        memberInstancesPath = HelixUtil.getMemberInstancesPath(clusterName)
        return _zkClient.getChildren(memberInstancesPath)
    def addCluster(self, clusterName, overwritePrevRecord):
        """
        Returns void
        Parameters:
            clusterName: StringoverwritePrevRecord: boolean
        @Override


        """
        # String
        root = "/" + clusterName
        # String
        path = None
        
        if _zkClient.exists(root): 
            logger.warn("Root directory exists.Cleaning the root directory:" + root + " overwritePrevRecord: " + overwritePrevRecord)
            if overwritePrevRecord: 
                _zkClient.deleteRecursive(root)
            else:
                raise HelixException("Cluster " + clusterName + " already exists")



        _zkClient.createPersistent(root)
        _zkClient.createPersistent(HelixUtil.getIdealStatePath(clusterName))
        path = PropertyPathConfig.getPath(PropertyType.CONFIGS, clusterName, ConfigScopeProperty.CLUSTER.toString(), clusterName)
        _zkClient.createPersistent(path, True)
        _zkClient.writeData(path, ZNRecord(clusterName))
        path = PropertyPathConfig.getPath(PropertyType.CONFIGS, clusterName, ConfigScopeProperty.PARTICIPANT.toString())
        _zkClient.createPersistent(path)
        path = PropertyPathConfig.getPath(PropertyType.CONFIGS, clusterName, ConfigScopeProperty.RESOURCE.toString())
        _zkClient.createPersistent(path)
        path = PropertyPathConfig.getPath(PropertyType.PROPERTYSTORE, clusterName)
        _zkClient.createPersistent(path)
        _zkClient.createPersistent(HelixUtil.getLiveInstancesPath(clusterName))
        _zkClient.createPersistent(HelixUtil.getMemberInstancesPath(clusterName))
        _zkClient.createPersistent(HelixUtil.getExternalViewPath(clusterName))
        _zkClient.createPersistent(HelixUtil.getStateModelDefinitionPath(clusterName))
        _zkClient.createPersistent(HelixUtil.getControllerPath(clusterName))
        path = PropertyPathConfig.getPath(PropertyType.HISTORY, clusterName)
        # ZNRecord
        emptyHistory = ZNRecord(PropertyType.HISTORY.toString())
        # List<String>
        emptyList = ArrayList<String>()
        emptyHistory.setListField(clusterName, emptyList)
        _zkClient.createPersistent(path, emptyHistory)
        path = PropertyPathConfig.getPath(PropertyType.MESSAGES_CONTROLLER, clusterName)
        _zkClient.createPersistent(path)
        path = PropertyPathConfig.getPath(PropertyType.STATUSUPDATES_CONTROLLER, clusterName)
        _zkClient.createPersistent(path)
        path = PropertyPathConfig.getPath(PropertyType.ERRORS_CONTROLLER, clusterName)
        _zkClient.createPersistent(path)
        idealState.setNumPartitions(partitions)
        idealState.setStateModelDefRef(stateModelRef)
        idealState.setIdealStateMode(mode.toString())
        idealState.setReplicas("" + 0)
        idealState.setStateModelFactoryName(HelixConstants.DEFAULT_STATE_MODEL_FACTORY)
        if bucketSize > 0: 
            idealState.setBucketSize(bucketSize)

        # String
        stateModelDefPath = PropertyPathConfig.getPath(PropertyType.STATEMODELDEFS, clusterName, stateModelRef)
        if not _zkClient.exists(stateModelDefPath): 
            raise HelixException("State model " + stateModelRef + " not found in the cluster STATEMODELDEFS path")


        # String
        idealStatePath = HelixUtil.getIdealStatePath(clusterName)
        # String
        dbIdealStatePath = idealStatePath + "/" + resourceName
        if _zkClient.exists(dbIdealStatePath): 
            raise HelixException("Skip the operation. DB ideal state directory exists:" + dbIdealStatePath)


        ZKUtil.createChildren(_zkClient, idealStatePath, idealState.getRecord())


    def getClusters(self):
        """
        Returns List<String>
        @Override