Browse code

Added ostreeinstaller back for kickstart.

Change-Id: Ieeb77ee8eeaded1474869d217cefc6bb1c76a886
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/2441
Reviewed-by: Danut Moraru <dmoraru@vmware.com>
Tested-by: gerrit-photon <photon-checkins@vmware.com>

xiaolin-vmware authored on 2017/04/15 09:28:00
Showing 3 changed files
... ...
@@ -5,5 +5,5 @@
5 5
                   "libffi","expat","linux","cpio","Linux-PAM","attr","libcap", "systemd","dbus",
6 6
                   "gzip", "sqlite","nspr","nss","popt","lua","rpm","gptfdisk","tar", "librepo",
7 7
                   "hawkey", "python2","python2-libs","pcre","glib", "tdnf", "python-requests",
8
-                  "grub2", "grub2-efi", "efibootmgr", "efivar","dracut", "curl", "dosfstools"]
8
+                  "grub2", "grub2-efi", "efibootmgr", "efivar","dracut", "curl", "ostree", "dosfstools"]
9 9
 }
... ...
@@ -5,6 +5,7 @@
5 5
 #    Author: Touseef Liaqat <tliaqat@vmware.com>
6 6
 
7 7
 from installer import Installer
8
+from ostreeinstaller import OstreeInstaller
8 9
 from ostreeserverinstaller import OstreeServerInstaller
9 10
 
10 11
 class InstallerContainer(object):
... ...
@@ -19,7 +20,9 @@ class InstallerContainer(object):
19 19
 
20 20
     def install(self, params):
21 21
         installer = None
22
-        if self.install_config['type'] == "ostree_server":
22
+        if self.install_config['type'] == "ostree_host":
23
+            installer = OstreeInstaller(self.install_config, self.maxy, self.maxx, self.iso_installer, self.rpm_path, self.log_path, self.ks_config)
24
+        elif self.install_config['type'] == "ostree_server":
23 25
             installer = OstreeServerInstaller(self.install_config, self.maxy, self.maxx, self.iso_installer, self.rpm_path, self.log_path, self.ks_config)
24 26
         else:
25 27
             installer = Installer(self.install_config, self.maxy, self.maxx, self.iso_installer, self.rpm_path, self.log_path, self.ks_config)
26 28
new file mode 100755
... ...
@@ -0,0 +1,171 @@
0
+#!/usr/bin/python2
1
+#
2
+#    Copyright (C) 2015 vmware inc.
3
+#
4
+#    Author: Touseef Liaqat <tliaqat@vmware.com>
5
+
6
+import os
7
+import glob
8
+import modules.commons
9
+from installer import Installer
10
+from actionresult import ActionResult
11
+
12
+class OstreeInstaller(Installer):
13
+
14
+    def __init__(self, install_config, maxy = 0, maxx = 0, iso_installer = False, rpm_path = "../stage/RPMS", log_path = "../stage/LOGS", ks_config = None):
15
+        Installer.__init__(self, install_config, maxy, maxx, iso_installer, rpm_path, log_path, ks_config)
16
+        self.repo_config = {}
17
+        self.repo_read_conf()
18
+
19
+    def get_ostree_repo_url(self):
20
+        self.default_repo = 'default_repo' in self.install_config and self.install_config['default_repo'];
21
+        if not self.default_repo:
22
+            self.ostree_repo_url = self.install_config['ostree_repo_url']
23
+            self.ostree_ref = self.install_config['ostree_repo_ref']
24
+
25
+    def repo_read_conf(self):
26
+        with open("ostree-release-repo.conf") as repo_conf:
27
+            for line in repo_conf:
28
+                name, value = line.partition("=")[::2]
29
+                self.repo_config[name] = value.strip(' \n\t\r')
30
+
31
+    def pull_repo(self, repo_url, repo_ref):
32
+        if self.default_repo:
33
+            self.run("ostree remote add --repo={}/ostree/repo --set=gpg-verify=false photon {}".format(self.photon_root, repo_url), "Adding OSTree remote")
34
+            self.run("ostree pull-local --repo={}/ostree/repo {}".format(self.photon_root, self.local_repo_path), "Pulling OSTree repo")
35
+            self.run("mv {}/ostree/repo/refs/heads {}/ostree/repo/refs/remotes/photon".format(self.photon_root, self.photon_root))
36
+            self.run("mkdir -p {}/ostree/repo/refs/heads".format(self.photon_root, self.photon_root))
37
+        else:
38
+            self.run("ostree remote add --repo={}/ostree/repo --set=gpg-verify=false photon {}".format(self.photon_root, repo_url), "Adding OSTree remote")
39
+            self.run("ostree pull --repo={}/ostree/repo photon {}".format(self.photon_root, repo_ref), "Pulling OSTree remote repo")
40
+
41
+    def deploy_ostree(self, repo_url, repo_ref):
42
+        self.run("ostree admin --sysroot={} init-fs {}".format(self.photon_root, self.photon_root), "Initializing OSTree filesystem")
43
+        self.pull_repo(repo_url, repo_ref)
44
+        self.run("ostree admin --sysroot={} os-init photon ".format(self.photon_root), "OSTree OS Initializing")
45
+        self.run("ostree admin --sysroot={} deploy --os=photon photon:{}".format(self.photon_root, repo_ref), "Deploying")
46
+
47
+    def do_systemd_tmpfiles_commands(self, commit_number):
48
+        prefixes = ["/var/home",
49
+            "/var/roothome",
50
+            "/var/lib/rpm",
51
+            "/var/opt",
52
+            "/var/srv",
53
+            "/var/userlocal",
54
+            "/var/mnt",
55
+            "/var/spool/mail"]
56
+
57
+        for prefix in prefixes:
58
+            command = "systemd-tmpfiles --create --boot --root={}/ostree/deploy/photon/deploy/{}.0 --prefix={}".format(self.photon_root, commit_number, prefix)
59
+            self.run(command)
60
+
61
+    def mount_devices_in_deployment(self, commit_number):
62
+        for command in ["mount -t bind -o bind,defaults /dev  {}/ostree/deploy/photon/deploy/{}.0/dev",
63
+            "mount -t devpts -o gid=5,mode=620 devpts  {}/ostree/deploy/photon/deploy/{}.0/dev/pts",
64
+            "mount -t tmpfs -o defaults tmpfs  {}/ostree/deploy/photon/deploy/{}.0/dev/shm",
65
+            "mount -t proc -o defaults proc  {}/ostree/deploy/photon/deploy/{}.0/proc",
66
+            "mount -t bind -o bind,defaults /run  {}/ostree/deploy/photon/deploy/{}.0/run",
67
+            "mount -t sysfs -o defaults sysfs  {}/ostree/deploy/photon/deploy/{}.0/sys" ]:
68
+            self.run(command.format(self.photon_root, commit_number))
69
+
70
+    def get_commit_number(self, ref):
71
+        fileName = os.path.join(self.photon_root, "ostree/repo/refs/remotes/photon/{}".format(ref))
72
+        commit_number = None
73
+        with open (fileName, "r") as file:
74
+            commit_number = file.read().replace('\n', '')
75
+        return commit_number
76
+
77
+    def unsafe_install(self, params):
78
+        self.org_photon_root = self.photon_root
79
+        sysroot_ostree = os.path.join(self.photon_root, "ostree")
80
+        sysroot_boot = os.path.join(self.photon_root, "boot")
81
+        loader0 = os.path.join(sysroot_boot, "loader.0")
82
+        loader1 = os.path.join(sysroot_boot, "loader.1")
83
+
84
+        boot0 = os.path.join(sysroot_ostree, "boot.0")
85
+        boot1 = os.path.join(sysroot_ostree, "boot.1")
86
+
87
+        boot01 = os.path.join(sysroot_ostree, "boot.0.1")
88
+        boot11 = os.path.join(sysroot_ostree, "boot.1.1")
89
+
90
+        self.get_ostree_repo_url()
91
+
92
+        self.window.show_window()
93
+        self.progress_bar.initialize("Initializing installation...")
94
+        self.progress_bar.show()
95
+        
96
+        self.execute_modules(modules.commons.PRE_INSTALL)
97
+
98
+        disk = self.install_config['disk']['disk']
99
+        self.run("sgdisk -d 1 -d 2 -n 1::+2M -n 2::+300M -n 3: -p {}".format(disk), "Updating partition table for OSTree")
100
+        self.run("sgdisk -t1:ef02 {}".format(disk))
101
+        self.run("mkfs -t ext4 {}2".format(disk))
102
+        self.run("mkfs -t ext4 {}3".format(disk))
103
+        self.run("mount {}3 {}".format(disk, self.photon_root))
104
+        self.run("mkdir -p {} ".format(sysroot_boot))
105
+        self.run("mount {}2 {}".format(disk, sysroot_boot))
106
+
107
+        #Setup the disk
108
+        self.run("dd if=/dev/zero of={}/swapfile bs=1M count=64".format(self.photon_root))
109
+        self.run("chmod 600 {}/swapfile".format(self.photon_root))
110
+        self.run("mkswap -v1 {}/swapfile".format(self.photon_root))
111
+        self.run("swapon {}/swapfile".format(self.photon_root))
112
+
113
+        if self.default_repo:
114
+            self.run("rm -rf /installer/boot")
115
+            self.run("mkdir -p {}/repo".format(self.photon_root))
116
+            self.progress_bar.show_loading("Unpacking local OSTree repo")
117
+            self.run("tar --warning=none -xf /mnt/cdrom/ostree-repo.tar.gz -C {}/repo".format(self.photon_root))
118
+            self.local_repo_path = "{}/repo".format(self.photon_root)
119
+            self.ostree_repo_url = self.repo_config['OSTREEREPOURL']
120
+            self.ostree_ref = self.repo_config['OSTREEREFS']
121
+            self.progress_bar.update_loading_message("Unpacking done")
122
+
123
+
124
+        self.deploy_ostree(self.ostree_repo_url, self.ostree_ref)
125
+
126
+        self.run("swapoff -a")
127
+        self.run("rm {}/swapfile".format(self.photon_root))
128
+
129
+        commit_number = self.get_commit_number(self.ostree_ref)
130
+        self.do_systemd_tmpfiles_commands(commit_number)
131
+
132
+        self.mount_devices_in_deployment(commit_number)
133
+        deployment = os.path.join(self.photon_root, "ostree/deploy/photon/deploy/" + commit_number + ".0/")
134
+
135
+        deployment_boot = os.path.join(deployment, "boot")
136
+        deployment_sysroot = os.path.join(deployment, "sysroot")
137
+
138
+        self.run("mv {} {}".format(loader1, loader0))
139
+        self.run("mv {} {}".format(boot1, boot0))
140
+        self.run("mv {} {}".format(boot11, boot01))
141
+        self.run("mount --bind {} {}".format(sysroot_boot, deployment_boot))
142
+        self.run("mount --bind {} {}".format(self.photon_root, deployment_sysroot))
143
+        self.run("chroot {} bash -c \"grub2-install /dev/sda\"".format(deployment))
144
+        self.run("chroot {} bash -c \"grub2-mkconfig -o /boot/grub2/grub.cfg\"".format(deployment))
145
+        self.run("mv {} {}".format(loader0, loader1))
146
+        self.run("mv {} {}".format(boot0, boot1))
147
+        self.run("mv {} {}".format(boot01, boot11))
148
+        self.run("chroot {} bash -c \"ostree admin instutil set-kargs root=/dev/sda3 \"".format(deployment))
149
+        sysroot_grub2_grub_cfg = os.path.join(self.photon_root, "boot/grub2/grub.cfg")
150
+        self.run("ln -sf ../loader/grub.cfg {}".format(sysroot_grub2_grub_cfg))
151
+        self.run("mv {} {}".format(loader1, loader0))
152
+        self.run("mv {} {}".format(boot1, boot0))
153
+        self.run("mv {} {}".format(boot11, boot01))
154
+
155
+
156
+        deployment_fstab = os.path.join(deployment, "etc/fstab")
157
+        self.run("echo \"/dev/sda3    /        ext4   defaults,barrier,noatime,noacl,data=ordered 1 1  \" >> {} ".format(deployment_fstab), "Adding / mount point in fstab")
158
+        self.run("echo \"/dev/sda2    /boot    ext4   defaults   1 2  \" >> {} ".format(deployment_fstab), "Adding /boot mount point in fstab")
159
+        self.run("mount --bind {} {}".format(deployment, self.photon_root))
160
+        self.progress_bar.update_loading_message("Starting post install modules")
161
+        self.execute_modules(modules.commons.POST_INSTALL)
162
+        self.progress_bar.update_loading_message("Unmounting disks")
163
+        self.run("{} {} {}".format(self.unmount_disk_command, '-w', self.photon_root))
164
+        self.progress_bar.update_loading_message("Ready to restart")
165
+        self.progress_bar.hide()
166
+        self.window.addstr(0, 0, 'Congratulations, Photon RPM-OSTree Host has been installed in {0} secs.\n\nPress any key to continue to boot...'.format(self.progress_bar.time_elapsed))
167
+        if self.ks_config == None:
168
+            self.window.content_window().getch()
169
+        return ActionResult(True, None)
170
+