On Fri, Jun 28, 2019 at 07:05:18PM +0300, Athina Plaskasoviti wrote: > Usage: > --cloud-init > > Signed-off-by: Athina Plaskasoviti <athina.plaskasoviti@xxxxxxxxx> > --- > virt-install | 5 +++ > virtinst/cli.py | 25 +++++++++++++ > virtinst/install/cloudinit.py | 57 +++++++++++++++++++++++++++++ > virtinst/install/installer.py | 17 +++++++++ > virtinst/install/installerinject.py | 20 +++++----- > 5 files changed, 115 insertions(+), 9 deletions(-) > create mode 100644 virtinst/install/cloudinit.py > > diff --git a/virt-install b/virt-install > index ee2b9006..1ccf7a31 100755 > --- a/virt-install > +++ b/virt-install > @@ -444,6 +444,9 @@ def build_installer(options, guest, installdata): > installer.set_initrd_injections(options.initrd_inject) > if options.autostart: > installer.autostart = True > + if options.cloud_init: > + cloudinit_data = cli.parse_cloud_init(options.cloud_init) > + installer.set_cloudinit_data(cloudinit_data) > > return installer > > @@ -821,6 +824,8 @@ def parse_args(): > help=_("Perform an unattended installation")) > insg.add_argument("--install", > help=_("Specify fine grained install options")) > + insg.add_argument("--cloud-init", nargs="?", const=1, > + help=_("Perform a cloud image installation, configuring cloud-init")) > > # Takes a URL and just prints to stdout the detected distro name > insg.add_argument("--test-media-detection", help=argparse.SUPPRESS) > diff --git a/virtinst/cli.py b/virtinst/cli.py > index 9a1fe2f6..9a6badcd 100644 > --- a/virtinst/cli.py > +++ b/virtinst/cli.py > @@ -28,6 +28,7 @@ from .nodedev import NodeDevice > from .osdict import OSDB > from .storage import StoragePool, StorageVolume > from .install.unattended import UnattendedData > +from .install.cloudinit import CloudInitData > > > ########################## > @@ -1602,6 +1603,30 @@ def parse_install(optstr): > return installdata > > > +######################## > +# --cloud-init parsing # > +######################## > + > +class ParserCloudInit(VirtCLIParser): > + cli_arg_name = "cloud-init" > + > + @classmethod > + def _init_class(cls, **kwargs): > + VirtCLIParser._init_class(**kwargs) > + cls.add_arg("root-password", "root_password") > + > + > +def parse_cloud_init(optstr): > + ret = CloudInitData() > + if optstr == 1: > + # This means bare --cloud-init, so there's nothing to parse > + return ret > + > + parser = ParserCloudInit(optstr) > + parser.parse(ret) > + return ret > + > + > ###################### > # --location parsing # > ###################### > diff --git a/virtinst/install/cloudinit.py b/virtinst/install/cloudinit.py > new file mode 100644 > index 00000000..41667f4b > --- /dev/null > +++ b/virtinst/install/cloudinit.py > @@ -0,0 +1,57 @@ > +import tempfile > +import random > +import string > +import time > +from ..logger import log > + > + > +class CloudInitData(): > + root_password = None > + > + > +def create_metadata(scratchdir, hostname=None): > + if hostname: > + instance = hostname > + else: > + hostname = instance = "localhost" > + content = 'instance-id: %s\n' % instance > + content += 'hostname: %s\n' % hostname > + log.debug("Generated cloud-init metadata:\n%s", content) > + > + fileobj = tempfile.NamedTemporaryFile( > + prefix="virtinst-", suffix="-metadata", > + dir=scratchdir, delete=False) > + filename = fileobj.name > + > + with open(filename, "w") as f: > + f.write(content) > + return filename > + > + > +def create_userdata(scratchdir, cloudinit_data, username=None, password=None): > + if not password: > + password = "" > + for dummy in range(16): > + password += random.choice(string.ascii_letters + string.digits) > + content = "#cloud-config\n" > + if username: > + content += "name: %s\n" % username > + if cloudinit_data.root_password == "generate": > + pass > + else: > + content += "password: %s\n" % password > + log.debug("Generated password for first boot: \n%s", password) > + time.sleep(20) > + content += "runcmd:\n" > + content += "- [ sudo, touch, /etc/cloud/cloud-init.disabled ]\n" > + log.debug("Generated cloud-init userdata:\n%s", content) This message is going to leak the root password too. It is nice to log the cloud init data though, so we need a fix to scrub the actual root password from it before logging. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list