func (p *ClusterService) Create(cluster entity.Cluster, x_auth_token string) (newCluster *entity.Cluster,
	errorCode string, err error) {
	logrus.Infof("start to create cluster [%v]", cluster)

	// do authorize first
	if authorized := GetAuthService().Authorize("create_cluster", x_auth_token, "", p.collectionName); !authorized {
		err = errors.New("required opertion is not authorized!")
		errorCode = COMMON_ERROR_UNAUTHORIZED
		logrus.Errorf("create cluster [%v] error is %v", cluster, err)
		return
	}

	//check cluster name
	if !IsClusterNameValid(cluster.Name) {
		return nil, CLUSTER_ERROR_INVALID_NAME, errors.New("Invalid cluster name.")
	}

	//check userId(must be a objectId at least)
	if !bson.IsObjectIdHex(cluster.UserId) {
		logrus.Errorf("invalid userid [%s],not a object id\n", cluster.Name)
		return nil, COMMON_ERROR_INVALIDATE, errors.New("Invalid userid,not a object id")
	}

	//check if cluster name is unique
	ok, errorCode, err := p.isClusterNameUnique(cluster.UserId, cluster.Name)
	if err != nil {
		return nil, errorCode, err
	}
	if !ok {
		logrus.Errorf("clustername [%s] already exist for user with id [%s]\n", cluster.Name, cluster.UserId)
		return nil, CLUSTER_ERROR_NAME_EXIST, errors.New("Conflict clustername")
	}

	//check instances count
	if cluster.Instances < 5 {
		return nil, CLUSTER_ERROR_INVALID_NUMBER, errors.New("Invalid cluster instances, 5 at least")
	}

	//set cluster type to default
	if cluster.Type == "" {
		cluster.Type = "user"
	}
	if cluster.Type == "user" {
		return p.CreateUserCluster(cluster, x_auth_token)
	} else if cluster.Type == "mgmt" {
		return p.CreateMgmtCluster(cluster, x_auth_token)
	} else {
		return nil, CLUSTER_ERROR_INVALID_TYPE, errors.New("unsupport cluster type, user|mgmt expected")
	}

}