diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
new file mode 100644
index 0000000..c04c183
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+/**
+ * Provides constants used in KubeVirt node services.
+ */
+public final class Constants {
+
+    private Constants() {
+    }
+
+    public static final String VXLAN = "vxlan";
+    public static final String GRE = "gre";
+    public static final String GENEVE = "geneve";
+
+    public static final String DEFAULT_CLUSTER_NAME = "default";
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
new file mode 100644
index 0000000..cd653ce
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+import com.google.common.base.MoreObjects;
+import org.apache.commons.lang.StringUtils;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onosproject.kubevirtnode.api.Constants.DEFAULT_CLUSTER_NAME;
+
+/**
+ * Representation of a KubeVirt node.
+ */
+public class DefaultKubevirtNode implements KubevirtNode {
+
+    private static final String NOT_NULL_MSG = "Node % cannot be null";
+    private static final String OVSDB = "ovsdb:";
+
+    private final String clusterName;
+    private final String hostname;
+    private final Type type;
+    private final DeviceId intgBridge;
+    private final IpAddress managementIp;
+    private final IpAddress dataIp;
+    private final KubevirtNodeState state;
+    private final Collection<KubevirtPhyInterface> phyIntfs;
+
+    /**
+     * A default constructor of kubevirt node.
+     *
+     * @param clusterName       clusterName
+     * @param hostname          hostname
+     * @param type              node type
+     * @param intgBridge        integration bridge
+     * @param managementIp      management IP address
+     * @param dataIp            data IP address
+     * @param state             node state
+     * @param phyIntfs          physical interfaces
+     */
+    protected DefaultKubevirtNode(String clusterName, String hostname, Type type,
+                                  DeviceId intgBridge, IpAddress managementIp,
+                                  IpAddress dataIp, KubevirtNodeState state,
+                                  Collection<KubevirtPhyInterface> phyIntfs) {
+        this.clusterName = clusterName;
+        this.hostname = hostname;
+        this.type = type;
+        this.intgBridge = intgBridge;
+        this.managementIp = managementIp;
+        this.dataIp = dataIp;
+        this.state = state;
+        this.phyIntfs = phyIntfs;
+    }
+
+    @Override
+    public String clusterName() {
+        return clusterName;
+    }
+
+    @Override
+    public String hostname() {
+        return hostname;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public DeviceId ovsdb() {
+        return DeviceId.deviceId(OVSDB + managementIp().toString());
+    }
+
+    @Override
+    public DeviceId intgBridge() {
+        return intgBridge;
+    }
+
+    @Override
+    public IpAddress managementIp() {
+        return managementIp;
+    }
+
+    @Override
+    public IpAddress dataIp() {
+        return dataIp;
+    }
+
+    @Override
+    public KubevirtNodeState state() {
+        return state;
+    }
+
+    @Override
+    public KubevirtNode updateState(KubevirtNodeState newState) {
+        return new Builder()
+                .hostname(hostname)
+                .clusterName(clusterName)
+                .type(type)
+                .intgBridge(intgBridge)
+                .managementIp(managementIp)
+                .dataIp(dataIp)
+                .state(newState)
+                .phyIntfs(phyIntfs)
+                .build();
+    }
+
+    @Override
+    public Collection<KubevirtPhyInterface> phyIntfs() {
+        if (phyIntfs == null) {
+            return new ArrayList<>();
+        }
+
+        return phyIntfs;
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return kubevirt node builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Returns new builder instance with the given node as a default value.
+     *
+     * @param node kubevirt node
+     * @return kubevirt node builder
+     */
+    public static Builder from(KubevirtNode node) {
+        return new Builder()
+                .hostname(node.hostname())
+                .clusterName(node.clusterName())
+                .type(node.type())
+                .intgBridge(node.intgBridge())
+                .managementIp(node.managementIp())
+                .dataIp(node.dataIp())
+                .state(node.state());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultKubevirtNode that = (DefaultKubevirtNode) o;
+        return clusterName.equals(that.clusterName) &&
+                hostname.equals(that.hostname) &&
+                type == that.type &&
+                intgBridge.equals(that.intgBridge) &&
+                managementIp.equals(that.managementIp) &&
+                dataIp.equals(that.dataIp);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(clusterName, hostname, type, intgBridge,
+                managementIp, dataIp);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("clusterName", clusterName)
+                .add("hostname", hostname)
+                .add("type", type)
+                .add("intgBridge", intgBridge)
+                .add("managementIp", managementIp)
+                .add("dataIp", dataIp)
+                .add("state", state)
+                .toString();
+    }
+
+    public static final class Builder implements KubevirtNode.Builder {
+
+        private String clusterName;
+        private String hostname;
+        private Type type;
+        private DeviceId intgBridge;
+        private IpAddress managementIp;
+        private IpAddress dataIp;
+        private KubevirtNodeState state;
+        private Collection<KubevirtPhyInterface> phyIntfs;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public KubevirtNode build() {
+            checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
+            checkArgument(type != null, NOT_NULL_MSG, "type");
+            checkArgument(state != null, NOT_NULL_MSG, "state");
+            checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
+
+            if (StringUtils.isEmpty(clusterName)) {
+                clusterName = DEFAULT_CLUSTER_NAME;
+            }
+
+            return new DefaultKubevirtNode(
+                    clusterName,
+                    hostname,
+                    type,
+                    intgBridge,
+                    managementIp,
+                    dataIp,
+                    state,
+                    phyIntfs
+            );
+        }
+
+        @Override
+        public Builder clusterName(String clusterName) {
+            this.clusterName = clusterName;
+            return this;
+        }
+
+        @Override
+        public Builder hostname(String hostname) {
+            this.hostname = hostname;
+            return this;
+        }
+
+        @Override
+        public Builder type(Type type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public Builder intgBridge(DeviceId deviceId) {
+            this.intgBridge = deviceId;
+            return this;
+        }
+
+        @Override
+        public Builder managementIp(IpAddress managementIp) {
+            this.managementIp = managementIp;
+            return this;
+        }
+
+        @Override
+        public Builder dataIp(IpAddress dataIp) {
+            this.dataIp = dataIp;
+            return this;
+        }
+
+        @Override
+        public Builder phyIntfs(Collection<KubevirtPhyInterface> phyIntfs) {
+            this.phyIntfs = phyIntfs;
+            return this;
+        }
+
+        @Override
+        public Builder state(KubevirtNodeState state) {
+            this.state = state;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtPhyInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtPhyInterface.java
new file mode 100644
index 0000000..1cae8f2
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtPhyInterface.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Implementation class of kubevirt physical interface.
+ */
+public class DefaultKubevirtPhyInterface implements KubevirtPhyInterface {
+
+    private final String network;
+    private final String intf;
+
+    private static final String NOT_NULL_MSG = "% cannot be null";
+
+    /**
+     * A default constructor of kubevirt physical interface.
+     *
+     * @param network network that this physical interface connects with
+     * @param intf    name of physical interface
+     */
+    protected DefaultKubevirtPhyInterface(String network, String intf) {
+        this.network = network;
+        this.intf = intf;
+    }
+
+    @Override
+    public String network() {
+        return network;
+    }
+
+    @Override
+    public String intf() {
+        return intf;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultKubevirtPhyInterface that = (DefaultKubevirtPhyInterface) o;
+        return network.equals(that.network) &&
+                intf.equals(that.intf);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(network, intf);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("network", network)
+                .add("intf", intf)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return kubevirt physical interface builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static final class Builder implements KubevirtPhyInterface.Builder {
+
+        private String network;
+        private String intf;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public KubevirtPhyInterface build() {
+            checkArgument(network != null, NOT_NULL_MSG, "network");
+            checkArgument(intf != null, NOT_NULL_MSG, "intf");
+
+            return new DefaultKubevirtPhyInterface(network, intf);
+        }
+
+        @Override
+        public KubevirtPhyInterface.Builder network(String network) {
+            this.network = network;
+            return this;
+        }
+
+        @Override
+        public KubevirtPhyInterface.Builder intf(String intf) {
+            this.intf = intf;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
new file mode 100644
index 0000000..544c76b
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+
+import java.util.Collection;
+
+/**
+ * Representation of a KubeVirt node used in kubevirt networking service.
+ */
+public interface KubevirtNode {
+
+    /**
+     * Lists of kubernetes node types.
+     */
+    enum Type {
+        /**
+         * Signifies that this is a kubevirt master node.
+         */
+        MASTER,
+
+        /**
+         * Signifies that this is a kubevirt worker node.
+         */
+        WORKER,
+    }
+
+    /**
+     * Returns cluster name of the node.
+     *
+     * @return cluster name
+     */
+    String clusterName();
+
+    /**
+     * Returns hostname of the node.
+     *
+     * @return hostname
+     */
+    String hostname();
+
+    /**
+     * Returns the type of the node.
+     *
+     * @return node type
+     */
+    KubevirtNode.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 tunnel mode is not enabled
+     */
+    IpAddress dataIp();
+
+    /**
+     * Returns the initialization state of the node.
+     *
+     * @return node state
+     */
+    KubevirtNodeState state();
+
+    /**
+     * Returns new kubevirt node instance with given state.
+     *
+     * @param newState updated state
+     * @return updated kubernetes node
+     */
+    KubevirtNode updateState(KubevirtNodeState newState);
+
+    /**
+     * Returns a collection of physical interfaces.
+     *
+     * @return physical interfaces
+     */
+    Collection<KubevirtPhyInterface> phyIntfs();
+
+    /**
+     * Builder of new node entity.
+     */
+    interface Builder {
+        /**
+         * Builds an immutable kubevirt node instance.
+         *
+         * @return kubevirt node instance
+         */
+        KubevirtNode build();
+
+        /**
+         * Returns kubevirt node builder with supplied cluster name.
+         *
+         * @param clusterName cluster name
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder clusterName(String clusterName);
+
+        /**
+         * Returns kubevirt node builder with supplied hostname.
+         *
+         * @param hostname hostname of the node
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder hostname(String hostname);
+
+        /**
+         * Returns kubevirt node builder with supplied type.
+         *
+         * @param type kubevirt node type
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder type(KubevirtNode.Type type);
+
+        /**
+         * Returns kubevirt node builder with supplied integration bridge name.
+         *
+         * @param deviceId integration bridge device ID
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder intgBridge(DeviceId deviceId);
+
+        /**
+         * Returns kubevirt node builder with supplied management IP address.
+         *
+         * @param managementIp management IP address
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder managementIp(IpAddress managementIp);
+
+        /**
+         * Returns kubevirt node builder with supplied data IP address.
+         *
+         * @param dataIp data IP address
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder dataIp(IpAddress dataIp);
+
+        /**
+         * Returns kubevirt node builder with supplied physical interfaces.
+         *
+         * @param phyIntfs a collection of physical interfaces
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder phyIntfs(Collection<KubevirtPhyInterface> phyIntfs);
+
+        /**
+         * Returns kubevirt node builder with supplied node state.
+         *
+         * @param state kubevirt node state
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder state(KubevirtNodeState state);
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java
new file mode 100644
index 0000000..d3833c1
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+/**
+ * Service handling KubeVirt node state.
+ */
+public interface KubevirtNodeHandler {
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java
new file mode 100644
index 0000000..87d921e
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+/**
+ * Defines the initialization stats of KubeVirt node.
+ */
+public enum KubevirtNodeState {
+
+    /**
+     * Indicates the node is in pre-on-board.
+     */
+    PRE_ON_BOARD {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    },
+    /**
+     * Indicates the node is on-boarded.
+     */
+    ON_BOARDED {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    },
+    /**
+     * Indicates the node is newly added.
+     */
+    INIT {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    },
+    /**
+     * Indicates bridge devices are added according to the node state.
+     */
+    DEVICE_CREATED {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    },
+    /**
+     * Indicates node initialization is done.
+     */
+    COMPLETE {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    },
+    /**
+     * Indicates node is broken.
+     */
+    INCOMPLETE {
+        @Override
+        public void process(KubevirtNodeHandler handler, KubevirtNode node) {
+
+        }
+
+        @Override
+        public KubevirtNodeState nodeState() {
+            return null;
+        }
+    };
+
+    /**
+     * Processes the given kubevirt node which is under a certain state.
+     *
+     * @param handler kubevirt node handler
+     * @param node kubevirt node
+     */
+    public abstract void process(KubevirtNodeHandler handler, KubevirtNode node);
+
+    /**
+     * Transits to the next state.
+     *
+     * @return the next kubevirt node state
+     */
+    public abstract KubevirtNodeState nodeState();
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtPhyInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtPhyInterface.java
new file mode 100644
index 0000000..40e8661
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtPhyInterface.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2020-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.kubevirtnode.api;
+
+public interface KubevirtPhyInterface {
+    /**
+     * Returns physical network name that this interface binds to.
+     *
+     * @return physical network name
+     */
+    String network();
+
+    /**
+     * Returns name of this physical interface.
+     *
+     * @return name of this physical interface
+     */
+    String intf();
+
+    /**
+     * Builder of kubevirt physical interface.
+     */
+    interface Builder {
+
+        KubevirtPhyInterface build();
+
+        /**
+         * Returns physical network that this physical interface connects with.
+         *
+         * @param network network name
+         * @return kubevirt physical interface builder
+         */
+        Builder network(String network);
+
+        /**
+         * Returns physical interface name.
+         *
+         * @param intf physical interface name of openstack node
+         * @return kubevirt physical interface builder
+         */
+        Builder intf(String intf);
+    }
+}
