diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
index 61c2e2d..75d4433 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
@@ -23,10 +23,14 @@
 import org.onlab.packet.IpAddress;
 import org.onosproject.codec.CodecService;
 import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.k8snode.api.DefaultK8sApiConfig;
 import org.onosproject.k8snode.api.DefaultK8sNode;
+import org.onosproject.k8snode.api.K8sApiConfig;
+import org.onosproject.k8snode.api.K8sApiConfigAdminService;
 import org.onosproject.k8snode.api.K8sNode;
 import org.onosproject.k8snode.api.K8sNodeAdminService;
 import org.onosproject.k8snode.api.K8sNodeState;
+import org.onosproject.k8snode.codec.K8sApiConfigCodec;
 import org.onosproject.k8snode.codec.K8sNodeCodec;
 import org.onosproject.net.DeviceId;
 import org.onosproject.rest.resources.ResourceTest;
@@ -52,9 +56,13 @@
 public class K8sNodeWebResourceTest extends ResourceTest {
 
     final K8sNodeAdminService mockK8sNodeAdminService = createMock(K8sNodeAdminService.class);
-    private static final String PATH = "configure";
+    final K8sApiConfigAdminService mockK8sApiConfigAdminService =
+            createMock(K8sApiConfigAdminService.class);
+    private static final String NODE_PATH = "configure/node";
+    private static final String API_PATH = "configure/api";
 
     private K8sNode k8sNode;
+    private K8sApiConfig k8sApiConfig;
 
     /**
      * Constructs a kubernetes node resource test instance.
@@ -71,9 +79,11 @@
         final CodecManager codecService = new CodecManager();
         codecService.activate();
         codecService.registerCodec(K8sNode.class, new K8sNodeCodec());
+        codecService.registerCodec(K8sApiConfig.class, new K8sApiConfigCodec());
         ServiceDirectory testDirectory =
                 new TestServiceDirectory()
                 .add(K8sNodeAdminService.class, mockK8sNodeAdminService)
+                .add(K8sApiConfigAdminService.class, mockK8sApiConfigAdminService)
                 .add(CodecService.class, codecService);
         setServiceDirectory(testDirectory);
 
@@ -85,6 +95,16 @@
                 .intgBridge(DeviceId.deviceId("of:00000000000000a1"))
                 .state(K8sNodeState.INIT)
                 .build();
+
+        k8sApiConfig = DefaultK8sApiConfig.builder()
+                .scheme(K8sApiConfig.Scheme.HTTPS)
+                .ipAddress(IpAddress.valueOf("10.134.34.223"))
+                .port(6443)
+                .token("tokenMod")
+                .caCertData("caCertData")
+                .clientCertData("clientCertData")
+                .clientKeyData("clientKeyData")
+                .build();
     }
 
     /**
@@ -99,7 +119,7 @@
         final WebTarget wt = target();
         InputStream jsonStream = K8sNodeWebResourceTest.class
                 .getResourceAsStream("k8s-node-minion-config.json");
-        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+        Response response = wt.path(NODE_PATH).request(MediaType.APPLICATION_JSON_TYPE)
                 .post(Entity.json(jsonStream));
         final int status = response.getStatus();
 
@@ -119,7 +139,7 @@
         final WebTarget wt = target();
         InputStream jsonStream = K8sNodeWebResourceTest.class
                 .getResourceAsStream("k8s-node-minion-config.json");
-        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+        Response response = wt.path(NODE_PATH).request(MediaType.APPLICATION_JSON_TYPE)
                 .post(Entity.json(jsonStream));
         final int status = response.getStatus();
 
@@ -140,7 +160,7 @@
         final WebTarget wt = target();
         InputStream jsonStream = K8sNodeWebResourceTest.class
                 .getResourceAsStream("k8s-node-minion-config.json");
-        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+        Response response = wt.path(NODE_PATH).request(MediaType.APPLICATION_JSON_TYPE)
                 .put(Entity.json(jsonStream));
         final int status = response.getStatus();
 
@@ -160,7 +180,7 @@
         final WebTarget wt = target();
         InputStream jsonStream = K8sNodeWebResourceTest.class
                 .getResourceAsStream("k8s-node-minion-config.json");
-        Response response = wt.path(PATH).request(MediaType.APPLICATION_JSON_TYPE)
+        Response response = wt.path(NODE_PATH).request(MediaType.APPLICATION_JSON_TYPE)
                 .put(Entity.json(jsonStream));
         final int status = response.getStatus();
 
@@ -178,7 +198,7 @@
         expect(mockK8sNodeAdminService.removeNode(anyString())).andReturn(k8sNode).once();
         replay(mockK8sNodeAdminService);
 
-        String location = PATH + "/minion-node";
+        String location = NODE_PATH + "/minion-node";
 
         final WebTarget wt = target();
         Response response = wt.path(location).request(
@@ -199,7 +219,7 @@
         expect(mockK8sNodeAdminService.node(anyString())).andReturn(null).once();
         replay(mockK8sNodeAdminService);
 
-        String location = PATH + "/minion-node";
+        String location = NODE_PATH + "/minion-node";
 
         final WebTarget wt = target();
         Response response = wt.path(location).request(
@@ -211,4 +231,132 @@
 
         verify(mockK8sNodeAdminService);
     }
+
+    /**
+     * Tests the results of the REST API POST method with creating new configs operation.
+     */
+    @Test
+    public void testCreateConfigsWithCreateOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString())).andReturn(null).once();
+        mockK8sApiConfigAdminService.createApiConfig(anyObject());
+        replay(mockK8sApiConfigAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = K8sNodeWebResourceTest.class
+                .getResourceAsStream("k8s-api-config.json");
+        Response response = wt.path(API_PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(201));
+
+        verify(mockK8sApiConfigAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API POST method without creating new configs operation.
+     */
+    @Test
+    public void testCreateConfigsWithoutCreateOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString())).andReturn(k8sApiConfig).once();
+        replay(mockK8sApiConfigAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = K8sNodeWebResourceTest.class
+                .getResourceAsStream("k8s-api-config.json");
+        Response response = wt.path(API_PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .post(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(201));
+
+        verify(mockK8sApiConfigAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT method with modifying the configs.
+     */
+    @Test
+    public void testUpdateConfigsWithModifyOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString()))
+                .andReturn(k8sApiConfig).once();
+        mockK8sApiConfigAdminService.updateApiConfig(anyObject());
+        replay(mockK8sApiConfigAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = K8sNodeWebResourceTest.class
+                .getResourceAsStream("k8s-api-config.json");
+        Response response = wt.path(API_PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(200));
+
+        verify(mockK8sApiConfigAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API PUT method without modifying the configs.
+     */
+    @Test
+    public void testUpdateConfigsWithoutModifyOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString())).andReturn(null).once();
+        replay(mockK8sApiConfigAdminService);
+
+        final WebTarget wt = target();
+        InputStream jsonStream = K8sNodeWebResourceTest.class
+                .getResourceAsStream("k8s-api-config.json");
+        Response response = wt.path(API_PATH).request(MediaType.APPLICATION_JSON_TYPE)
+                .put(Entity.json(jsonStream));
+        final int status = response.getStatus();
+
+        assertThat(status, is(304));
+
+        verify(mockK8sApiConfigAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE method with deleting the configs.
+     */
+    @Test
+    public void testDeleteConfigsWithDeletionOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString()))
+                .andReturn(k8sApiConfig).once();
+        expect(mockK8sApiConfigAdminService.removeApiConfig(anyString()))
+                .andReturn(k8sApiConfig).once();
+        replay(mockK8sApiConfigAdminService);
+
+        String location = API_PATH + "/https://test:8663";
+
+        final WebTarget wt = target();
+        Response response = wt.path(location).request(
+                MediaType.APPLICATION_JSON_TYPE).delete();
+
+        final int status = response.getStatus();
+
+        assertThat(status, is(204));
+
+        verify(mockK8sApiConfigAdminService);
+    }
+
+    /**
+     * Tests the results of the REST API DELETE method without deleting the configs.
+     */
+    @Test
+    public void testDeleteConfigsWithoutDeletionOperation() {
+        expect(mockK8sApiConfigAdminService.apiConfig(anyString())).andReturn(null).once();
+        replay(mockK8sApiConfigAdminService);
+
+        String location = API_PATH + "/https://test:8663";
+
+        final WebTarget wt = target();
+        Response response = wt.path(location).request(
+                MediaType.APPLICATION_JSON_TYPE).delete();
+
+        final int status = response.getStatus();
+
+        assertThat(status, is(304));
+
+        verify(mockK8sApiConfigAdminService);
+    }
 }
