diff --git a/config-drive/create_config_drive.py b/config-drive/create_config_drive.py
index 4a0671e..da54c6d 100755
--- a/config-drive/create_config_drive.py
+++ b/config-drive/create_config_drive.py
@@ -8,11 +8,12 @@
 #
 # This script uses OpenStack Metadata Service Network format for configuring networking.
 #
-__author__    = "Dzmitry Stremkouski"
+__author__ = "Dzmitry Stremkouski"
 __copyright__ = "Copyright 2019, Mirantis Inc."
-__license__   = "Apache 2.0"
+__license__ = "Apache 2.0"
 
 import argparse
+import ipaddress
 from crypt import crypt
 from json import dump as json_dump
 from os import makedirs, umask
@@ -20,7 +21,6 @@
 from subprocess import call as run
 from sys import argv, exit
 from uuid import uuid1 as uuidgen
-from yaml import safe_load
 
 
 def crash_with_error(msg, exit_code=1):
@@ -34,9 +34,9 @@
 
 
 def calculate_hostnames(name, hostname):
-
     if len(name.split('.')) > 1:
-        crash_with_error("instance name should be in short format without domain")
+        crash_with_error(
+            "instance name should be in short format without domain")
     else:
         if len(hostname.split('.')) == 1:
             if not name == uuid:
@@ -53,17 +53,46 @@
 def validate_args(args):
     if not args.user_data:
         if args.cloud_user_name or args.cloud_user_pass:
-            crash_with_error("You have not specified user-data file path, but require cloud-user setup, which requires it.")
+            crash_with_error(
+                "You have not specified user-data file path, but require"
+                "cloud-user setup, which requires it.")
 
     if not args.skip_network and not args.network_data:
+        try:
+            ipaddress.ip_address(args.ip)
+        except Exception:
+            raise Exception(
+                "Unable to parse ip addr:{}".format(args.ip))
+        try:
+            ipaddress.ip_network(args.netmask)
+        except Exception:
+            raise Exception(
+                "Unable to parse netmask:{}".format(args.netmask))
+        if args.gateway:
+            try:
+                ipaddress.ip_address(args.gateway)
+            except Exception:
+                raise Exception(
+                    "Unable to parse gateway IP:{}".format(args.gateway))
+        if args.dns_nameservers:
+            for ns in args.dns_nameservers.split(','):
+                try:
+                    ipaddress.ip_address(ns)
+                except Exception:
+                    raise Exception(
+                        "Unable to parse nameserver IP:{}".format(ns))
         if not args.ip or not args.netmask or not args.interface:
-            crash_with_error("You have not specified neither ip nor netmask nor interface nor network_data.json file.\nEither skip network configuration or provide network_data.json file path.")
+            crash_with_error(
+                "You have not specified neither ip nor netmask nor interface "
+                "nor network_data.json file. Either skip network configuration "
+                "or provide network_data.json file path.")
 
     if args.skip_network and args.network_data:
-        crash_with_error("--skip-network and --network-data are mutually exclusive.")
+        crash_with_error(
+            "--skip-network and --network-data are mutually exclusive.")
 
 
-def generate_iso(cfg_file_path, cfg_dir_path, quiet = ''):
+def generate_iso(cfg_file_path, cfg_dir_path, quiet=''):
     xprint("Generating config drive image: %s" % cfg_file_path)
     cmd = ["mkisofs", "-r", "-J", "-V", "config-2", "-input-charset", "utf-8"]
     if quiet:
@@ -97,12 +126,8 @@
     makedirs(mcp_dir_path)
     makedirs(meta_dir_path)
 
-    meta_data = {}
-    meta_data["uuid"] = uuid
-    meta_data["hostname"] = hostname
-    meta_data["name"] = name
+    meta_data = {"uuid": uuid, "hostname": hostname, "name": name}
     network_data = {}
-    gateway_ip = ""
 
     ssh_keys = []
 
@@ -111,7 +136,8 @@
         ssh_keys.append(args.ssh_key)
 
     if args.ssh_keys:
-        xprint("Adding authorized keys file entries to config drive: %s" % str(args.ssh_keys))
+        xprint("Adding authorized keys file entries to config drive: %s" % str(
+            args.ssh_keys))
         with open(args.ssh_keys, 'r') as ssh_keys_file:
             ssh_keys += ssh_keys_file.readlines()
         ssh_keys = [x.strip() for x in ssh_keys]
@@ -130,11 +156,13 @@
         copytree(args.model, model_path)
 
     if args.pipeline_library:
-        xprint("Adding pipeline-library to config drive: %s" % str(args.pipeline_library))
+        xprint("Adding pipeline-library to config drive: %s" % str(
+            args.pipeline_library))
         copytree(args.pipeline_library, pipeline_lib_path)
 
     if args.mk_pipelines:
-        xprint("Adding mk-pipelines to config drive: %s" % str(args.mk_pipelines))
+        xprint(
+            "Adding mk-pipelines to config drive: %s" % str(args.mk_pipelines))
         copytree(args.mk_pipelines, mk_pipelines_path)
 
     if args.gpg_key:
@@ -143,14 +171,16 @@
         copyfile(args.gpg_key, gpg_file_path + '/salt_master_pillar.asc')
 
     if args.vendor_data:
-        xprint("Adding vendor metadata file to config drive: %s" % str(args.vendor_data))
+        xprint("Adding vendor metadata file to config drive: %s" % str(
+            args.vendor_data))
         copyfile(args.vendor_data, vendor_file_path)
 
     with open(meta_file_path, 'w') as meta_file:
         json_dump(meta_data, meta_file)
 
     if args.user_data:
-        xprint("Adding user data file to config drive: %s" % str(args.user_data))
+        xprint(
+            "Adding user data file to config drive: %s" % str(args.user_data))
         if username:
             with open(user_file_path, 'a') as user_file:
                 users_data = "#cloud-config\n"
@@ -160,7 +190,8 @@
                 users_data += "    groups: admin\n"
                 users_data += "    lock_passwd: false\n"
                 if userpass:
-                    users_data += "    passwd: %s\n" % str(crypt(userpass, '$6$'))
+                    users_data += "    passwd: %s\n" % str(
+                        crypt(userpass, '$6$'))
                 if ssh_keys:
                     users_data += "    ssh_authorized_keys:\n"
                     for ssh_key in ssh_keys:
@@ -173,22 +204,30 @@
             copyfile(args.user_data, user_file_path)
 
     if args.network_data:
-        xprint("Adding network metadata file to config drive: %s" % str(args.network_data))
+        xprint("Adding network metadata file to config drive: %s" % str(
+            args.network_data))
         copyfile(args.network_data, net_file_path)
     else:
         if not args.skip_network:
             xprint("Configuring network metadata from specified parameters.")
             network_data["links"] = []
             network_data["networks"] = []
-            network_data["links"].append({"type": "phy", "id": args.interface, "name": args.interface})
-            network_data["networks"].append({"type": "ipv4", "netmask": args.netmask, "link": args.interface, "id": "private-ipv4", "ip_address": args.ip})
+            network_data["links"].append(
+                {"type": "phy", "id": args.interface, "name": args.interface})
+            network_data["networks"].append(
+                {"type": "ipv4", "netmask": args.netmask,
+                 "link": args.interface, "id": "private-ipv4",
+                 "ip_address": args.ip})
             if args.dns_nameservers:
                 network_data["services"] = []
                 for nameserver in args.dns_nameservers.split(','):
-                    network_data["services"].append({"type": "dns", "address": nameserver})
+                    network_data["services"].append(
+                        {"type": "dns", "address": nameserver})
             if args.gateway:
                 network_data["networks"][0]["routes"] = []
-                network_data["networks"][0]["routes"].append({"netmask": "0.0.0.0", "gateway": args.gateway, "network": "0.0.0.0"})
+                network_data["networks"][0]["routes"].append(
+                    {"netmask": "0.0.0.0", "gateway": args.gateway,
+                     "network": "0.0.0.0"})
 
     # Check if network metadata is not skipped
     if len(network_data) > 0:
@@ -203,28 +242,67 @@
 
 if __name__ == '__main__':
     uuid = str(uuidgen())
-    parser = argparse.ArgumentParser(description='Config drive generator for MCP instances.', prog=argv[0], usage='%(prog)s [options]')
-    parser.add_argument('--gpg-key', type=str, help='Upload gpg key for salt master. Specify path to file in asc format.', required=False)
-    parser.add_argument('--name', type=str, default=uuid, help='Specify instance name. Hostname in short format, without domain.', required=False)
-    parser.add_argument('--hostname',  type=str, default=uuid, help='Specify instance hostname. FQDN. Hostname in full format with domain. Shortname would be trated as name.', required=False)
-    parser.add_argument('--skip-network', action='store_true', help='Do not generate network_data for the instance.', required=False)
-    parser.add_argument('--interface', type=str, default='ens3', help='Specify interface for instance to configure.', required=False)
-    parser.add_argument('--ssh-key', type=str, help='Specify ssh public key to upload to cloud image.', required=False)
-    parser.add_argument('--ssh-keys', type=str, help='Upload authorized_keys to cloud image. Specify path to file in authorized_keys format.', required=False)
-    parser.add_argument('--cloud-user-name', type=str, help='Specify cloud user name.', required=False)
-    parser.add_argument('--cloud-user-pass', type=str, help='Specify cloud user password.', required=False)
-    parser.add_argument('--ip', type=str, help='Specify IP address for instance.', required=False)
-    parser.add_argument('--netmask', type=str, help='Specify netmask for instance.', required=False)
-    parser.add_argument('--gateway', type=str, help='Specify gateway address for instance.', required=False)
-    parser.add_argument('--dns-nameservers', type=str, help='Specify DNS nameservers delimited by comma.', required=False)
-    parser.add_argument('--user-data', type=str, help='Specify path to user_data file in yaml format.', required=False)
-    parser.add_argument('--vendor-data', type=str, help='Specify path to vendor_data.json in openstack vendor metadata format.', required=False)
-    parser.add_argument('--network-data', type=str, help='Specify path to network_data.json in openstack network metadata format.', required=False)
-    parser.add_argument('--model', type=str, help='Specify path to cluster model.', required=False)
-    parser.add_argument('--mk-pipelines', type=str, help='Specify path to mk-pipelines folder.', required=False)
-    parser.add_argument('--pipeline-library', type=str, help='Specify path to pipeline-library folder.', required=False)
-    parser.add_argument('--clean-up', action='store_true', help='Clean-up config-drive dir once ISO is created.', required=False)
-    parser.add_argument('--quiet', action='store_true', help='Keep silence. Do not write any output messages to stout.', required=False)
+    parser = argparse.ArgumentParser(
+        description='Config drive generator for MCP instances.', prog=argv[0],
+        usage='%(prog)s [options]')
+    parser.add_argument('--gpg-key', type=str,
+                        help='Upload gpg key for salt master. Specify path to file in asc format.',
+                        required=False)
+    parser.add_argument('--name', type=str, default=uuid,
+                        help='Specify instance name. Hostname in short format, without domain.',
+                        required=False)
+    parser.add_argument('--hostname', type=str, default=uuid,
+                        help='Specify instance hostname. FQDN. Hostname in full format with domain. Shortname would be trated as name.',
+                        required=False)
+    parser.add_argument('--skip-network', action='store_true',
+                        help='Do not generate network_data for the instance.',
+                        required=False)
+    parser.add_argument('--interface', type=str, default='ens3',
+                        help='Specify interface for instance to configure.',
+                        required=False)
+    parser.add_argument('--ssh-key', type=str,
+                        help='Specify ssh public key to upload to cloud image.',
+                        required=False)
+    parser.add_argument('--ssh-keys', type=str,
+                        help='Upload authorized_keys to cloud image. Specify path to file in authorized_keys format.',
+                        required=False)
+    parser.add_argument('--cloud-user-name', type=str,
+                        help='Specify cloud user name.', required=False)
+    parser.add_argument('--cloud-user-pass', type=str,
+                        help='Specify cloud user password.', required=False)
+    parser.add_argument('--ip', type=str,
+                        help='Specify IP address for instance.', required=False)
+    parser.add_argument('--netmask', type=str,
+                        help='Specify netmask for instance.', required=False)
+    parser.add_argument('--gateway', type=str,
+                        help='Specify gateway address for instance.',
+                        required=False)
+    parser.add_argument('--dns-nameservers', type=str,
+                        help='Specify DNS nameservers delimited by comma.',
+                        required=False)
+    parser.add_argument('--user-data', type=str,
+                        help='Specify path to user_data file in yaml format.',
+                        required=False)
+    parser.add_argument('--vendor-data', type=str,
+                        help='Specify path to vendor_data.json in openstack vendor metadata format.',
+                        required=False)
+    parser.add_argument('--network-data', type=str,
+                        help='Specify path to network_data.json in openstack network metadata format.',
+                        required=False)
+    parser.add_argument('--model', type=str,
+                        help='Specify path to cluster model.', required=False)
+    parser.add_argument('--mk-pipelines', type=str,
+                        help='Specify path to mk-pipelines folder.',
+                        required=False)
+    parser.add_argument('--pipeline-library', type=str,
+                        help='Specify path to pipeline-library folder.',
+                        required=False)
+    parser.add_argument('--clean-up', action='store_true',
+                        help='Clean-up config-drive dir once ISO is created.',
+                        required=False)
+    parser.add_argument('--quiet', action='store_true',
+                        help='Keep silence. Do not write any output messages to stout.',
+                        required=False)
     args = parser.parse_args()
 
     if len(argv) < 2:
