This is an automated email from the ASF dual-hosted git repository.
ethanfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/celeborn.git
The following commit(s) were added to refs/heads/main by this push:
new fe01bac27 [CELEBORN-1599] Container Info REST API
fe01bac27 is described below
commit fe01bac276776e7d44b7485ab9bea32f475c2df3
Author: Aravind Patnam <[email protected]>
AuthorDate: Thu Oct 17 17:44:08 2024 +0800
[CELEBORN-1599] Container Info REST API
### What changes were proposed in this pull request?
Adding REST api and cli for container info. User can configure this api to
be based on whichever cluster manager they are using.
### Why are the changes needed?
see above
### Does this PR introduce _any_ user-facing change?
No
### How was this patch tested?
added UTs
Closes #2758 from akpatnam25/CELEBORN-1599.
Authored-by: Aravind Patnam <[email protected]>
Signed-off-by: mingji <[email protected]>
---
.../apache/celeborn/cli/master/MasterOptions.scala | 3 +
.../celeborn/cli/master/MasterSubcommand.scala | 2 +
.../celeborn/cli/master/MasterSubcommandImpl.scala | 3 +
.../apache/celeborn/cli/worker/WorkerOptions.scala | 3 +
.../celeborn/cli/worker/WorkerSubcommand.scala | 2 +
.../celeborn/cli/worker/WorkerSubcommandImpl.scala | 3 +
.../celeborn/cli/TestCelebornCliCommands.scala | 10 +
.../org/apache/celeborn/common/CelebornConf.scala | 11 +
.../common/identity/IdentityProvider.scala | 17 +-
.../org/apache/celeborn/common/util/Utils.scala | 17 ++
.../apache/celeborn/common/util/UtilsSuite.scala | 7 +
docs/configuration/master.md | 1 +
docs/configuration/worker.md | 1 +
.../apache/celeborn/rest/v1/master/DefaultApi.java | 68 +++++
.../celeborn/rest/v1/model/ContainerInfo.java | 336 +++++++++++++++++++++
.../apache/celeborn/rest/v1/worker/DefaultApi.java | 68 +++++
.../src/main/openapi3/master_rest_v1.yaml | 42 +++
.../src/main/openapi3/worker_rest_v1.yaml | 42 +++
.../common/container/ContainerInfoProvider.scala | 43 ++-
.../container/DefaultContainerInfoProvider.scala | 36 +++
.../common/http/api/v1/ApiV1BaseResource.scala | 16 +-
.../common/container/ContainerInfoSuite.scala | 33 ++
.../http/api/v1/ApiV1OpenapiClientSuite.scala | 2 +
.../api/v1/ApiV1WorkerOpenapiClientSuite.scala | 2 +
24 files changed, 729 insertions(+), 39 deletions(-)
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
index 3f4c3d115..d69a2e6bf 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterOptions.scala
@@ -91,6 +91,9 @@ final class MasterOptions {
@Option(names = Array("--show-thread-dump"), description = Array("Show
master thread dump"))
private[master] var showThreadDump: Boolean = _
+ @Option(names = Array("--show-container-info"), description = Array("Show
container info"))
+ private[master] var showContainerInfo: Boolean = _
+
@Option(
names = Array("--add-cluster-alias"),
paramLabel = "alias",
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
index a99cfa575..222650396 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommand.scala
@@ -104,6 +104,8 @@ trait MasterSubcommand extends CliLogging {
private[master] def runShowConf: ConfResponse
+ private[master] def runShowContainerInfo: ContainerInfo
+
private[master] def runShowDynamicConf: DynamicConfigResponse
private[master] def runShowThreadDump: ThreadStackResponse
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
index b9b331e32..32f540f4b 100644
---
a/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
+++
b/cli/src/main/scala/org/apache/celeborn/cli/master/MasterSubcommandImpl.scala
@@ -48,6 +48,7 @@ class MasterSubcommandImpl extends Runnable with
MasterSubcommand {
if (masterOptions.showLifecycleManagers) log(runShowLifecycleManagers)
if (masterOptions.showWorkers) log(runShowWorkers)
if (masterOptions.showConf) log(runShowConf)
+ if (masterOptions.showContainerInfo) log(runShowContainerInfo)
if (masterOptions.showDynamicConf) log(runShowDynamicConf)
if (masterOptions.showThreadDump) log(runShowThreadDump)
if (masterOptions.addClusterAlias != null &&
masterOptions.addClusterAlias.nonEmpty)
@@ -217,4 +218,6 @@ class MasterSubcommandImpl extends Runnable with
MasterSubcommand {
cliConfigManager.remove(aliasToRemove)
logInfo(s"Cluster alias $aliasToRemove removed.")
}
+
+ private[master] def runShowContainerInfo: ContainerInfo =
defaultApi.getContainerInfo
}
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
index 717664a94..baeb695ab 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerOptions.scala
@@ -69,6 +69,9 @@ final class WorkerOptions {
@Option(names = Array("--show-conf"), description = Array("Show worker
conf"))
private[worker] var showConf: Boolean = _
+ @Option(names = Array("--show-container-info"), description = Array("Show
container info"))
+ private[worker] var showContainerInfo: Boolean = _
+
@Option(names = Array("--show-dynamic-conf"), description = Array("Show
dynamic worker conf"))
private[worker] var showDynamicConf: Boolean = _
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
index 517ec802c..bc70f8e01 100644
--- a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
+++ b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommand.scala
@@ -78,6 +78,8 @@ trait WorkerSubcommand extends CliLogging {
private[worker] def runShowConf: ConfResponse
+ private[worker] def runShowContainerInfo: ContainerInfo
+
private[worker] def runShowDynamicConf: DynamicConfigResponse
private[worker] def runShowThreadDump: ThreadStackResponse
diff --git
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
index 62289c35f..214e009a4 100644
---
a/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
+++
b/cli/src/main/scala/org/apache/celeborn/cli/worker/WorkerSubcommandImpl.scala
@@ -37,6 +37,7 @@ class WorkerSubcommandImpl extends Runnable with
WorkerSubcommand {
if (workerOptions.isRegistered) log(runIsRegistered)
if (workerOptions.exitType != null && workerOptions.exitType.nonEmpty)
log(runExit)
if (workerOptions.showConf) log(runShowConf)
+ if (workerOptions.showContainerInfo) log(runShowContainerInfo)
if (workerOptions.showDynamicConf) log(runShowDynamicConf)
if (workerOptions.showThreadDump) log(runShowThreadDump)
}
@@ -78,4 +79,6 @@ class WorkerSubcommandImpl extends Runnable with
WorkerSubcommand {
commonOptions.configName)
private[worker] def runShowThreadDump: ThreadStackResponse =
defaultApi.getThreadDump
+
+ private[worker] def runShowContainerInfo: ContainerInfo =
defaultApi.getContainerInfo
}
diff --git
a/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
b/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
index 4c529679d..56b4ea213 100644
--- a/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
+++ b/cli/src/test/scala/org/apache/celeborn/cli/TestCelebornCliCommands.scala
@@ -119,6 +119,11 @@ class TestCelebornCliCommands extends CelebornFunSuite
with MiniClusterFeature {
captureOutputAndValidateResponse(args, "ConfResponse")
}
+ test("worker --show-container-info") {
+ val args = prepareWorkerArgs() :+ "--show-container-info"
+ captureOutputAndValidateResponse(args, "ContainerInfo")
+ }
+
test("worker --show-dynamic-conf") {
cancel("This test is temporarily disabled since dynamic conf is not
enabled in unit tests.")
val args = prepareWorkerArgs() :+ "--show-dynamic-conf"
@@ -196,6 +201,11 @@ class TestCelebornCliCommands extends CelebornFunSuite
with MiniClusterFeature {
captureOutputAndValidateResponse(args, "ConfResponse")
}
+ test("master --show-container-info") {
+ val args = prepareMasterArgs() :+ "--show-container-info"
+ captureOutputAndValidateResponse(args, "ContainerInfo")
+ }
+
test("master --show-dynamic-conf") {
cancel("This test is temporarily disabled since dynamic conf is not
enabled in unit tests.")
val args = prepareMasterArgs() :+ "--show-dynamic-conf"
diff --git
a/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
b/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
index ee33e26e6..731e18d46 100644
--- a/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
+++ b/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
@@ -1482,6 +1482,8 @@ class CelebornConf(loadDefaults: Boolean) extends
Cloneable with Logging with Se
def logCelebornConfEnabled = get(LOG_CELEBORN_CONF_ENABLED)
def secretRedactionPattern = get(SECRET_REDACTION_PATTERN)
+
+ def containerInfoProviderClass = get(CONTAINER_INFO_PROVIDER)
}
object CelebornConf extends Logging {
@@ -5246,6 +5248,15 @@ object CelebornConf extends Logging {
.stringConf
.createWithDefault(classOf[DefaultIdentityProvider].getName)
+ val CONTAINER_INFO_PROVIDER: ConfigEntry[String] =
+ buildConf("celeborn.container.info.provider")
+ .categories("master", "worker")
+ .doc(s"ContainerInfoProvider class name. Default class is " +
+
s"`org.apache.celeborn.server.common.container.DefaultContainerInfoProvider`. ")
+ .version("0.6.0")
+ .stringConf
+
.createWithDefault("org.apache.celeborn.server.common.container.DefaultContainerInfoProvider")
+
val QUOTA_USER_SPECIFIC_TENANT: ConfigEntry[String] =
buildConf("celeborn.quota.identity.user-specific.tenant")
.categories("quota", "client")
diff --git
a/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
b/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
index a59a287a0..f734ffffe 100644
---
a/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
+++
b/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
@@ -19,6 +19,7 @@ package org.apache.celeborn.common.identity
import org.apache.celeborn.common.CelebornConf
import org.apache.celeborn.common.internal.Logging
+import org.apache.celeborn.common.util.Utils
abstract class IdentityProvider {
def provide(): UserIdentifier
@@ -29,20 +30,6 @@ object IdentityProvider extends Logging {
val DEFAULT_USERNAME = "default"
def instantiate(conf: CelebornConf): IdentityProvider = {
- val className = conf.quotaIdentityProviderClass
- logDebug(s"Creating identity provider $className")
- val clazz = Class.forName(
- className,
- true,
-
Thread.currentThread().getContextClassLoader).asInstanceOf[Class[IdentityProvider]]
- try {
- val ctor = clazz.getDeclaredConstructor()
- logDebug("Using (String, String, Boolean) constructor")
- ctor.newInstance()
- } catch {
- case e: NoSuchMethodException =>
- logError(s"Falling to instantiate identity provider $className", e)
- throw e
- }
+ Utils.instantiate[IdentityProvider](conf.quotaIdentityProviderClass)
}
}
diff --git a/common/src/main/scala/org/apache/celeborn/common/util/Utils.scala
b/common/src/main/scala/org/apache/celeborn/common/util/Utils.scala
index 1f36fd0e4..39c6d9a06 100644
--- a/common/src/main/scala/org/apache/celeborn/common/util/Utils.scala
+++ b/common/src/main/scala/org/apache/celeborn/common/util/Utils.scala
@@ -1305,4 +1305,21 @@ object Utils extends Logging {
(key, value)
}.asInstanceOf[Seq[(K, V)]]
}
+
+ def instantiate[T](className: String)(implicit tag:
scala.reflect.ClassTag[T]): T = {
+ logDebug(s"Creating instance of $className")
+ val clazz = Class.forName(
+ className,
+ true,
+ Thread.currentThread().getContextClassLoader).asInstanceOf[Class[T]]
+ try {
+ val ctor = clazz.getDeclaredConstructor()
+ logDebug("Using no-arg constructor")
+ ctor.newInstance()
+ } catch {
+ case e: NoSuchMethodException =>
+ logError(s"Failed to instantiate class $className", e)
+ throw e
+ }
+ }
}
diff --git
a/common/src/test/scala/org/apache/celeborn/common/util/UtilsSuite.scala
b/common/src/test/scala/org/apache/celeborn/common/util/UtilsSuite.scala
index 2b59344c9..2c0000fd9 100644
--- a/common/src/test/scala/org/apache/celeborn/common/util/UtilsSuite.scala
+++ b/common/src/test/scala/org/apache/celeborn/common/util/UtilsSuite.scala
@@ -23,6 +23,7 @@ import org.apache.celeborn.CelebornFunSuite
import org.apache.celeborn.common.CelebornConf
import org.apache.celeborn.common.client.{MasterEndpointResolver,
StaticMasterEndpointResolver}
import org.apache.celeborn.common.exception.CelebornException
+import org.apache.celeborn.common.identity.DefaultIdentityProvider
import org.apache.celeborn.common.protocol.{PartitionLocation,
TransportModuleConstants}
import
org.apache.celeborn.common.protocol.message.ControlMessages.{GetReducerFileGroupResponse,
MapperEnd}
import org.apache.celeborn.common.protocol.message.StatusCode
@@ -244,4 +245,10 @@ class UtilsSuite extends CelebornFunSuite {
}
partitionSet
}
+
+ test("test instantiate") {
+ val celebornConf = new CelebornConf()
+
assert(Utils.instantiate[DefaultIdentityProvider](celebornConf.quotaIdentityProviderClass)
+ .isInstanceOf[DefaultIdentityProvider])
+ }
}
diff --git a/docs/configuration/master.md b/docs/configuration/master.md
index 6e98b6024..c9f68f21e 100644
--- a/docs/configuration/master.md
+++ b/docs/configuration/master.md
@@ -20,6 +20,7 @@ license: |
| Key | Default | isDynamic | Description | Since | Deprecated |
| --- | ------- | --------- | ----------- | ----- | ---------- |
| celeborn.cluster.name | default | false | Celeborn cluster name. | 0.5.0 |
|
+| celeborn.container.info.provider |
org.apache.celeborn.server.common.container.DefaultContainerInfoProvider |
false | ContainerInfoProvider class name. Default class is
`org.apache.celeborn.server.common.container.DefaultContainerInfoProvider`. |
0.6.0 | |
| celeborn.dynamicConfig.refresh.interval | 120s | false | Interval for
refreshing the corresponding dynamic config periodically. | 0.4.0 | |
| celeborn.dynamicConfig.store.backend | <undefined> | false | Store
backend for dynamic config service. The store backend can be specified in two
ways: - Using the short name of the store backend defined in the implementation
of `ConfigStore#getName` whose return value can be mapped to the corresponding
backend implementation. Available options: FS, DB. - Using the service class
name of the store backend implementation.If not provided, it means that dynamic
configuration is disabl [...]
| celeborn.dynamicConfig.store.db.fetch.pageSize | 1000 | false | The page
size for db store to query configurations. | 0.5.0 | |
diff --git a/docs/configuration/worker.md b/docs/configuration/worker.md
index 1e204a67b..bd03a83de 100644
--- a/docs/configuration/worker.md
+++ b/docs/configuration/worker.md
@@ -20,6 +20,7 @@ license: |
| Key | Default | isDynamic | Description | Since | Deprecated |
| --- | ------- | --------- | ----------- | ----- | ---------- |
| celeborn.cluster.name | default | false | Celeborn cluster name. | 0.5.0 |
|
+| celeborn.container.info.provider |
org.apache.celeborn.server.common.container.DefaultContainerInfoProvider |
false | ContainerInfoProvider class name. Default class is
`org.apache.celeborn.server.common.container.DefaultContainerInfoProvider`. |
0.6.0 | |
| celeborn.dynamicConfig.refresh.interval | 120s | false | Interval for
refreshing the corresponding dynamic config periodically. | 0.4.0 | |
| celeborn.dynamicConfig.store.backend | <undefined> | false | Store
backend for dynamic config service. The store backend can be specified in two
ways: - Using the short name of the store backend defined in the implementation
of `ConfigStore#getName` whose return value can be mapped to the corresponding
backend implementation. Available options: FS, DB. - Using the service class
name of the store backend implementation.If not provided, it means that dynamic
configuration is disabl [...]
| celeborn.dynamicConfig.store.db.fetch.pageSize | 1000 | false | The page
size for db store to query configurations. | 0.5.0 | |
diff --git
a/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/master/DefaultApi.java
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/master/DefaultApi.java
index cfc6d06ff..48c0caca2 100644
---
a/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/master/DefaultApi.java
+++
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/master/DefaultApi.java
@@ -25,6 +25,7 @@ import org.apache.celeborn.rest.v1.master.invoker.BaseApi;
import org.apache.celeborn.rest.v1.master.invoker.Configuration;
import org.apache.celeborn.rest.v1.master.invoker.Pair;
+import org.apache.celeborn.rest.v1.model.ContainerInfo;
import org.apache.celeborn.rest.v1.model.ThreadStackResponse;
@@ -46,6 +47,73 @@ public class DefaultApi extends BaseApi {
super(apiClient);
}
+ /**
+ *
+ * List the container info that the Master or Worker is running on.
+ * @return ContainerInfo
+ * @throws ApiException if fails to make API call
+ */
+ public ContainerInfo getContainerInfo() throws ApiException {
+ return this.getContainerInfo(Collections.emptyMap());
+ }
+
+
+ /**
+ *
+ * List the container info that the Master or Worker is running on.
+ * @param additionalHeaders additionalHeaders for this call
+ * @return ContainerInfo
+ * @throws ApiException if fails to make API call
+ */
+ public ContainerInfo getContainerInfo(Map<String, String> additionalHeaders)
throws ApiException {
+ Object localVarPostBody = null;
+
+ // create path and map variables
+ String localVarPath = "/api/v1/container_info";
+
+ StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ List<Pair> localVarQueryParams = new ArrayList<Pair>();
+ List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+ Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+ Map<String, String> localVarCookieParams = new HashMap<String, String>();
+ Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+
+ localVarHeaderParams.putAll(additionalHeaders);
+
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept =
apiClient.selectHeaderAccept(localVarAccepts);
+
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType =
apiClient.selectHeaderContentType(localVarContentTypes);
+
+ String[] localVarAuthNames = new String[] { "basic" };
+
+ TypeReference<ContainerInfo> localVarReturnType = new
TypeReference<ContainerInfo>() {};
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarCookieParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarAuthNames,
+ localVarReturnType
+ );
+ }
+
/**
*
* List the current thread dump.
diff --git
a/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/model/ContainerInfo.java
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/model/ContainerInfo.java
new file mode 100644
index 000000000..e1ef4fb8c
--- /dev/null
+++
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/model/ContainerInfo.java
@@ -0,0 +1,336 @@
+/*
+ * 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.
+ */
+
+
+package org.apache.celeborn.rest.v1.model;
+
+import java.util.Objects;
+import java.util.Arrays;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+/**
+ * ContainerInfo
+ */
+@JsonPropertyOrder({
+ ContainerInfo.JSON_PROPERTY_CONTAINER_NAME,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_ADDRESS,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_HOST_NAME,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_DATA_CENTER,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_AVAILABILITY_ZONE,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_USER,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_CLUSTER,
+ ContainerInfo.JSON_PROPERTY_CONTAINER_TAGS
+})
[email protected](value =
"org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator
version: 7.7.0")
+public class ContainerInfo {
+ public static final String JSON_PROPERTY_CONTAINER_NAME = "containerName";
+ private String containerName;
+
+ public static final String JSON_PROPERTY_CONTAINER_ADDRESS =
"containerAddress";
+ private String containerAddress;
+
+ public static final String JSON_PROPERTY_CONTAINER_HOST_NAME =
"containerHostName";
+ private String containerHostName;
+
+ public static final String JSON_PROPERTY_CONTAINER_DATA_CENTER =
"containerDataCenter";
+ private String containerDataCenter;
+
+ public static final String JSON_PROPERTY_CONTAINER_AVAILABILITY_ZONE =
"containerAvailabilityZone";
+ private String containerAvailabilityZone;
+
+ public static final String JSON_PROPERTY_CONTAINER_USER = "containerUser";
+ private String containerUser;
+
+ public static final String JSON_PROPERTY_CONTAINER_CLUSTER =
"containerCluster";
+ private String containerCluster;
+
+ public static final String JSON_PROPERTY_CONTAINER_TAGS = "containerTags";
+ private List<String> containerTags = new ArrayList<>();
+
+ public ContainerInfo() {
+ }
+
+ public ContainerInfo containerName(String containerName) {
+
+ this.containerName = containerName;
+ return this;
+ }
+
+ /**
+ * The name of the container.
+ * @return containerName
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_NAME)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerName() {
+ return containerName;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_NAME)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerName(String containerName) {
+ this.containerName = containerName;
+ }
+
+ public ContainerInfo containerAddress(String containerAddress) {
+
+ this.containerAddress = containerAddress;
+ return this;
+ }
+
+ /**
+ * The IP address of the container.
+ * @return containerAddress
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_ADDRESS)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerAddress() {
+ return containerAddress;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_ADDRESS)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerAddress(String containerAddress) {
+ this.containerAddress = containerAddress;
+ }
+
+ public ContainerInfo containerHostName(String containerHostName) {
+
+ this.containerHostName = containerHostName;
+ return this;
+ }
+
+ /**
+ * The hostname of the container.
+ * @return containerHostName
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_HOST_NAME)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerHostName() {
+ return containerHostName;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_HOST_NAME)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerHostName(String containerHostName) {
+ this.containerHostName = containerHostName;
+ }
+
+ public ContainerInfo containerDataCenter(String containerDataCenter) {
+
+ this.containerDataCenter = containerDataCenter;
+ return this;
+ }
+
+ /**
+ * The datacenter of the container.
+ * @return containerDataCenter
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_DATA_CENTER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerDataCenter() {
+ return containerDataCenter;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_DATA_CENTER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerDataCenter(String containerDataCenter) {
+ this.containerDataCenter = containerDataCenter;
+ }
+
+ public ContainerInfo containerAvailabilityZone(String
containerAvailabilityZone) {
+
+ this.containerAvailabilityZone = containerAvailabilityZone;
+ return this;
+ }
+
+ /**
+ * The availability zone of the container.
+ * @return containerAvailabilityZone
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_AVAILABILITY_ZONE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerAvailabilityZone() {
+ return containerAvailabilityZone;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_AVAILABILITY_ZONE)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerAvailabilityZone(String containerAvailabilityZone) {
+ this.containerAvailabilityZone = containerAvailabilityZone;
+ }
+
+ public ContainerInfo containerUser(String containerUser) {
+
+ this.containerUser = containerUser;
+ return this;
+ }
+
+ /**
+ * The user of the container.
+ * @return containerUser
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_USER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerUser() {
+ return containerUser;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_USER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerUser(String containerUser) {
+ this.containerUser = containerUser;
+ }
+
+ public ContainerInfo containerCluster(String containerCluster) {
+
+ this.containerCluster = containerCluster;
+ return this;
+ }
+
+ /**
+ * The cluster that the container is part of.
+ * @return containerCluster
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_CLUSTER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public String getContainerCluster() {
+ return containerCluster;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_CLUSTER)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerCluster(String containerCluster) {
+ this.containerCluster = containerCluster;
+ }
+
+ public ContainerInfo containerTags(List<String> containerTags) {
+
+ this.containerTags = containerTags;
+ return this;
+ }
+
+ public ContainerInfo addContainerTagsItem(String containerTagsItem) {
+ if (this.containerTags == null) {
+ this.containerTags = new ArrayList<>();
+ }
+ this.containerTags.add(containerTagsItem);
+ return this;
+ }
+
+ /**
+ * The tags applied to this container if any.
+ * @return containerTags
+ */
+ @javax.annotation.Nullable
+ @JsonProperty(JSON_PROPERTY_CONTAINER_TAGS)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+ public List<String> getContainerTags() {
+ return containerTags;
+ }
+
+
+ @JsonProperty(JSON_PROPERTY_CONTAINER_TAGS)
+ @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+ public void setContainerTags(List<String> containerTags) {
+ this.containerTags = containerTags;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ContainerInfo containerInfo = (ContainerInfo) o;
+ return Objects.equals(this.containerName, containerInfo.containerName) &&
+ Objects.equals(this.containerAddress, containerInfo.containerAddress)
&&
+ Objects.equals(this.containerHostName,
containerInfo.containerHostName) &&
+ Objects.equals(this.containerDataCenter,
containerInfo.containerDataCenter) &&
+ Objects.equals(this.containerAvailabilityZone,
containerInfo.containerAvailabilityZone) &&
+ Objects.equals(this.containerUser, containerInfo.containerUser) &&
+ Objects.equals(this.containerCluster, containerInfo.containerCluster)
&&
+ Objects.equals(this.containerTags, containerInfo.containerTags);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(containerName, containerAddress, containerHostName,
containerDataCenter, containerAvailabilityZone, containerUser,
containerCluster, containerTags);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ContainerInfo {\n");
+ sb.append(" containerName:
").append(toIndentedString(containerName)).append("\n");
+ sb.append(" containerAddress:
").append(toIndentedString(containerAddress)).append("\n");
+ sb.append(" containerHostName:
").append(toIndentedString(containerHostName)).append("\n");
+ sb.append(" containerDataCenter:
").append(toIndentedString(containerDataCenter)).append("\n");
+ sb.append(" containerAvailabilityZone:
").append(toIndentedString(containerAvailabilityZone)).append("\n");
+ sb.append(" containerUser:
").append(toIndentedString(containerUser)).append("\n");
+ sb.append(" containerCluster:
").append(toIndentedString(containerCluster)).append("\n");
+ sb.append(" containerTags:
").append(toIndentedString(containerTags)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+}
+
diff --git
a/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/worker/DefaultApi.java
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/worker/DefaultApi.java
index b774be49f..a361100af 100644
---
a/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/worker/DefaultApi.java
+++
b/openapi/openapi-client/src/main/java/org/apache/celeborn/rest/v1/worker/DefaultApi.java
@@ -25,6 +25,7 @@ import org.apache.celeborn.rest.v1.worker.invoker.BaseApi;
import org.apache.celeborn.rest.v1.worker.invoker.Configuration;
import org.apache.celeborn.rest.v1.worker.invoker.Pair;
+import org.apache.celeborn.rest.v1.model.ContainerInfo;
import org.apache.celeborn.rest.v1.model.ThreadStackResponse;
@@ -46,6 +47,73 @@ public class DefaultApi extends BaseApi {
super(apiClient);
}
+ /**
+ *
+ * List the container info that the Master or Worker is running on.
+ * @return ContainerInfo
+ * @throws ApiException if fails to make API call
+ */
+ public ContainerInfo getContainerInfo() throws ApiException {
+ return this.getContainerInfo(Collections.emptyMap());
+ }
+
+
+ /**
+ *
+ * List the container info that the Master or Worker is running on.
+ * @param additionalHeaders additionalHeaders for this call
+ * @return ContainerInfo
+ * @throws ApiException if fails to make API call
+ */
+ public ContainerInfo getContainerInfo(Map<String, String> additionalHeaders)
throws ApiException {
+ Object localVarPostBody = null;
+
+ // create path and map variables
+ String localVarPath = "/api/v1/container_info";
+
+ StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+ String localVarQueryParameterBaseName;
+ List<Pair> localVarQueryParams = new ArrayList<Pair>();
+ List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+ Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+ Map<String, String> localVarCookieParams = new HashMap<String, String>();
+ Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+
+ localVarHeaderParams.putAll(additionalHeaders);
+
+
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept =
apiClient.selectHeaderAccept(localVarAccepts);
+
+ final String[] localVarContentTypes = {
+
+ };
+ final String localVarContentType =
apiClient.selectHeaderContentType(localVarContentTypes);
+
+ String[] localVarAuthNames = new String[] { "basic" };
+
+ TypeReference<ContainerInfo> localVarReturnType = new
TypeReference<ContainerInfo>() {};
+ return apiClient.invokeAPI(
+ localVarPath,
+ "GET",
+ localVarQueryParams,
+ localVarCollectionQueryParams,
+ localVarQueryStringJoiner.toString(),
+ localVarPostBody,
+ localVarHeaderParams,
+ localVarCookieParams,
+ localVarFormParams,
+ localVarAccept,
+ localVarContentType,
+ localVarAuthNames,
+ localVarReturnType
+ );
+ }
+
/**
*
* List the current thread dump.
diff --git a/openapi/openapi-client/src/main/openapi3/master_rest_v1.yaml
b/openapi/openapi-client/src/main/openapi3/master_rest_v1.yaml
index e449fe97d..7c8d5cd67 100644
--- a/openapi/openapi-client/src/main/openapi3/master_rest_v1.yaml
+++ b/openapi/openapi-client/src/main/openapi3/master_rest_v1.yaml
@@ -41,6 +41,18 @@ paths:
schema:
$ref: '#/components/schemas/ConfResponse'
+ /api/v1/container_info:
+ get:
+ operationId: getContainerInfo
+ description: List the container info that the Master or Worker is
running on.
+ responses:
+ "200":
+ description: The request was successful.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ContainerInfo'
+
/api/v1/conf/dynamic:
get:
tags:
@@ -590,6 +602,36 @@ components:
- id
- address
+ ContainerInfo:
+ type: object
+ properties:
+ containerName:
+ type: string
+ description: The name of the container.
+ containerAddress:
+ type: string
+ description: The IP address of the container.
+ containerHostName:
+ type: string
+ description: The hostname of the container.
+ containerDataCenter:
+ type: string
+ description: The datacenter of the container.
+ containerAvailabilityZone:
+ type: string
+ description: The availability zone of the container.
+ containerUser:
+ type: string
+ description: The user of the container.
+ containerCluster:
+ type: string
+ description: The cluster that the container is part of.
+ containerTags:
+ type: array
+ description: The tags applied to this container if any.
+ items:
+ type: string
+
MasterCommitData:
type: object
properties:
diff --git a/openapi/openapi-client/src/main/openapi3/worker_rest_v1.yaml
b/openapi/openapi-client/src/main/openapi3/worker_rest_v1.yaml
index 29bd2865d..f2c82ab0a 100644
--- a/openapi/openapi-client/src/main/openapi3/worker_rest_v1.yaml
+++ b/openapi/openapi-client/src/main/openapi3/worker_rest_v1.yaml
@@ -41,6 +41,18 @@ paths:
schema:
$ref: '#/components/schemas/ConfResponse'
+ /api/v1/container_info:
+ get:
+ operationId: getContainerInfo
+ description: List the container info that the Master or Worker is
running on.
+ responses:
+ "200":
+ description: The request was successful.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ContainerInfo'
+
/api/v1/conf/dynamic:
get:
tags:
@@ -428,6 +440,36 @@ components:
- isShutdown
- isDecommissioning
+ ContainerInfo:
+ type: object
+ properties:
+ containerName:
+ type: string
+ description: The name of the container.
+ containerAddress:
+ type: string
+ description: The IP address of the container.
+ containerHostName:
+ type: string
+ description: The hostname of the container.
+ containerDataCenter:
+ type: string
+ description: The datacenter of the container.
+ containerAvailabilityZone:
+ type: string
+ description: The availability zone of the container.
+ containerUser:
+ type: string
+ description: The user of the container.
+ containerCluster:
+ type: string
+ description: The cluster that the container is part of.
+ containerTags:
+ type: array
+ description: The tags applied to this container if any.
+ items:
+ type: string
+
WorkerData:
type: object
properties:
diff --git
a/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
b/service/src/main/scala/org/apache/celeborn/server/common/container/ContainerInfoProvider.scala
similarity index 52%
copy from
common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
copy to
service/src/main/scala/org/apache/celeborn/server/common/container/ContainerInfoProvider.scala
index a59a287a0..feebc9bc5 100644
---
a/common/src/main/scala/org/apache/celeborn/common/identity/IdentityProvider.scala
+++
b/service/src/main/scala/org/apache/celeborn/server/common/container/ContainerInfoProvider.scala
@@ -15,34 +15,31 @@
* limitations under the License.
*/
-package org.apache.celeborn.common.identity
+package org.apache.celeborn.server.common.container
+
+import scala.collection.JavaConverters._
import org.apache.celeborn.common.CelebornConf
import org.apache.celeborn.common.internal.Logging
+import org.apache.celeborn.common.util.Utils
+import org.apache.celeborn.rest.v1.model.ContainerInfo
+
+abstract class ContainerInfoProvider {
+
+ def getContainerInfo(): ContainerInfo
-abstract class IdentityProvider {
- def provide(): UserIdentifier
}
-object IdentityProvider extends Logging {
- val DEFAULT_TENANT_ID = "default"
- val DEFAULT_USERNAME = "default"
-
- def instantiate(conf: CelebornConf): IdentityProvider = {
- val className = conf.quotaIdentityProviderClass
- logDebug(s"Creating identity provider $className")
- val clazz = Class.forName(
- className,
- true,
-
Thread.currentThread().getContextClassLoader).asInstanceOf[Class[IdentityProvider]]
- try {
- val ctor = clazz.getDeclaredConstructor()
- logDebug("Using (String, String, Boolean) constructor")
- ctor.newInstance()
- } catch {
- case e: NoSuchMethodException =>
- logError(s"Falling to instantiate identity provider $className", e)
- throw e
- }
+object ContainerInfoProvider extends Logging {
+
+ val DEFAULT_CONTAINER_NAME = "default_container_name"
+ val DEFAULT_CONTAINER_DATA_CENTER = "default_container_data_center"
+ val DEFAULT_CONTAINER_AVAILABILITY_ZONE =
"default_container_availability_zone"
+ val DEFAULT_CONTAINER_CLUSTER = "default_container_cluster"
+ val DEFAULT_CONTAINER_TAGS = List.empty[String].asJava
+
+ def instantiate(conf: CelebornConf): ContainerInfoProvider = {
+ Utils.instantiate(conf.containerInfoProviderClass)
}
+
}
diff --git
a/service/src/main/scala/org/apache/celeborn/server/common/container/DefaultContainerInfoProvider.scala
b/service/src/main/scala/org/apache/celeborn/server/common/container/DefaultContainerInfoProvider.scala
new file mode 100644
index 000000000..6602a9ff8
--- /dev/null
+++
b/service/src/main/scala/org/apache/celeborn/server/common/container/DefaultContainerInfoProvider.scala
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+package org.apache.celeborn.server.common.container
+
+import org.apache.celeborn.common.util.Utils
+import org.apache.celeborn.rest.v1.model.ContainerInfo
+
+class DefaultContainerInfoProvider extends ContainerInfoProvider {
+
+ override def getContainerInfo(): ContainerInfo = {
+ new ContainerInfo()
+ .containerName(ContainerInfoProvider.DEFAULT_CONTAINER_NAME)
+ .containerHostName(Utils.getHostName(preferIP = false))
+ .containerAddress(Utils.getHostName(preferIP = true))
+ .containerDataCenter(ContainerInfoProvider.DEFAULT_CONTAINER_DATA_CENTER)
+
.containerAvailabilityZone(ContainerInfoProvider.DEFAULT_CONTAINER_AVAILABILITY_ZONE)
+ .containerUser(System.getProperty("user.name"))
+ .containerCluster(ContainerInfoProvider.DEFAULT_CONTAINER_CLUSTER)
+ .containerTags(ContainerInfoProvider.DEFAULT_CONTAINER_TAGS)
+ }
+}
diff --git
a/service/src/main/scala/org/apache/celeborn/server/common/http/api/v1/ApiV1BaseResource.scala
b/service/src/main/scala/org/apache/celeborn/server/common/http/api/v1/ApiV1BaseResource.scala
index 0de003425..3b91ebd0f 100644
---
a/service/src/main/scala/org/apache/celeborn/server/common/http/api/v1/ApiV1BaseResource.scala
+++
b/service/src/main/scala/org/apache/celeborn/server/common/http/api/v1/ApiV1BaseResource.scala
@@ -26,7 +26,8 @@ import io.swagger.v3.oas.annotations.media.{Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
import org.apache.celeborn.common.util.Utils
-import org.apache.celeborn.rest.v1.model.{ThreadStack, ThreadStackResponse}
+import org.apache.celeborn.rest.v1.model.{ContainerInfo, ThreadStack,
ThreadStackResponse}
+import org.apache.celeborn.server.common.container.ContainerInfoProvider
import org.apache.celeborn.server.common.http.api.ApiRequestContext
@Path("/api/v1")
@@ -58,4 +59,17 @@ class ApiV1BaseResource extends ApiRequestContext {
.holdingLocks(threadStack.holdingLocks.asJava)
}.asJava)
}
+
+ @Path("/container_info")
+ @ApiResponse(
+ responseCode = "200",
+ content = Array(new Content(
+ mediaType = MediaType.APPLICATION_JSON,
+ schema = new Schema(
+ implementation = classOf[ContainerInfo]))),
+ description = "List the container info.")
+ @GET
+ @Produces(Array(MediaType.APPLICATION_JSON))
+ def containerInfo(): ContainerInfo =
+ ContainerInfoProvider.instantiate(httpService.conf).getContainerInfo()
}
diff --git
a/service/src/test/scala/org/apache/celeborn/server/common/container/ContainerInfoSuite.scala
b/service/src/test/scala/org/apache/celeborn/server/common/container/ContainerInfoSuite.scala
new file mode 100644
index 000000000..76a375f8c
--- /dev/null
+++
b/service/src/test/scala/org/apache/celeborn/server/common/container/ContainerInfoSuite.scala
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+package org.apache.celeborn.server.common.container
+
+import org.apache.celeborn.CelebornFunSuite
+import org.apache.celeborn.common.CelebornConf
+import org.apache.celeborn.common.util.Utils
+
+class ContainerInfoSuite extends CelebornFunSuite {
+
+ test("test DefaultContainerInfoProvider") {
+ val conf = new CelebornConf
+ val defaultContainerInfo =
ContainerInfoProvider.instantiate(conf).getContainerInfo()
+ assert(defaultContainerInfo.getContainerHostName ==
Utils.getHostName(false))
+ assert(defaultContainerInfo.getContainerAddress == Utils.getHostName(true))
+ assert(defaultContainerInfo.getContainerUser ==
System.getProperty("user.name"))
+ }
+}
diff --git
a/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1OpenapiClientSuite.scala
b/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1OpenapiClientSuite.scala
index 1557f388a..cab8130c0 100644
---
a/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1OpenapiClientSuite.scala
+++
b/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1OpenapiClientSuite.scala
@@ -36,6 +36,8 @@ class ApiV1OpenapiClientSuite extends
ApiV1WorkerOpenapiClientSuite {
test("master: default api") {
val api = new DefaultApi(masterApiClient)
assert(!api.getThreadDump.getThreadStacks.isEmpty)
+ assert(
+ api.getContainerInfo.getContainerAddress.nonEmpty &&
api.getContainerInfo.getContainerAddress.nonEmpty)
}
test("master: conf api") {
diff --git
a/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1WorkerOpenapiClientSuite.scala
b/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1WorkerOpenapiClientSuite.scala
index 4b307be49..8b69ca338 100644
---
a/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1WorkerOpenapiClientSuite.scala
+++
b/worker/src/test/scala/org/apache/celeborn/service/deploy/worker/http/api/v1/ApiV1WorkerOpenapiClientSuite.scala
@@ -52,6 +52,8 @@ abstract class ApiV1WorkerOpenapiClientSuite extends
CelebornFunSuite with MiniC
test("worker: default api") {
val api = new DefaultApi(workerApiClient)
assert(!api.getThreadDump.getThreadStacks.isEmpty)
+ assert(
+ api.getContainerInfo.getContainerAddress.nonEmpty &&
api.getContainerInfo.getContainerAddress.nonEmpty)
}
test("worker: conf api") {