[ONOS-7902] Add a set of interfaces, enums for kubernetes node

Change-Id: I76e380973386cebc785b00b42f05b22ffe674606
diff --git a/apps/k8s-node/BUILD b/apps/k8s-node/BUILD
new file mode 100644
index 0000000..83aaf44
--- /dev/null
+++ b/apps/k8s-node/BUILD
@@ -0,0 +1,12 @@
+BUNDLES = [
+    "//apps/k8s-node/api:onos-apps-k8s-node-api",
+    "//apps/k8s-node/app:onos-apps-k8s-node-app",
+]
+
+onos_app(
+    category = "Integration",
+    description = "SONA Kubernetes Node Application.",
+    included_bundles = BUNDLES,
+    title = "Kubernetes Node Application",
+    url = "https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization",
+)
diff --git a/apps/k8s-node/api/BUILD b/apps/k8s-node/api/BUILD
new file mode 100644
index 0000000..36d2da1
--- /dev/null
+++ b/apps/k8s-node/api/BUILD
@@ -0,0 +1,11 @@
+COMPILE_DEPS = CORE_DEPS
+
+TEST_DEPS = TEST_ADAPTERS + [
+    "//core/api:onos-api-tests",
+    "//core/common:onos-core-common-tests",
+]
+
+osgi_jar_with_tests(
+    test_deps = TEST_DEPS,
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
new file mode 100644
index 0000000..8f307b5
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+/**
+ * Representation of a node used in k8s-networking service.
+ */
+public interface K8sNode {
+
+    /**
+     * Lists of kubernetes node types.
+     */
+    enum Type {
+        /**
+         * Signifies that this is a kubernetes master node.
+         */
+        MASTER,
+
+        /**
+         * Signifies that this is a kubernetes minion node.
+         */
+        MINION
+    }
+
+    /**
+     * Returns hostname of the node.
+     *
+     * @return hostname
+     */
+    String hostname();
+
+    /**
+     * Returns the type of the node.
+     *
+     * @return node type
+     */
+    Type type();
+
+    /**
+     * Returns the OVSDB device ID of the node.
+     *
+     * @return ovsdb device id
+     */
+    DeviceId ovsdb();
+
+    /**
+     * Returns the device ID of the integration bridge at the node.
+     *
+     * @return device id
+     */
+    DeviceId intgBridge();
+
+    /**
+     * Returns the management network IP address of the node.
+     *
+     * @return ip address
+     */
+    IpAddress managementIp();
+
+    /**
+     * Returns the data network IP address used for tunneling.
+     *
+     * @return ip address; null if vxlan mode is not enabled
+     */
+    IpAddress dataIp();
+
+    /**
+     * Returns the initialization state of the node.
+     *
+     * @return node state
+     */
+    K8sNodeState state();
+
+    /**
+     * Returns the GRE tunnel port number.
+     *
+     * @return GRE port number; null if the GRE tunnel port does not exist
+     */
+    PortNumber grePortNum();
+
+    /**
+     * Returns the VXLAN tunnel port number.
+     *
+     * @return VXLAN port number; null if tunnel port does not exist
+     */
+    PortNumber vxlanPortNum();
+
+    /**
+     * Returns the GENEVE tunnel port number.
+     *
+     * @return GENEVE port number; null if the GRE tunnel port does not exist
+     */
+    PortNumber genevePortNum();
+
+    /**
+     * Builder of new node entity.
+     */
+    interface Builder {
+
+        /**
+         * Builds an immutable kubernetes node instance.
+         *
+         * @return kubernetes node instance
+         */
+        K8sNode build();
+
+        /**
+         * Returns kubernetes node builder with supplied hostname.
+         *
+         * @param hostname hostname of the node
+         * @return kubernetes node builder
+         */
+        Builder hostname(String hostname);
+
+        /**
+         * Returns kubernetes node builder with supplied type.
+         *
+         * @param type kubernetes node type
+         * @return kubernetes node builder
+         */
+        Builder type(Type type);
+
+        /**
+         * Returns kubernetes node builder with supplied bridge name.
+         *
+         * @param deviceId integration bridge device ID
+         * @return kubernetes node builder
+         */
+        Builder intgBridge(DeviceId deviceId);
+
+        /**
+         * Returns kubernetes node builder with supplied management IP address.
+         *
+         * @param managementIp management IP address
+         * @return kubernetes node builder
+         */
+        Builder managementIp(IpAddress managementIp);
+
+        /**
+         * Returns kubernetes node builder with supplied data IP address.
+         *
+         * @param dataIp data IP address
+         * @return kubernetes node builder
+         */
+        Builder dataIp(IpAddress dataIp);
+
+        /**
+         * Returns kubernetes node builder with supplied node state.
+         *
+         * @param state kubernetes node state
+         * @return kubernetes node builder
+         */
+        Builder state(K8sNodeState state);
+    }
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeAdminService.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeAdminService.java
new file mode 100644
index 0000000..ad85b9f
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeAdminService.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+/**
+ * Service for administering inventory of Kubernetes nodes.
+ */
+public interface K8sNodeAdminService extends K8sNodeService {
+
+    /**
+     * Creates a new node.
+     *
+     * @param node kubernetes node
+     */
+    void createNode(K8sNode node);
+
+    /**
+     * Updates the node.
+     *
+     * @param node kubernetes node
+     */
+    void updateNode(K8sNode node);
+
+    /**
+     * Removes the node.
+     *
+     * @param hostname kubernetes node hostname
+     * @return removed node; null if the node does not exist
+     */
+    K8sNode removeNode(String hostname);
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeEvent.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeEvent.java
new file mode 100644
index 0000000..841fe01
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeEvent.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onosproject.event.AbstractEvent;
+
+/**
+ * Describes Kubernetes node init state event.
+ */
+public class K8sNodeEvent extends AbstractEvent<K8sNodeEvent.Type, K8sNode> {
+
+    /**
+     * Lists of kubernetes node event types.
+     */
+    public enum Type {
+
+        /**
+         * Signifies that new node is created.
+         */
+        K8S_NODE_CREATED,
+
+        /**
+         * Signifies that the node is updated.
+         */
+        K8S_NODE_UPDATED,
+
+        /**
+         * Signifies that the node state is completed.
+         */
+        K8S_NODE_COMPLETE,
+
+        /**
+         * Signifies that the node is removed.
+         */
+        K8S_NODE_REMOVED,
+
+        /**
+         * Signifies that the node state is incomplete.
+         */
+        K8S_NODE_INCOMPLETE
+    }
+
+    /**
+     * Creates an event with the given type and node.
+     *
+     * @param type event type
+     * @param subject kubernetes node
+     */
+    protected K8sNodeEvent(Type type, K8sNode subject) {
+        super(type, subject);
+    }
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeHandler.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeHandler.java
new file mode 100644
index 0000000..3f63ad3
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeHandler.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+/**
+ * Service handling kubernetes node stats.
+ */
+public interface K8sNodeHandler {
+
+    /**
+     * Processes the given node for init state.
+     * It creates required bridges on OVS by referring to node type.
+     *
+     * @param k8sNode kubernetes node
+     */
+    void processInitState(K8sNode k8sNode);
+
+    /**
+     * Processes the given node for device created state.
+     * It creates required ports on the bridges based on the node type
+     *
+     * @param k8sNode kubernetes node
+     */
+    void processDeviceCreatedState(K8sNode k8sNode);
+
+    /**
+     * Processes the given node for complete state.
+     * It performs post-init jobs for the complete node.
+     *
+     * @param k8sNode kubernetes node
+     */
+    void processCompleteState(K8sNode k8sNode);
+
+    /**
+     * Processes the given node for incomplete state.
+     *
+     * @param k8sNode kubernete node
+     */
+    void processIncompleteState(K8sNode k8sNode);
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeListener.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeListener.java
new file mode 100644
index 0000000..268063c
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeListener.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Listener for Kubernetes Node event.
+ */
+public interface K8sNodeListener extends EventListener<K8sNodeEvent> {
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeService.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeService.java
new file mode 100644
index 0000000..455e42c
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeService.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onosproject.event.ListenerService;
+import org.onosproject.k8snode.api.K8sNode.Type;
+import org.onosproject.net.DeviceId;
+
+import java.util.Set;
+
+/**
+ * Service for interfacing with the inventory of Kubernetes Node.
+ */
+public interface K8sNodeService extends ListenerService<K8sNodeEvent, K8sNodeListener> {
+
+    String APP_ID = "org.onosproject.k8snode";
+
+    /**
+     * Returns all registered nodes.
+     *
+     * @return set of kubernetes nodes
+     */
+    Set<K8sNode> nodes();
+
+    /**
+     * Returns all nodes with the specified type.
+     *
+     * @param type node type
+     * @return set of kubernetes nodes
+     */
+    Set<K8sNode> nodes(Type type);
+
+    /**
+     * Returns all nodes with complete states.
+     *
+     * @return set of kubernetes nodes
+     */
+    Set<K8sNode> completeNodes();
+
+    /**
+     * Returns all nodes with complete state and the specified type.
+     *
+     * @param type node type
+     * @return set of kubernetes nodes
+     */
+    Set<K8sNode> completeNodes(Type type);
+
+    /**
+     * Returns the node with the specified hostname.
+     *
+     * @param hostname hostname
+     * @return kubernetes node
+     */
+    K8sNode node(String hostname);
+
+    /**
+     * Returns the node with the specified device ID.
+     * The device ID can be any one of integration bridge, router bridge,
+     * or ovsdb device.
+     *
+     * @param deviceId device ID
+     * @return kubernetes node
+     */
+    K8sNode node(DeviceId deviceId);
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeState.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeState.java
new file mode 100644
index 0000000..88c66c5
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeState.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+/**
+ * Defines the initialization stats of Kubernetes node.
+ */
+public enum K8sNodeState {
+
+    /**
+     * Indicates the node is newly added.
+     */
+    INIT {
+        @Override
+        public void process(K8sNodeHandler handler, K8sNode node) {
+            handler.processInitState(node);
+        }
+
+        @Override
+        public K8sNodeState nextState() {
+            return DEVICE_CREATED;
+        }
+    },
+    /**
+     * Indicates bridge devices are added according to the node state.
+     */
+    DEVICE_CREATED {
+        @Override
+        public void process(K8sNodeHandler handler, K8sNode node) {
+            handler.processDeviceCreatedState(node);
+        }
+
+        @Override
+        public K8sNodeState nextState() {
+            return COMPLETE;
+        }
+    },
+    /**
+     * Indicates node initialization is done.
+     */
+    COMPLETE {
+        @Override
+        public void process(K8sNodeHandler handler, K8sNode node) {
+            handler.processCompleteState(node);
+        }
+
+        @Override
+        public K8sNodeState nextState() {
+            return COMPLETE;
+        }
+    },
+    /**
+     * Indicates node is broken.
+     */
+    INCOMPLETE {
+        @Override
+        public void process(K8sNodeHandler handler, K8sNode node) {
+            handler.processIncompleteState(node);
+        }
+
+        @Override
+        public K8sNodeState nextState() {
+            return INIT;
+        }
+    };
+
+    /**
+     * Processes the given node which is under a certain state.
+     *
+     * @param handler kubernetes node handler
+     * @param node kubernetes node
+     */
+    public abstract void process(K8sNodeHandler handler, K8sNode node);
+
+    /**
+     * Transits to the next state.
+     *
+     * @return the next kubernetes node state
+     */
+    public abstract K8sNodeState nextState();
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStore.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStore.java
new file mode 100644
index 0000000..5bd6548
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStore.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onosproject.store.Store;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of Kubernetes Node; not intended for direct use.
+ */
+public interface K8sNodeStore extends Store<K8sNodeEvent, K8sNodeStoreDelegate> {
+
+    /**
+     * Creates a new node.
+     *
+     * @param node kubernetes node
+     */
+    void createNode(K8sNode node);
+
+    /**
+     * Updates the node.
+     *
+     * @param node kubernetes node
+     */
+    void updateNode(K8sNode node);
+
+    /**
+     * Removes the node with the given hostname.
+     *
+     * @param hostname kubernetes node hostname
+     * @return removed kubernetes node; null if no node is associated with the hostname
+     */
+    K8sNode removeNode(String hostname);
+
+    /**
+     * Returns all registered nodes.
+     *
+     * @return set of kubernetes nodes
+     */
+    Set<K8sNode> nodes();
+
+    /**
+     * Returns the node with the specified hostname.
+     *
+     * @param hostname hostname
+     * @return kubernetes node
+     */
+    K8sNode node(String hostname);
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStoreDelegate.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStoreDelegate.java
new file mode 100644
index 0000000..625a8c7
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNodeStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.onosproject.k8snode.api;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Kubernetes Node store delegate.
+ */
+public interface K8sNodeStoreDelegate extends StoreDelegate<K8sNodeEvent> {
+}
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/package-info.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/package-info.java
new file mode 100644
index 0000000..7cf14bb
--- /dev/null
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Application for bootstrapping Master/Minion Nodes in kubernetes.
+ */
+package org.onosproject.k8snode.api;
\ No newline at end of file
diff --git a/apps/k8s-node/app/BUILD b/apps/k8s-node/app/BUILD
new file mode 100644
index 0000000..90dc6e9
--- /dev/null
+++ b/apps/k8s-node/app/BUILD
@@ -0,0 +1,15 @@
+COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + CLI + REST + [
+    "//core/store/serializers:onos-core-serializers",
+    "//apps/k8s-node/api:onos-apps-k8s-node-api",
+]
+
+TEST_DEPS = TEST_ADAPTERS + [
+    "//core/api:onos-api-tests",
+    "//core/common:onos-core-common-tests",
+]
+
+osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.k8snode.cli"],
+    test_deps = TEST_DEPS,
+    deps = COMPILE_DEPS,
+)
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/package-info.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/package-info.java
new file mode 100644
index 0000000..de498e0
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Console commands to manage k8s nodes.
+ */
+package org.onosproject.k8snode.cli;
\ No newline at end of file
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/package-info.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/package-info.java
new file mode 100644
index 0000000..001b14b
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Implementation of the codec broker and k8snode entity JOSN codecs.
+ */
+package org.onosproject.k8snode.codec;
\ No newline at end of file
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/package-info.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/package-info.java
new file mode 100644
index 0000000..84b6940
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Application for bootstrapping Master/Minion Nodes in kubernetes.
+ */
+package org.onosproject.k8snode.impl;
\ No newline at end of file
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/package-info.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/package-info.java
new file mode 100644
index 0000000..804527c
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * K8s node utility package.
+ */
+package org.onosproject.k8snode.util;
\ No newline at end of file
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/web/package-info.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/web/package-info.java
new file mode 100644
index 0000000..eee6d25
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/web/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Application for bootstrapping Master/Minion Nodes in kubernetes.
+ */
+package org.onosproject.k8snode.web;
\ No newline at end of file
diff --git a/tools/build/bazel/modules.bzl b/tools/build/bazel/modules.bzl
index ca81933..f63faf8 100644
--- a/tools/build/bazel/modules.bzl
+++ b/tools/build/bazel/modules.bzl
@@ -200,6 +200,7 @@
     "//apps/openstacktelemetry:onos-apps-openstacktelemetry-oar",
     "//apps/openstacktroubleshoot:onos-apps-openstacktroubleshoot-oar",
     "//apps/openstackvtap:onos-apps-openstackvtap-oar",
+    "//apps/k8s-node:onos-apps-k8s-node-oar",
     "//apps/cpman/app:onos-apps-cpman-app-oar",
     "//apps/scalablegateway:onos-apps-scalablegateway-oar",
     "//apps/castor:onos-apps-castor-oar",