Add ubuntu18

  * Info about Ubiquity https://wiki.ubuntu.com/UbiquityAutomation
    - we do exactly partitioning=> no possibility for now, to use
    new installer type.
  * Move growlvm.py to commons

Change-Id: Iabda3770b368a48919fef89d3a78cae388f60168
Prod-related: PROD-28155 (PROD:28155)
diff --git a/ubuntu-16.04/files/scripts/growlvm.py b/ubuntu-16.04/files/scripts/growlvm.py
deleted file mode 100755
index ae2ebd3..0000000
--- a/ubuntu-16.04/files/scripts/growlvm.py
+++ /dev/null
@@ -1,306 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2018 Mirantis, Inc.
-#
-#    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.
-
-
-"""Growpart python module
-
-The module is aimed to extend logical volumes according to sizes provided
-in image layout.
-
-Example:
-  python growlvm --image-layout-file '/root/mylayout.yml'
-
-Attributes:
-  image-layout - json string with image layout. Supported params and
-                 description might be found in IMAGE_LAYOUT_SCHEMA
-
-"""
-
-__version__ = '1.0'
-
-import argparse
-import collections
-import yaml
-from jsonschema import validate
-import logging
-import os
-import re
-import subprocess
-import sys
-
-
-LOG = logging.getLogger(__name__)
-
-DECIMAL_REG = re.compile(r"(\d+)")
-
-IMAGE_LAYOUT_SCHEMA = {
-    "$schema": "http://json-schema.org/draft-04/schema#",
-    "title": "Image partition layout",
-    "type": "object",
-    "patternProperties": {
-        ".*": {"$ref": "#/definitions/logical_volume_layout"}
-    },
-    "definitions": {
-        "logical_volume_layout": {
-            "type": "object",
-            "properties": {
-                "name": {
-                    "description": "Logical Volume Name",
-                    "type": "string"
-                },
-                "size": {
-                    "description": (
-                        "Size of Logical volume in units of logical extents. "
-                        "The number might be volume size in units of "
-                        "megabytes. A size suffix of M for megabytes, G for "
-                        "gigabytes, T for terabytes, P for petabytes or E for "
-                        "exabytes is optional. The number can also be "
-                        "expressed as a percentage of the total space in the "
-                        "Volume Group with the suffix %VG. Percentage of the "
-                        "changeble values like free space is not supported."
-                        ),
-                },
-                "resizefs": {
-                    "description": (
-                        "Resize underlying filesystem together with the "
-                        "logical volume using fsadm(8)."
-                    ),
-                    "type": "boolean"
-                },
-                "vg": {
-                    "description": ("Volume group name to resize logical "
-                                    "volume on."),
-                    "type": "string"
-                }
-            },
-            "additionalProperties": False,
-            "required": ["size"]
-        }
-    },
-}
-
-
-def get_volume_groups_info(unit, vg):
-    cmd = ("vgs --noheadings -o vg_name,size,free,vg_extent_size --units %s "
-           "--separator ';' %s") % (unit, vg)
-    try:
-        output = subprocess.check_output(cmd, shell=True,
-                                         stderr=subprocess.STDOUT)
-    except subprocess.CalledProcessError as exc:
-        raise Exception("Failed to get volume group info", exc.output)
-
-    vgs = []
-    for line in output.splitlines():
-        parts = line.strip().split(';')
-        vgs.append({
-            'name': parts[0],
-            'size': int(DECIMAL_REG.match(parts[1]).group(1)),
-            'free': int(DECIMAL_REG.match(parts[2]).group(1)),
-            'ext_size': int(DECIMAL_REG.match(parts[3]).group(1))
-        })
-    return vgs
-
-
-def get_logical_volume_info(unit, vg):
-    cmd = ("lvs -a --noheadings --nosuffix -o lv_name,size,lv_attr --units %s "
-           "--separator ';' %s") % (unit, vg)
-    try:
-        output = subprocess.check_output(cmd, shell=True,
-                                         stderr=subprocess.STDOUT)
-    except subprocess.CalledProcessError as exc:
-        raise Exception("Failed to get volume info", exc.output)
-
-    lvs = []
-
-    for line in output.splitlines():
-        parts = line.strip().split(';')
-        lvs.append({
-            'name': parts[0].replace('[', '').replace(']', ''),
-            'size': int(DECIMAL_REG.match(parts[1]).group(1)),
-        })
-    return lvs
-
-
-def normalize_to_pe(size, pe):
-    """ Make sure requested size is multiply of PE
-
-    PE is gathered from system with honor of provided units,
-    when volume size is set in Gigabytes, PE (4mb default) will
-    be shown as 0.
-    """
-
-    if pe > 0:
-        return (size // pe + 1) * pe
-
-    return size
-
-
-def main():
-    logging.basicConfig(
-        format='%(asctime)s - %(levelname)s - %(message)s'
-    )
-    LOG.setLevel(logging.INFO)
-
-    parser = argparse.ArgumentParser(
-        description=('Grow lvm partitions and theirs filesystems to '
-                     'specified sizes.')
-    )
-
-    group = parser.add_mutually_exclusive_group(required=True)
-    group.add_argument(
-        '--image-layout',
-        help='json based image layout',
-    )
-    group.add_argument(
-        '--image-layout-file',
-        help='Path to file with image layout',
-    )
-    args = parser.parse_args()
-
-    if args.image_layout_file:
-        with open(args.image_layout_file) as f:
-            layout_info = yaml.load(f)
-    else:
-        layout_info = yaml.load(args.image_layout)
-
-    LOG.info("Validating provided layout.")
-    try:
-        validate(layout_info, IMAGE_LAYOUT_SCHEMA)
-    except Exception as e:
-        LOG.error("Validation of provided layout failed.")
-        raise e
-
-    for part_name, part_layout in layout_info.iteritems():
-
-        size_opt = '--size'
-        size_unit = 'm'
-
-        size = part_layout['size']
-        vg = part_layout.get('vg', 'vg0')
-        resizefs = part_layout.get('resizefs', True)
-
-        if size:
-            if '+' in size:
-                raise Exception("Setting relative size is not supported.")
-            # LVCREATE(8) -l --extents option with percentage
-            elif '%' in size:
-                size_parts = size.split('%', 1)
-                size_percent = int(size_parts[0])
-                if size_percent > 100:
-                    raise Exception(
-                        "Size percentage cannot be larger than 100%")
-                size_whole = size_parts[1]
-                if size_whole == 'ORIGIN':
-                    raise Exception("Snapshot Volumes are not supported")
-                elif size_whole not in ['VG']:
-                    raise Exception("Relative sizes are not supported.")
-                size_opt = '--extents'
-                size_unit = ''
-            else:
-                # LVCREATE(8) -L --size option unit
-                if size[-1].lower() in 'bskmgtpe':
-                    size_unit = size[-1].lower()
-                    size = size[0:-1]
-
-        # when no unit, megabytes by default
-        if size_opt == '--extents':
-            unit = 'm'
-        else:
-            unit = size_unit
-
-        vgs = get_volume_groups_info(unit, vg)
-        this_volume_group = vgs[0]
-        pe = this_volume_group['ext_size']
-
-        lvs = get_logical_volume_info(unit, vg)
-
-        LOG.info("Volume group info: %s", vgs)
-        LOG.info("Logical Volume info: %s", lvs)
-
-        this_volume = [v for v in lvs if v['name'] == part_name][0]
-
-        LOG.info("Using %s for volume: %s", size_opt, this_volume)
-        if size_opt == '--extents':
-            size_free = this_volume_group['free']
-            if size_whole == 'VG':
-                size_requested = normalize_to_pe(
-                    size_percent * this_volume_group['size'] / 100, pe)
-
-            LOG.info("Request %s size for volume %s",
-                     size_requested, this_volume)
-            if this_volume['size'] > size_requested:
-                raise Exception("Redusing volume size in not supported.")
-            elif this_volume['size'] < size_requested:
-                if (size_free > 0) and (('+' not in size) or
-                   (size_free >= (size_requested - this_volume['size']))):
-                    cmd = "lvextend "
-                else:
-                    raise Exception(
-                        ("Logical Volume %s could not be extended. Not "
-                         "enough free space left (%s%s required / %s%s "
-                         "available)"),
-                        this_volume['name'],
-                        size_requested - this_volume['size'],
-                        unit, size_free, unit
-                    )
-                if resizefs:
-                    cmd += "--resizefs "
-
-                cmd = "%s -%s %s%s %s/%s" % (
-                    cmd, size_opt, size, size_unit, vg, this_volume['name'])
-                try:
-                    LOG.debug("Executing command: %s", cmd)
-                    output = subprocess.check_output(
-                        cmd,
-                        shell=True,
-                        stderr=subprocess.STDOUT)
-                except subprocess.CalledProcessError as exc:
-                    raise Exception(
-                        "Failed to resize volume %s. Exception: %s" % (
-                            part_name, exc.output))
-            else:
-                LOG.info("No need to resize volume %s.", part_name)
-        else:
-            cmd = "lvresize "
-            if normalize_to_pe(int(size), pe) > this_volume['size']:
-                if resizefs:
-                    cmd += "--resizefs "
-                cmd = "%s -%s %s%s %s/%s" % (
-                    cmd, size_opt, size, size_unit, vg, this_volume['name'])
-                try:
-                    LOG.debug("Executing command: %s", cmd)
-                    output = subprocess.check_output(
-                        cmd,
-                        shell=True,
-                        stderr=subprocess.STDOUT)
-                except subprocess.CalledProcessError as exc:
-                    raise Exception(
-                        "Failed to resize volume %s. Exception: %s" % (
-                            part_name, exc.output))
-
-            elif normalize_to_pe(int(size), pe) == this_volume['size']:
-                LOG.info("No need to resize volume %s.", part_name)
-            else:
-                raise Exception(
-                    "Redusing size in not supported for provided layout.")
-
-
-if __name__ == '__main__':
-    try:
-        main()
-    except Exception as e:
-        LOG.exception("Failed to apply image layout: %s", e)
-        sys.exit(1)
diff --git a/ubuntu-16.04/template.json b/ubuntu-16.04/template.json
index 6ffd6dd..076fdec 100644
--- a/ubuntu-16.04/template.json
+++ b/ubuntu-16.04/template.json
@@ -20,6 +20,10 @@
   },
   "provisioners": [
     {
+      "type": "shell-local",
+      "command": "cp -av ../common/files/scripts/growlvm.py files/scripts/growlvm.py"
+    },
+    {
       "type": "shell",
       "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} {{ .Path }}",
       "expect_disconnect": "true",