blob: c536bd04697f1c970208fae50e78f9c7ff93240e [file] [log] [blame]
package org.apache.helix.rest.common;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.HashMap;
import java.util.Map;
public class HelixRestNamespace {
public enum HelixMetadataStoreType {
ZOOKEEPER,
NO_METADATA_STORE
}
public enum HelixRestNamespaceProperty {
NAME,
METADATA_STORE_TYPE,
METADATA_STORE_ADDRESS,
IS_DEFAULT,
MULTI_ZK_ENABLED,
MSDS_ENDPOINT
}
/**
* Namespaced object will have path such as /url_prefix/namespaces/{namespace_name}/clusters/...
* We are going to have path /url_prefix/clusters/... point to default namespace if there is one
*/
public static final String DEFAULT_NAMESPACE_PATH_SPEC = "/*";
public static final String DEFAULT_NAMESPACE_NAME = "default";
/**
* Name of Helix namespace
*/
private String _name;
/**
* Type of a metadata store that belongs to Helix namespace
*/
private HelixMetadataStoreType _metadataStoreType;
/**
* Address of metadata store. Should be in the format of
* "[ip-address]:[port]" or "[dns-name]:[port]"
*/
private String _metadataStoreAddress;
/**
* Flag indicating whether this namespace is default or not
*/
private boolean _isDefault;
/**
* Flag indicating whether this namespace should have multi-zk feature enabled.
*/
private boolean _isMultiZkEnabled;
/**
* Endpoint for accessing MSDS for this namespace.
*/
private String _msdsEndpoint;
public HelixRestNamespace(String metadataStoreAddress) throws IllegalArgumentException {
this(DEFAULT_NAMESPACE_NAME, HelixMetadataStoreType.ZOOKEEPER, metadataStoreAddress, true);
}
public HelixRestNamespace(String name, HelixMetadataStoreType metadataStoreType,
String metadataStoreAddress, boolean isDefault) throws IllegalArgumentException {
this(name, metadataStoreType, metadataStoreAddress, isDefault, false, null);
}
public HelixRestNamespace(String name, HelixMetadataStoreType metadataStoreType,
String metadataStoreAddress, boolean isDefault, boolean isMultiZkEnabled,
String msdsEndpoint) {
_name = name;
_metadataStoreAddress = metadataStoreAddress;
_metadataStoreType = metadataStoreType;
_isDefault = isDefault;
_isMultiZkEnabled = isMultiZkEnabled;
_msdsEndpoint = msdsEndpoint;
validate();
}
private void validate() throws IllegalArgumentException {
// TODO: add more strict validation for NAME as this will be part of URL
if (_name == null || _name.length() == 0) {
throw new IllegalArgumentException("Name of namespace not provided");
}
if (_metadataStoreType != HelixMetadataStoreType.NO_METADATA_STORE && (_metadataStoreAddress == null
|| _metadataStoreAddress.isEmpty())) {
throw new IllegalArgumentException(
String.format("Metadata store address \"%s\" is not valid for namespace %s", _metadataStoreAddress, _name));
}
}
public boolean isDefault() {
return _isDefault;
}
public String getName() {
return _name;
}
public String getMetadataStoreAddress() {
return _metadataStoreAddress;
}
public Map<String, String> getRestInfo() {
// In REST APIs we currently don't expose metadata store information
Map<String, String> ret = new HashMap<>();
ret.put(HelixRestNamespaceProperty.NAME.name(), _name);
ret.put(HelixRestNamespaceProperty.IS_DEFAULT.name(), String.valueOf(_isDefault));
ret.put(HelixRestNamespaceProperty.MULTI_ZK_ENABLED.name(), String.valueOf(_isMultiZkEnabled));
ret.put(HelixRestNamespaceProperty.MSDS_ENDPOINT.name(), String.valueOf(_msdsEndpoint));
return ret;
}
public boolean isMultiZkEnabled() {
return _isMultiZkEnabled;
}
public String getMsdsEndpoint() {
return _msdsEndpoint;
}
}