Browse Source

Merge "Remove support for CoreOS images"

tags/5.0.0
Zuul 1 month ago
parent
commit
03713c5644
31 changed files with 20 additions and 2007 deletions
  1. 0
    59
      Dockerfile
  2. 0
    5
      bindep.txt
  3. 3
    6
      doc/source/admin/rescue.rst
  4. 2
    71
      doc/source/admin/troubleshooting.rst
  5. 9
    44
      doc/source/install/index.rst
  6. 0
    28
      imagebuild/coreos/Makefile
  7. 0
    102
      imagebuild/coreos/README.rst
  8. 0
    28
      imagebuild/coreos/build_coreos_image.sh
  9. 0
    472
      imagebuild/coreos/coreos-oem-inject.py
  10. 0
    53
      imagebuild/coreos/docker_build.bash
  11. 0
    16
      imagebuild/coreos/docker_clean.bash
  12. 0
    55
      imagebuild/coreos/full_trusty_build.sh
  13. 0
    168
      imagebuild/coreos/iso-image-create
  14. 0
    265
      imagebuild/coreos/oem/cloud-config.yml
  15. 0
    37
      imagebuild/coreos/oem/finalize_rescue.sh
  16. 0
    5
      imagebuild/coreos/oem/rescue-dhcp-config.network
  17. 0
    11
      imagebuild/coreos/pin_latest_coreos.sh
  18. 0
    7
      imagebuild/coreos/version.txt
  19. 0
    5
      playbooks/ironic-python-agent-buildimage/run.yaml
  20. 0
    15
      playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/post.yaml
  21. 0
    111
      playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/run.yaml
  22. 0
    15
      playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/post.yaml
  23. 0
    108
      playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/run.yaml
  24. 0
    15
      playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/post.yaml
  25. 0
    112
      playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/run.yaml
  26. 0
    15
      playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/post.yaml
  27. 0
    108
      playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/run.yaml
  28. 6
    0
      releasenotes/notes/no-coreos-3345cc69009dead9.yaml
  29. 0
    9
      zuul.d/ironic-python-agent-jobs.yaml
  30. 0
    51
      zuul.d/legacy-ironic-jobs.yaml
  31. 0
    11
      zuul.d/project.yaml

+ 0
- 59
Dockerfile View File

@@ -1,59 +0,0 @@
1
-FROM debian:stretch
2
-
3
-# The add is before the RUN to ensure we get the latest version of packages
4
-# Docker will cache RUN commands, but because the SHA1 of the dir will be
5
-# different it will not cache this layer
6
-ADD . /tmp/ironic-python-agent
7
-
8
-# Copy the proxy.sh script which copies the proxy settings from the host
9
-# environment (if they are set). This file will be dynamically created by
10
-# imagebuild/coreos/docker_build.bash
11
-# TODO(jlvilla): Once Docker 1.9 is widely deployed, switch to using the 'ARG'
12
-# command which was added in Docker 1.9. Currently Ubuntu 14.04 uses Docker
13
-# 1.6. Using the ARG command will be a much cleaner solution.
14
-COPY proxy.sh /usr/bin/proxy.sh
15
-
16
-# Ensure we hit a single mirror for builds, since httpredir is flakey
17
-RUN sed -i 's/httpredir/http.us/g' /etc/apt/sources.list
18
-
19
-# Install requirements: Python for ironic-python-agent, others for putting an
20
-# image on disk
21
-RUN proxy.sh apt-get update && \
22
-    proxy.sh apt-get -y upgrade && \
23
-    proxy.sh apt-get install -y --no-install-recommends netbase gdisk \
24
-        python2.7 python2.7-dev python-pip qemu-utils parted hdparm \
25
-        util-linux genisoimage git gcc bash coreutils tgt dmidecode \
26
-        ipmitool psmisc dosfstools bsdmainutils open-iscsi udev \
27
-        smartmontools iptables lshw mdadm
28
-
29
-# Some cleanup
30
-RUN proxy.sh apt-get -y autoremove && \
31
-    proxy.sh apt-get clean
32
-
33
-# Before cleaning mark packages that are required so they are not removed
34
-RUN apt-mark manual python-setuptools
35
-RUN apt-mark manual python-minimal
36
-
37
-# Install requirements separately, because pip understands a git+https url
38
-# while setuptools doesn't
39
-RUN proxy.sh pip install --upgrade pip setuptools
40
-RUN proxy.sh pip install -c /tmp/ironic-python-agent/upper-constraints.txt --no-cache-dir -r /tmp/ironic-python-agent/requirements.txt
41
-
42
-# This will succeed because all the dependencies were installed previously
43
-RUN proxy.sh pip install -c /tmp/ironic-python-agent/upper-constraints.txt --no-cache-dir /tmp/ironic-python-agent
44
-
45
-# Remove no longer needed packages
46
-# NOTE(jroll) leave git to avoid strange apt issues in downstream Dockerfiles
47
-# that may inherit from this one.
48
-RUN proxy.sh apt-get -y purge gcc-4.6 gcc python2.7-dev && \
49
-    proxy.sh apt-get -y autoremove && \
50
-    proxy.sh apt-get clean
51
-RUN rm -rf /tmp/ironic-python-agent
52
-RUN rm -rf /var/lib/apt/lists/*
53
-
54
-# Remove metadata_csum option when creating filesystems
55
-# since cirros doesn't support it.
56
-# This option was added in Debian stretch as default.
57
-RUN sed -i 's/,metadata_csum//g' /etc/mke2fs.conf
58
-
59
-CMD [ "/usr/local/bin/ironic-python-agent" ]

+ 0
- 5
bindep.txt View File

@@ -14,11 +14,6 @@ gettext [test]
14 14
 
15 15
 # these are needed to build a deploy ramdisk
16 16
 
17
-# NOTE apparmor is an undeclared dependency for docker on ubuntu,
18
-# see https://github.com/docker/docker/issues/9745
19
-apparmor [platform:dpkg imagebuild]
20
-docker.io [platform:dpkg imagebuild]
21
-docker-io [platform:rpm imagebuild]
22 17
 gnupg [imagebuild]
23 18
 squashfs-tools [platform:dpkg platform:redhat imagebuild]
24 19
 squashfs [platform:suse imagebuild]

+ 3
- 6
doc/source/admin/rescue.rst View File

@@ -28,12 +28,10 @@ in rescue mode.
28 28
 The below has information about supported images that may be built to use
29 29
 rescue mode.
30 30
 
31
-CoreOS
32
-------
31
+DIB
32
+---
33 33
 
34
-The CoreOS image supports rescue mode when used with DHCP tenant networks. You
35
-may follow the normal process for `building a CoreOS ironic-python-agent
36
-image`_ to create an image that supports rescue mode.
34
+The DIB image supports rescue mode when used with DHCP tenant networks.
37 35
 
38 36
 After the ``finalize_rescue`` command completes, DHCP will be configured on all
39 37
 network interfaces, and a `rescue` user will be created with the specified
@@ -49,5 +47,4 @@ After the ``finalize_rescue`` command completes, DHCP will be configured on all
49 47
 network interfaces, and a `rescue` user will be created with the specified
50 48
 ``rescue_password``.
51 49
 
52
-.. _`building a CoreOS ironic-python-agent image`: https://opendev.org/openstack/ironic-python-agent/src/branch/master/imagebuild/coreos/README.rst
53 50
 .. _`build a TinyIPA image`: https://opendev.org/openstack/ironic-python-agent-builder/src/branch/master/tinyipa/README.rst

+ 2
- 71
doc/source/admin/troubleshooting.rst View File

@@ -13,16 +13,6 @@ the image. Below we will cover several ways to do this.
13 13
 
14 14
 Access via ssh
15 15
 --------------
16
-CoreOS
17
-~~~~~~
18
-To enable the ``core`` user on pre-built or CoreOS images a ssh public key
19
-will need to added. To do this you will need to:
20
-
21
-- Add ``sshkey="ssh-rsa AAAA..."`` to pxe_append_params setting in ironic.conf
22
-  file
23
-- Restart the ironic-conductor with the command
24
-  ``service ironic-conductor restart``
25
-- ``ssh core@<ip-address-of-node>``
26 16
 
27 17
 diskimage-builder (DIB)
28 18
 ~~~~~~~~~~~~~~~~~~~~~~~
@@ -72,43 +62,6 @@ Access via console
72 62
 If you need to use console access, passwords must be enabled there are a
73 63
 couple ways to enable this depending on how the IPA image was created:
74 64
 
75
-CoreOS
76
-~~~~~~
77
-CoreOS has support for auto login on the console [4]_. This can be enabled by:
78
-
79
-- Adding ``coreos.autologin`` to pxe_append_params setting
80
-  in the ``ironic.conf`` file. See [4]_ for more information on using
81
-  autologin.
82
-
83
-If you do not wish to enable auto login users can be added to CoreOS by editing
84
-the cloud-config.yml file and adding the following [2]_::
85
-
86
-  users:
87
-    - name: username
88
-      passwd: $6$5s2u6/jR$un0AvWnqilcgaNB3Mkxd5... <example password hash>
89
-      groups:
90
-        - sudo
91
-
92
-If using a pre-built image the cloud-config.yml must first be extracted::
93
-
94
-  mkdir tmp_folder
95
-  cd tmp_folder
96
-  zcat ../coreos_production_pxe_image-oem-stable-mitaka.cpio | cpio --extract --make-directories
97
-
98
-To create a password hash the mkpasswd command can be used::
99
-
100
-  mkpasswd --method=SHA-512 --rounds=4096
101
-
102
-After adding the user block with your favorite editor recompress the image::
103
-
104
-  find . | cpio --create --format='newc' |gzip -c -9 > ../coreos_production_pxe_image-oem-stable-mitaka.cpio.NEW.gz
105
-
106
-An alternative to editing the embedded cloud-config.yml [4]_ file is to pass a
107
-new one on the kernel command line by:
108
-
109
-- adding ``cloud-config-url=http://example.com/cloud-config.yml``
110
-  to pxe_append_params setting in the ``ironic.conf`` file
111
-
112 65
 diskimage-builder (DIB)
113 66
 ~~~~~~~~~~~~~~~~~~~~~~~
114 67
 Users wishing to use password access can be add the dynamic-login [0]_ or the
@@ -131,7 +84,7 @@ Example::
131 84
   export DIB_DEV_USER_USERNAME=username
132 85
   export DIB_DEV_USER_PWDLESS_SUDO=yes
133 86
   export DIB_DEV_USER_PASSWORD=PASSWORD
134
-  disk-image-create -o /path/to/custom-ipa debian ironic-agent devuser
87
+  ironic-python-agent-builder -o /path/to/custom-ipa -e devuser debian
135 88
 
136 89
 tinyipa
137 90
 ~~~~~~~
@@ -152,20 +105,6 @@ add ``ipa-debug=1`` to the kernel command line. To do this:
152 105
 - Restart the ironic-conductor with the command
153 106
   ``service ironic-conductor restart``
154 107
 
155
-Another method is to edit the cloud-config.yml file.  IPA's instructions on
156
-building a custom image can be found at [3]_.
157
-
158
-This essentially boils down to the following steps:
159
-
160
-#. ``git clone https://opendev.org/openstack/ironic-python-agent``
161
-#. ``cd ironic-python-agent``
162
-#. ``pip install -r ./requirements.txt``
163
-#. If not installed, please install the docker container engine. [5]_
164
-#. ``cd imagebuild/coreos``
165
-#. Edit ``oem/cloud-config.yml`` and add ``--debug`` to the end of the
166
-   ExecStart setting for the ironic-python-agent.service unit.
167
-#. Execute ``make`` to complete the build process.
168
-
169 108
 If the system is running and uses systemd then editing the services file
170 109
 will be required.
171 110
 
@@ -183,14 +122,10 @@ Retrieving the IPA logs will differ depending on which base image was used.
183 122
 
184 123
   - logs will be found in the /var/log/ folder.
185 124
 
186
-* Operating system that do use ``systemd`` (ie Fedora 22, CoreOS)
125
+* Operating system that do use ``systemd`` (ie Fedora, CentOS, RHEL)
187 126
 
188 127
   - logs may be viewed with ``sudo journalctl -u ironic-python-agent``
189 128
 
190
-  .. note::
191
-      sudo is not required with the CoreOS images.
192
-
193
-
194 129
 Manually restart IPA
195 130
 ====================
196 131
 
@@ -208,7 +143,3 @@ References
208 143
 ==========
209 144
 .. [0] `Dynamic-login DIB element`: https://github.com/openstack/diskimage-builder/tree/master/diskimage_builder/elements/dynamic-login
210 145
 .. [1] `DevUser DIB element`: https://github.com/openstack/diskimage-builder/tree/master/diskimage_builder/elements/devuser
211
-.. [2] `Add User to CoreOS`: https://coreos.com/os/docs/latest/adding-users.html
212
-.. [3] `IPA image build reference`: https://github.com/openstack/ironic-python-agent/tree/master/imagebuild/coreos/README.rst
213
-.. [4] `Booting CoreOS via PXE`: https://coreos.com/os/docs/latest/booting-with-pxe.html
214
-.. [5] `Install docker engine`: https://docs.docker.com/engine/installation/

+ 9
- 44
doc/source/install/index.rst View File

@@ -8,46 +8,19 @@ Unlike most other python software, you must build an IPA ramdisk image before
8 8
 use. This is because it's not installed in an operating system, but instead is
9 9
 run from within a ramdisk.
10 10
 
11
-CoreOS
12
-------
13
-One way to build a ramdisk image for IPA is with the CoreOS image [0]_.
14
-Prebuilt copies of the CoreOS image, suitable for pxe, are available on
15
-`tarballs.openstack.org <https://tarballs.openstack.org/ironic-python-agent/coreos/files/>`__.
16
-
17
-Build process
18
-~~~~~~~~~~~~~
19
-On a high level, the build steps are as follows:
20
-
21
-1) A docker build is performed using the ``Dockerfile`` in the root of the
22
-   ironic-python-agent project.
23
-2) The resulting docker image is exported to a filesystem image.
24
-3) The filesystem image, along with a cloud-config.yml [1]_, are embedded into
25
-   the CoreOS PXE image at /usr/share/oem/.
26
-4) On boot, the ironic-python-agent filesystem image is extracted and run
27
-   inside a systemd-nspawn container. /usr/share/oem is mounted into this
28
-   container as /mnt.
29
-
30
-Customizing the image
31
-~~~~~~~~~~~~~~~~~~~~~
32
-There are several methods you can use to customize the IPA ramdisk:
33
-
34
-* Embed SSH keys by putting an authorized_keys file in /usr/share/oem/
35
-* Add your own hardware managers by modifying the Dockerfile to install
36
-  additional python packages.
37
-* Modify the cloud-config.yml [1]_ to perform additional tasks at boot time.
38
-
39 11
 diskimage-builder
40 12
 -----------------
41
-Another way to build a ramdisk image for IPA is by using diskimage-builder
42
-[2]_. The ironic-agent diskimage-builder element builds the IPA ramdisk, which
43
-installs all the required packages and configures services as needed.
13
+
14
+A production ready way to build a ramdisk image for IPA is by using
15
+ironic-python-agent-builder_. The ``ironic-python-agent-ramdisk``
16
+diskimage-builder element builds the IPA ramdisk, which installs all the
17
+required packages and configures services as needed.
44 18
 
45 19
 tinyipa
46 20
 -------
47 21
 
48
-Now, this method is provided
49
-by `Ironic Python Agent Builder <https://opendev.org/openstack/ironic-python-agent-builder>`_
50
-repo. It provides a set of scripts to build a
22
+Now this method is provided by ironic-python-agent-builder_
23
+repository. It provides a set of scripts to build a
51 24
 Tiny Core Linux-based deployment kernel and ramdisk (code name ``tinyipa``)
52 25
 under ``tinyipa`` folder.
53 26
 
@@ -74,15 +47,12 @@ packaged with IPA, pass it an initrd and kernel. e.g.::
74 47
   ./iso-image-create -o /path/to/output.iso -i /path/to/ipa.initrd -k /path/to/ipa.kernel
75 48
 
76 49
 This is a generic tool that can be used to combine any initrd and kernel into
77
-a suitable ISO for booting, and so should work against any IPA ramdisk created
50
+a suitable ISO for booting, and so should work against any IPA ramdisk.
78 51
 
79 52
 IPA Flags
80 53
 =========
81 54
 
82 55
 You can pass a variety of flags to IPA on start up to change its behavior.
83
-If you're using the CoreOS image, you can modify the
84
-ironic-python-agent.service unit in cloud-config.yaml [3]_.
85 56
 
86 57
 * ``--standalone``: This disables the initial lookup and heartbeats to Ironic.
87 58
   Lookup sends some information to Ironic in order to determine Ironic's node
@@ -186,13 +156,7 @@ Operators wishing to build their own hardware managers should reference
186 156
 the documentation available at `Hardware Managers`_.
187 157
 
188 158
 .. _Hardware Managers: https://docs.openstack.org/ironic-python-agent/latest/contributor/hardware_managers.html
189
-
190
-References
191
-==========
192
-.. [0] CoreOS PXE Images - https://coreos.com/docs/running-coreos/bare-metal/booting-with-pxe/
193
-.. [1] CoreOS Cloud Init - https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/
194
-.. [2] DIB Element for IPA - https://docs.openstack.org/diskimage-builder/latest/elements/ironic-agent/README.html
195
-.. [3] cloud-config.yaml - https://opendev.org/openstack/ironic-python-agent/src/branch/master/imagebuild/coreos/oem/cloud-config.yml
159
+.. _ironic-python-agent-builder: https://docs.openstack.org/ironic-python-agent-builder
196 160
 
197 161
 Indices and tables
198 162
 ==================

+ 0
- 28
imagebuild/coreos/Makefile View File

@@ -1,28 +0,0 @@
1
-BUILD_DIR=UPLOAD
2
-KERNEL=$(BUILD_DIR)/coreos_production_pxe.vmlinuz
3
-INITRD=$(BUILD_DIR)/coreos_production_pxe_image-oem.cpio.gz
4
-
5
-default: docker coreos
6
-
7
-docker: 
8
-	./docker_build.bash
9
-
10
-coreos:
11
-	mkdir -p $(BUILD_DIR)
12
-	./coreos-oem-inject.py oem $(BUILD_DIR)
13
-
14
-clean:
15
-	rm -rf ironic-python-agent
16
-	rm -f oem/container.tar.gz
17
-	rm -f $(INITRD)
18
-	rm -f $(KERNEL)
19
-	rm -rf ../.image_cache
20
-
21
-docker_clean:
22
-	./docker_clean.bash
23
-
24
-iso: docker coreos
25
-	./iso-image-create -o $(BUILD_DIR)/ipa-coreos.iso -i $(INITRD) -k $(KERNEL)
26
-
27
-pin_latest:
28
-	./pin_latest_coreos.sh

+ 0
- 102
imagebuild/coreos/README.rst View File

@@ -1,102 +0,0 @@
1
-ironic-python-agent CoreOS Image builder.
2
-=========================================
3
-
4
-Builds a CoreOS image suitable for running the ironic-python-agent on a
5
-server.
6
-
7
-Requirements
8
-============
9
-
10
-Must be run from a linux machine with a working docker installation and
11
-python-pip
12
-
13
-Run the following locally or from a virtualenv to install the python
14
-requirements
15
-
16
-::
17
-
18
-    pip install -r requirements.txt
19
-
20
-Booting the agent with this image
21
-=================================
22
-
23
-PXE
24
----
25
-
26
-The image is typically booted via PXE. Here's an example ipxe
27
-configuration (replace my-web-server with the IP/hostname of the http
28
-server hosting your image):
29
-
30
-::
31
-
32
-    #!ipxe
33
-
34
-    dhcp
35
-    kernel http://my-web-server/coreos_production_pxe.vmlinuz
36
-    initrd http://my-web-server/coreos_production_pxe_image-oem.cpio.gz
37
-    boot
38
-
39
-You can either embed a configuration file into the image, or set
40
-configuration options via the kernel command line. The only value most
41
-people will need is:
42
-
43
--  ``ipa-api-url=http://ironic-api-server:6385``
44
-
45
-But any config value supported in the agent can be given to the agent
46
-via the kernel command line, which allows the use of the same agent
47
-image across environments because it contains no state.
48
-
49
-Virtual Media
50
--------------
51
-
52
-Openstack Ironic supports booting IPA via virtual media in the form of
53
-an ISO image. Please see Ironic documentation for details on running in
54
-this configuration.
55
-
56
-Getting the agent
57
-=================
58
-
59
-Download
60
---------
61
-
62
-If you don't want to build your own image, you can download a copy of
63
-ironic-python-agent ramdisk and kernel, built using CoreOS, at:
64
-https://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe-master.vmlinuz
65
-and
66
-https://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem-master.cpio.gz
67
-
68
-"master" may be replaced with "stable-$branch" (e.g. "stable-mitaka") to
69
-download an image built from the stable/$branch (e.g. stable/mitaka) version
70
-of ironic-python-agent.
71
-
72
-Build instructions
73
-------------------
74
-
75
-To create a docker repository and embed it into a CoreOS pxe image:
76
-
77
-::
78
-
79
-    make
80
-
81
-To just create the docker repository in oem/container.tar.gz:
82
-
83
-::
84
-
85
-    make docker
86
-
87
-To embed the oem/ directory into a CoreOS pxe image:
88
-
89
-Note: In order to have the ability to ssh into the created image, you
90
-need to pass ssh keys in via the kernel command line for CoreOS, or
91
-create oem/authorized\_keys with the keys you need added before building
92
-the image.
93
-
94
-::
95
-
96
-    make coreos
97
-
98
-To create a CoreOS ISO image to boot with virtual media:
99
-
100
-::
101
-
102
-    make iso

+ 0
- 28
imagebuild/coreos/build_coreos_image.sh View File

@@ -1,28 +0,0 @@
1
-#!/bin/bash -xe
2
-#
3
-# This builds a CoreOS IPA image, assuming dependencies are installed
4
-#
5
-# The system this runs on needs these binaries available, most of which
6
-# are installed by default on Ubuntu Trusty:
7
-#  - docker
8
-#  - gzip / gunzip
9
-#  - uuidgen
10
-#  - cpio
11
-#  - find (gnu)
12
-#  - grep
13
-#  - gpg (to validate key of downloaded CoreOS image)
14
-#
15
-# Alternatively, run full_trusty_build.bash which will install
16
-# all requirements then perform the build.
17
-
18
-if [[ -x /usr/bin/docker.io ]]; then
19
-    sudo -E ln -sf /usr/bin/docker.io /usr/local/bin/docker
20
-fi
21
-sudo -E pip install -r requirements.txt
22
-cd imagebuild/coreos
23
-sudo -E make clean
24
-sudo -E make
25
-
26
-# Output of make is owned by root, so convert owner to user who started the script
27
-me=`whoami`
28
-sudo chown -R $me: UPLOAD

+ 0
- 472
imagebuild/coreos/coreos-oem-inject.py View File

@@ -1,472 +0,0 @@
1
-#!/usr/bin/env python
2
-
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-
15
-import os
16
-import shutil
17
-import subprocess
18
-import sys
19
-import tempfile
20
-import time
21
-
22
-import requests
23
-
24
-
25
-def get_coreos_version(version_file, key='COREOS_VERSION_ID'):
26
-    with open(version_file) as f:
27
-        for line in f:
28
-            if line.startswith("%s=" % key):
29
-                return line.strip().split("=")[1]
30
-    raise ValueError('Could not read CoreOS version number from file')
31
-
32
-
33
-COREOS_VERSION_FILE = os.path.join(os.path.dirname(__file__), 'version.txt')
34
-COREOS_VERSION = os.environ.get('COREOS_VERSION',
35
-                                get_coreos_version(COREOS_VERSION_FILE))
36
-
37
-COREOS_ARCH = "amd64-usr"
38
-COREOS_BASE_URL = ("http://stable.release.core-os.net/{arch}/{ver}"
39
-                   .format(arch=COREOS_ARCH, ver=COREOS_VERSION))
40
-COREOS_PXE_DIGESTS = "coreos_production_pxe_image.cpio.gz.DIGESTS.asc"
41
-COREOS_PXE_KERNEL = "coreos_production_pxe.vmlinuz"
42
-COREOS_PXE_IMAGE = "coreos_production_pxe_image.cpio.gz"
43
-COREOS_PXE_IMAGE_URL = "{url}/{img}".format(url=COREOS_BASE_URL,
44
-                                            img=COREOS_PXE_IMAGE)
45
-COREOS_PXE_KERNEL_URL = "{url}/{kernel}".format(url=COREOS_BASE_URL,
46
-                                                kernel=COREOS_PXE_KERNEL)
47
-COREOS_PXE_DIGESTS_URL = "{url}/{digests}".format(url=COREOS_BASE_URL,
48
-                                                  digests=COREOS_PXE_DIGESTS)
49
-
50
-
51
-def get_etag(cache_name):
52
-    etag_file = "{}.etag".format(cache_name)
53
-    if not os.path.exists(etag_file):
54
-        return None
55
-    with open(etag_file, 'rb') as fp:
56
-        etag = fp.read()
57
-    etag.strip()
58
-    return etag
59
-
60
-
61
-def save_etag(cache_name, etag):
62
-    etag_file = "{}.etag".format(cache_name)
63
-    with open(etag_file, 'w+b') as fp:
64
-        fp.write(etag)
65
-
66
-
67
-def cache_file(cache_name, remote_url):
68
-    print("{cname} <- {url}".format(cname=cache_name, url=remote_url))
69
-    etag = get_etag(cache_name)
70
-    headers = {}
71
-    if etag:
72
-        headers['If-None-Match'] = etag
73
-
74
-    start = time.time()
75
-    r = requests.get(remote_url, headers=headers)
76
-
77
-    if r.status_code == 304:
78
-        print("[etag-match]")
79
-        return
80
-
81
-    if r.status_code != 200:
82
-        raise RuntimeError('Failed to download {url}, got HTTP {code} Status '
83
-                           'Code.'.format(url=remote_url, code=r.status_code))
84
-
85
-    with open(cache_name, 'w+b') as fp:
86
-        fp.write(r.content)
87
-
88
-    print("{length} bytes in {timespan} seconds"
89
-          .format(length=len(r.content), timespan=time.time() - start))
90
-    save_etag(cache_name, r.headers['etag'])
91
-
92
-
93
-def inject_oem(archive, oem_dir, output_file):
94
-    d = tempfile.mkdtemp(prefix="oem-inject")
95
-    try:
96
-        dest_oem_dir = os.path.join(d, 'usr', 'share', 'oem')
97
-        cmd_chain = 'gunzip -c {} | cpio -iv'.format(archive)
98
-        execute(cmd_chain, shell=True, cwd=d)
99
-
100
-        shutil.copytree(oem_dir, dest_oem_dir)
101
-
102
-        cmd_chain = 'find . -depth -print | sort | cpio -o -H newc | ' \
103
-                    'gzip > {}'.format(output_file)
104
-        execute(cmd_chain, shell=True, cwd=d)
105
-    finally:
106
-        shutil.rmtree(d)
107
-    return output_file
108
-
109
-
110
-def validate_digests(digests, target, hash_type='sha1'):
111
-    cmd_chain = 'grep -i -A1 "^# {htype} HASH$" {digests} | grep {tgt} | ' \
112
-                '{htype}sum -c /dev/stdin'.format(htype=hash_type,
113
-                                                  digests=digests,
114
-                                                  tgt=os.path.basename(target))
115
-    execute(cmd_chain, shell=True, cwd=os.path.dirname(digests))
116
-
117
-
118
-def main():
119
-    if len(sys.argv) != 3:
120
-        print("usage: {} [oem-directory-to-inject] [output-directory]"
121
-              .format(os.path.basename(__file__)))
122
-        return
123
-
124
-    oem_dir = os.path.abspath(os.path.expanduser(sys.argv[1]))
125
-    output_dir = os.path.abspath(os.path.expanduser(sys.argv[2]))
126
-
127
-    if not os.path.exists(oem_dir):
128
-        print("Error: {} doesn't exist.".format(oem_dir))
129
-        return
130
-
131
-    if not os.path.exists(os.path.join(oem_dir, 'cloud-config.yml')):
132
-        print("Error: {} is missing cloud-config.yml".format(oem_dir))
133
-        return
134
-
135
-    here = os.path.abspath(os.path.dirname(__file__))
136
-
137
-    top_cache_dir = os.path.join(os.path.dirname(here), ".image_cache")
138
-    cache_dir = os.path.join(top_cache_dir, COREOS_ARCH, COREOS_VERSION)
139
-
140
-    if not os.path.exists(cache_dir):
141
-        os.makedirs(cache_dir)
142
-
143
-    orig_cpio = os.path.join(cache_dir, COREOS_PXE_IMAGE)
144
-    digests = os.path.join(cache_dir, COREOS_PXE_DIGESTS)
145
-    kernel = os.path.join(cache_dir, COREOS_PXE_KERNEL)
146
-
147
-    cache_file(digests, COREOS_PXE_DIGESTS_URL)
148
-    gpg_verify_file(digests)
149
-    cache_file(kernel, COREOS_PXE_KERNEL_URL)
150
-    validate_digests(digests, kernel)
151
-    cache_file(orig_cpio, COREOS_PXE_IMAGE_URL)
152
-    validate_digests(digests, orig_cpio)
153
-
154
-    if not os.path.exists(output_dir):
155
-        os.makedirs(output_dir)
156
-
157
-    output_kernel = os.path.join(output_dir, os.path.basename(kernel))
158
-    output_cpio = os.path.join(
159
-        output_dir,
160
-        os.path.basename(orig_cpio).replace('.cpio.gz', '-oem.cpio.gz'))
161
-    inject_oem(orig_cpio, oem_dir, output_cpio)
162
-    shutil.copy(kernel, output_kernel)
163
-
164
-
165
-def gpg_verify_file(ascfile):
166
-    d = tempfile.mkdtemp(prefix="oem-gpg-validate")
167
-    try:
168
-        tmpring = os.path.join(d, 'tmp.gpg')
169
-        key = os.path.join(d, 'coreos.key')
170
-        with open(key, 'w+b') as fp:
171
-            fp.write(GPG_KEY)
172
-
173
-        execute(['gpg', '--batch', '--no-default-keyring',
174
-                 '--keyring', tmpring, '--import', key])
175
-
176
-        execute(['gpg', '--batch', '--no-default-keyring',
177
-                 '--keyring', tmpring, '--verify', ascfile])
178
-
179
-    finally:
180
-        shutil.rmtree(d)
181
-
182
-
183
-def execute(cmd, shell=False, cwd=None):
184
-    popen_obj = subprocess.Popen(cmd, shell=shell, cwd=cwd)
185
-    popen_obj.communicate()
186
-    if popen_obj.returncode != 0:
187
-        raise subprocess.CalledProcessError(returncode=popen_obj.returncode,
188
-                                            cmd=cmd)
189
-
190
-
191
-GPG_KEY = """-----BEGIN PGP PUBLIC KEY BLOCK-----
192
-
193
-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
-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
-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
-8E0oVPgdDqCguBEP80NuosAONTib3fZ8ERmRw4HIwc9xjFDzyPpvyc25liyPKr57
197
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-HISexj2ZnVa2hcNDAdeGf9KtqW1dOlwxEccl3TYgl6dXCKy2kd8UPxw0zwiRkB86
208
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-KVJi0ZGJHzQOeAHHO/3BKYPFZNoUoNOU6VR/KAn7gon1wkUwk9Tn0AXVIQ7wMFJN
219
-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
-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
-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
-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
-VIgl1revG7GCsRD5Dr/+BLyauwZ/YtTH9mGDtg6hy/SozzDAM8+79Y8VMBUtj64G
224
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-+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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-jNHx3lro7BGcJtIXeRb+Wp1eGUghrG1+V/mKFxE4wulNtFXoTOJ//AOYkPq9FG12
253
-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
-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
-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
-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
-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
-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
-A+dfUvXqwa0cIBxhI3bXOa25vPHbT+SLtfQlvUvKySIbc6fobw2Wf1ZtM8lgFL3f
260
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-rviK9AqCk+zwvfzEFbt/uC7zOpO0BJ8fnMAZ0Zn/fF8s88zR4zq6BBq9WD4RCmaz
276
-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
-+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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-uVT9s1qzIII/gDbiSLRVDb75F6/aag7mDsJFGtUqStpNmR0AHyrLOY/jYVLlTr8d
288
-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
-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
-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
-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
-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
-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
-+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
-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
-4QIbAgUJA8JnAAIpCRBQ4IhVk9LctMFdIAQZAQIABgUCVeSh4QAKCRAH+p7THLX6
297
-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
-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
-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
-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
-UfGgpEnMnTbRu322HvUqeLNrNnSCdJKePuoy2Sky0K+/82O877nFysagTeO4tbLr
302
-+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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-edRwKg7Zt9aNND7Tiic+3DRONvus3StvN6dHEhM84RNWbk/XDmjjCk92cB6Gm32H
324
-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
-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
-StGNVnrwT/LeMn1ytV7oK8e2sIj1HFUYENQxy5jVjR3QtcTbVoOYLvZ83/wanc4G
327
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-Pl4UTDvfyPzn9kKT/57OC7OMFZH2a3LxwEfaGTgDOvA5QbxS5txqnkpPcokERAQY
341
-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
-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
-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
-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
-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
-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
-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
-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
-jOdPpFbhTPI1CoA12woT4vGtfxcI9u/uc7m5rQDJI+FCR9OtUYvtDUqtE/XYjqPX
350
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-GHb6EGpHJHoJsfp3JdBAh4oNGBBHf5fZZhBiUIJSGwbLg8oEzOuycNor9mEiJPaA
368
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-yvvSwUrWnHC+UDpHPzvaAGleAOK7gGyJehVIw9BhgZB1LplkbkGgpS8L/3CAcaQ4
386
-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
-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
-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
-CbQrbAdO24CUYZtYEmDNdHN+KHrlLLjkf0v5yGjVK2XBqs8l6upA7xBGHAF7U/Xk
390
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-YMHOb5Ct2fybGSWSQuPBfKeOjdHhO49C4RM8IvvPaBaVmFWqRdiRrOjZkyb51xX4
407
-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
-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
-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
-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
-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
-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
-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
-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
-4c1rdQVpvukYqhGZqalwaxYXeNjzqdFmh4A7CQTELgMF2fvcsGFX6Pzm/3Z/jlQn
416
-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
-nmiAG0NedWSnAf6IEJRHZle0AZAFvKwrfUpQyK1G2fBI3QLvb33US44zZzM7HP1s
418
-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
-idlJLFsQZSPAjmgWEGB1buYr/Qa6e7RdR8beDKM+ZwFQQge+h8LeXQOYTrhvGdWQ
420
-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
-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
-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
-c+gshgmJ+DNQJ15bEAu1V2TdQKqjA4VtClJThSUpg4HlKIl3WpgaBJpXTeb35j3u
424
-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
-+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
-EtoSQ5C4gFg40WIQ/nUJEegLVwm/y+AKQ/bArLmfH+SPVRV/WVKgjZHoU5FwhP79
427
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-hg4M0pHDULe7hSOlEgpdCYDgbNAhXrNbviD6OlKmS0k+NIUIwy/iyOxa2IbmlY1P
448
-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
-RN9ytimEgDeUpIN76Vnw6yZ/lrVz6zbbovn0jryEs3LT3dUiHBAcbiJKF6HAiULT
450
-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
-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
-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
-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
-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
-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
-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
-r8r/bEdfy/YKYETLX2Lrui7PID9uJgjEoTETkWIiuWQfpWOQc6rStoCpGkszsy9q
458
-+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
-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
-COaK7XECy+cgZpI5VoDoAVanfBMhZprTU4jmQsI9uf5WI+Jbx5I693EiAFVS/9vg
461
-Ety6H7P5GclkQtcvYkIy4oK47C3wMus4beF4g6daxs4amWbkcqH1DL7AT/o7uwcc
462
-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
-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
-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
-61Awgh2LQ3x83J/vswmuGi1eaFPCiOOMsjsgdvmDKgWwzGGI+XZjv/NbrgJcrXKB
466
-2jibQQI=
467
-=KhYl
468
------END PGP PUBLIC KEY BLOCK-----
469
-"""
470
-
471
-if __name__ == "__main__":
472
-    main()

+ 0
- 53
imagebuild/coreos/docker_build.bash View File

@@ -1,53 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# docker_build.bash - Prepares and outputs a tarball'd docker repository
4
-#                     suitable for injection into a coreos pxe image
5
-#
6
-
7
-set -e
8
-
9
-OUTPUT_FILE="oem/container.tar.gz"
10
-IPA_ROOT=$(readlink -f $(dirname $0)/../../)
11
-
12
-# If there's already a container.tar.gz, don't overwrite it -- instead, bail
13
-if [[ -e "${OUTPUT_FILE}" ]]; then
14
-  echo "${OUTPUT_FILE} already exists. Will not overwrite. Exiting."
15
-  exit 1
16
-fi
17
-
18
-# Build the docker image
19
-# Everything from ${IPA_ROOT} will be available under /tmp/ironic-python-agent in Docker
20
-cd ${IPA_ROOT}
21
-
22
-imagebuild/common/generate_upper_constraints.sh ${IPA_ROOT}/upper-constraints.txt
23
-
24
-# TODO(jlvilla): Once Docker 1.9 is widely deployed, switch to using the 'ARG'
25
-# command which was added in Docker 1.9. Currently Ubuntu 14.04 uses Docker
26
-# 1.6. Using the ARG command will be a much cleaner solution.
27
-mv proxy.sh .proxy.sh.save || true
28
-# Create a temporary proxy.sh script, that will be used by the Dockerfile.
29
-# Since we are calling 'docker build' we can not use --env-file/--env as those
30
-# are arguments to 'docker run'
31
-echo '#!/bin/sh' > proxy.sh
32
-echo 'echo Running: $*' >> proxy.sh
33
-echo "http_proxy=${http_proxy:-} https_proxy=${https_proxy:-} no_proxy=${no_proxy:-} "'$*' >> proxy.sh
34
-chmod 0755 proxy.sh
35
-
36
-docker build -t oemdocker .
37
-
38
-# Restore saved copy
39
-mv .proxy.sh.save proxy.sh || true
40
-
41
-cd -
42
-
43
-# Create a UUID to identify the build
44
-CONTAINER_UUID=`uuidgen`
45
-
46
-# Export the oemdocker repository to a tarball so it can be embedded in CoreOS
47
-# TODO: Investigate running a container and using "export" to flatten the
48
-#       image to shrink the CoreOS fs size. This will also require run.sh to
49
-#       use docker import instead of docker load as well.
50
-docker run oemdocker echo $CONTAINER_UUID
51
-CONTAINER=`docker ps -a --no-trunc |grep $CONTAINER_UUID|awk '{print $1}'|head -n1`
52
-echo $CONTAINER
53
-docker export $CONTAINER | gzip > ${OUTPUT_FILE}

+ 0
- 16
imagebuild/coreos/docker_clean.bash View File

@@ -1,16 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# Cleans up docker images and containers
4
-
5
-containers=$(docker ps -a -q)
6
-images=$(docker images -q)
7
-
8
-# All the docker commands followed by || true because occasionally docker
9
-# will fail to remove an image or container, & I want make to keep going anyway
10
-if [[ ! -z "$containers" ]]; then
11
-  docker rm $containers || true
12
-fi 
13
-
14
-if [[ ! -z "$images" ]]; then
15
-  docker rmi $images || true
16
-fi

+ 0
- 55
imagebuild/coreos/full_trusty_build.sh View File

@@ -1,55 +0,0 @@
1
-#!/bin/bash -xe
2
-#
3
-# From a base-trusty node, this should build a CoreOS IPA image
4
-# suitable for use in testing or production.
5
-#
6
-
7
-BRANCH_PATH=${BRANCH_PATH:-master}
8
-# NOTE(lucasagomes): List of dependencies for Red Hat systems
9
-REDHAT_PACKAGES="docker-io gpg"
10
-
11
-if [ -x "/usr/bin/apt-get" ]; then
12
-    sudo -E apt-get update
13
-    # apparmor is an undeclared dependency for docker on ubuntu
14
-    # https://github.com/docker/docker/issues/9745
15
-    sudo -E apt-get install -y docker.io apparmor cgroup-lite
16
-elif [ -x "/usr/bin/dnf" ]; then
17
-    sudo -E dnf install -y $REDHAT_PACKAGES
18
-elif [ -x "/usr/bin/yum" ]; then
19
-    sudo -E yum install -y $REDHAT_PACKAGES
20
-else
21
-    echo "No supported package manager installed on system. Supported: apt, yum, dnf"
22
-    exit 1
23
-fi
24
-
25
-imagebuild/coreos/build_coreos_image.sh
26
-
27
-BUILD_DIR=imagebuild/coreos/UPLOAD
28
-if [ "$BRANCH_PATH" != "master" ]; then
29
-    # add the branch name
30
-    mv $BUILD_DIR/coreos_production_pxe_image-oem.cpio.gz $BUILD_DIR/coreos_production_pxe_image-oem-$BRANCH_PATH.cpio.gz
31
-    mv $BUILD_DIR/coreos_production_pxe.vmlinuz $BUILD_DIR/coreos_production_pxe-$BRANCH_PATH.vmlinuz
32
-else
33
-    # in the past, we published master without branch name
34
-    # copy the files in this case such that both are published
35
-    cp $BUILD_DIR/coreos_production_pxe_image-oem.cpio.gz $BUILD_DIR/coreos_production_pxe_image-oem-$BRANCH_PATH.cpio.gz
36
-    cp $BUILD_DIR/coreos_production_pxe.vmlinuz $BUILD_DIR/coreos_production_pxe-$BRANCH_PATH.vmlinuz
37
-fi
38
-
39
-# Generate checksum files
40
-pushd $BUILD_DIR > /dev/null
41
-for x in *.vmlinuz *.cpio.gz; do
42
-    sha256sum $x > $x.sha256
43
-done
44
-popd > /dev/null
45
-
46
-tar czf ipa-coreos-$BRANCH_PATH.tar.gz $BUILD_DIR/coreos_production_pxe_image-oem-$BRANCH_PATH.cpio.gz $BUILD_DIR/coreos_production_pxe-$BRANCH_PATH.vmlinuz
47
-if [ "$BRANCH_PATH" = "master" ]; then
48
-    # again, publish with and without the branch on master for historical reasons
49
-    cp ipa-coreos-$BRANCH_PATH.tar.gz ipa-coreos.tar.gz
50
-fi
51
-
52
-# Generate checksum files
53
-for x in *.tar.gz; do
54
-    sha256sum $x > $x.sha256
55
-done

+ 0
- 168
imagebuild/coreos/iso-image-create View File

@@ -1,168 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# Copyright 2012 Hewlett-Packard Development Company, L.P.
4
-# All Rights Reserved.
5
-#
6
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
7
-# not use this file except in compliance with the License. You may obtain
8
-# a copy of the License at
9
-#
10
-#     http://www.apache.org/licenses/LICENSE-2.0
11
-#
12
-# Unless required by applicable law or agreed to in writing, software
13
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
-# License for the specific language governing permissions and limitations
16
-# under the License.
17
-#
18
-# This script generates iso image from the given kernel and ramdisk
19
-
20
-SCRIPTNAME=`basename $0`
21
-TMP_BUILD_DIR="/tmp/$SCRIPTNAME.$$"
22
-QEMU_IMG="/usr/bin/qemu-img"
23
-MKISOFS="/usr/bin/mkisofs"
24
-
25
-
26
-function show_options() {
27
-
28
-    echo "Usage: ${SCRIPTNAME} [options]"
29
-    echo
30
-    echo "Options:"
31
-
32
-    echo "    -o output filename "
33
-    echo "    -i initrd "
34
-    echo "    -k kernel "
35
-}
36
-
37
-function cleanup() {
38
-
39
-    v_print "Cleaning up.."
40
-    rm -rf $TMP_BUILD_DIR
41
-}
42
-
43
-function err_print() {
44
-    echo "ERROR: $@" 1>&2;
45
-}
46
-
47
-function v_print() {
48
-
49
-    echo "$*"
50
-}
51
-
52
-
53
-# Parse command line options
54
-ARGS=`getopt -o "o:i:k:" -l "output,initrd,kernel:" \
55
-      -n "$SCRIPTNAME" -- "$@"`
56
-if [ $? -ne 0 ];
57
-then
58
-        exit 1
59
-fi
60
-
61
-eval set -- "$ARGS"
62
-
63
-while true ; do
64
-    case "$1" in
65
-        -o) OUTPUT_FILENAME=$2; shift 2 ;;
66
-        -i) INITRD=$2; shift 2 ;;
67
-        -k) KERNEL=$2; shift 2 ;;
68
-        # *)  show_options ; exit 1 ;;
69
-        --) shift; break ;;
70
-    esac
71
-done
72
-
73
-# Verify whether kernel, initrd, and the image file is present
74
-if [ -z "$OUTPUT_FILENAME" ]; then
75
-    err_print "Output filename not provided."
76
-    show_options
77
-    exit 1
78
-fi
79
-
80
-if [ -z "$INITRD" ]; then
81
-    err_print "Initrd not provided."
82
-    show_options
83
-    exit 1
84
-fi
85
-
86
-if [ -z "$KERNEL" ]; then
87
-    err_print "Kernel not provided."
88
-    show_options
89
-    exit 1
90
-fi
91
-
92
-# Create a temporary build directory for holiding the contents of iso
93
-TMP_IMAGE_DIR="$TMP_BUILD_DIR/image"
94
-v_print "Creating temporary directory $TMP_IMAGE_DIR"
95
-mkdir -p "$TMP_IMAGE_DIR"
96
-
97
-# Copy isolinux bin to the isolinux directory
98
-mkdir -p "$TMP_IMAGE_DIR/isolinux"
99
-v_print "Copying isolinux.bin"
100
-if [ -f /usr/share/syslinux/isolinux.bin ]
101
-then
102
-    cp /usr/share/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux"
103
-
104
-elif [ -f /usr/lib/syslinux/isolinux.bin ]
105
-then
106
-    cp /usr/lib/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux"
107
-
108
-elif [ -f /usr/lib/ISOLINUX/isolinux.bin ]
109
-then
110
-    cp /usr/lib/ISOLINUX/isolinux.bin "$TMP_IMAGE_DIR/isolinux"
111
-
112
-else
113
-    err_print "Could not find isolinux.bin. Install syslinux or isolinux?"
114
-    cleanup
115
-    exit 1
116
-fi
117
-
118
-# Copy ldlinux.c32 to the isolinux directory
119
-v_print "Copying ldlinux.c32"
120
-if [ -f /usr/share/syslinux/ldlinux.c32 ]
121
-then
122
-    cp /usr/share/syslinux/ldlinux.c32 "$TMP_IMAGE_DIR/isolinux"
123
-elif [ -f /usr/lib/syslinux/modules/bios/ldlinux.c32 ]
124
-then
125
-    cp /usr/lib/syslinux/modules/bios/ldlinux.c32 "$TMP_IMAGE_DIR/isolinux"
126
-fi
127
-
128
-# Copy initrd, kernel
129
-v_print "Copying kernel to $TMP_IMAGE_DIR/vmlinuz"
130
-cp $KERNEL "$TMP_IMAGE_DIR/vmlinuz"
131
-if [ $? -ne 0 ]; then
132
-    err_print "Failed to copy $KERNEL to $TMP_IMAGE_DIR"
133
-    cleanup
134
-    exit 1
135
-fi
136
-
137
-v_print "Copying initrd to $TMP_IMAGE_DIR/initrd"
138
-cp $INITRD "$TMP_IMAGE_DIR/initrd"
139
-if [ $? -ne 0 ]; then
140
-    err_print "Failed to copy $INITRD to $TMP_IMAGE_DIR"
141
-    cleanup
142
-    exit 1
143
-fi
144
-
145
-# Generate isolinux.cfg for default booting
146
-v_print "Generating isolinux.cfg"
147
-echo "\
148
-DEFAULT install
149
-LABEL install
150
-    menu label "Install image"
151
-    kernel /vmlinuz
152
-    append initrd=/initrd boot_method=vmedia --
153
-TIMEOUT 5
154
-PROMPT 0 " > "$TMP_IMAGE_DIR/isolinux/isolinux.cfg"
155
-
156
-# Convert relative path output filename to absolute path
157
-echo $OUTPUT_FILENAME | grep -q '^/'
158
-if [ $? -ne 0 ]; then
159
-    OUTPUT_FILENAME="$PWD/$OUTPUT_FILENAME"
160
-fi
161
-
162
-# Create the ISO
163
-v_print "Generating the ISO"
164
-cd $TMP_IMAGE_DIR && $MKISOFS -r -V "INSTALL_IMAGE" -cache-inodes -J -l -b isolinux/isolinux.bin  -no-emul-boot -boot-load-size 4 -boot-info-table -o $OUTPUT_FILENAME .
165
-
166
-# Cleanup
167
-cleanup
168
-

+ 0
- 265
imagebuild/coreos/oem/cloud-config.yml View File

@@ -1,265 +0,0 @@
1
-#cloud-config
2
-
3
-coreos:
4
-  units:
5
-    - name: user-configdrive.service
6
-      mask: true
7
-
8
-    - name: user-configvirtfs.service
9
-      mask: true
10
-
11
-    - name: user-configdrive.path
12
-      mask: true
13
-
14
-    - name: media-configdrive.mount
15
-      mask: true
16
-
17
-    - name: media-configvirtfs.mount
18
-      mask: true
19
-
20
-    - name: update-engine.service
21
-      mask: true
22
-
23
-    - name: update-engine-stub.service
24
-      mask: true
25
-
26
-    - name: resize-btrfs.service
27
-      mask: true
28
-
29
-    - name: locksmithd.service
30
-      mask: true
31
-
32
-    - name: fleet.service
33
-      mask: true
34
-
35
-    - name: etcd.service
36
-      mask: true
37
-
38
-    - name: usr-share-oem.mount
39
-      mask: true
40
-
41
-    - name: ironic-python-agent-embed-ssh-keys.service
42
-      command: start
43
-      content: |
44
-        [Unit]
45
-        Description=Migrate embedded SSH keys into core user
46
-        ConditionFileNotEmpty=/usr/share/oem/authorized_keys
47
-
48
-        [Service]
49
-        Type=oneshot
50
-        RemainAfterExit=yes
51
-        ExecStart=/usr/bin/update-ssh-keys -a oem /usr/share/oem/authorized_keys
52
-
53
-    - name: ironic-python-agent-container-creation.service
54
-      command: start
55
-      content: |
56
-        [Unit]
57
-        Description=Untar Provided IPA Container
58
-
59
-        [Service]
60
-        Type=oneshot
61
-        RemainAfterExit=yes
62
-        ExecStart=/usr/bin/mkdir -p /opt/ironic-python-agent
63
-        ExecStart=/usr/bin/tar -x --no-xattrs \
64
-                               -C /opt/ironic-python-agent \
65
-                               -f /usr/share/oem/container.tar.gz
66
-
67
-    - name: opt-ironic\x2dpython\x2dagent-proc.mount
68
-      command: start
69
-      content: |
70
-        [Unit]
71
-        DefaultDependencies=no
72
-        Conflicts=umount.target
73
-        Before=umount.target
74
-        After=ironic-python-agent-container-creation.service
75
-        Requires=ironic-python-agent-container-creation.service
76
-
77
-        [Mount]
78
-        What=/proc
79
-        Where=/opt/ironic-python-agent/proc
80
-        Type=none
81
-        Options=bind
82
-
83
-    - name: opt-ironic\x2dpython\x2dagent-dev.mount
84
-      command: start
85
-      content: |
86
-        [Unit]
87
-        DefaultDependencies=no
88
-        Conflicts=umount.target
89
-        Before=umount.target
90
-        After=ironic-python-agent-container-creation.service
91
-        Requires=ironic-python-agent-container-creation.service
92
-
93
-        [Mount]
94
-        What=/dev
95
-        Where=/opt/ironic-python-agent/dev
96
-        Type=none
97
-        Options=bind
98
-
99
-    - name: opt-ironic\x2dpython\x2dagent-dev-pts.mount
100
-      command: start
101
-      content: |
102
-        [Unit]
103
-        DefaultDependencies=no
104
-        Conflicts=umount.target
105
-        Before=umount.target
106
-        After=ironic-python-agent-container-creation.service
107
-        Requires=ironic-python-agent-container-creation.service
108
-
109
-        [Mount]
110
-        What=/dev/pts
111
-        Where=/opt/ironic-python-agent/dev/pts
112
-        Type=none
113
-        Options=bind
114
-
115
-    - name: opt-ironic\x2dpython\x2dagent-sys.mount
116
-      command: start
117
-      content: |
118
-        [Unit]
119
-        DefaultDependencies=no
120
-        Conflicts=umount.target
121
-        Before=umount.target
122
-        After=ironic-python-agent-container-creation.service
123
-        Requires=ironic-python-agent-container-creation.service
124
-
125
-        [Mount]
126
-        What=/sys
127
-        Where=/opt/ironic-python-agent/sys
128
-        Type=none
129
-        Options=bind
130
-
131
-    - name: opt-ironic\x2dpython\x2dagent-run.mount
132
-      command: start
133
-      content: |
134
-        [Unit]
135
-        DefaultDependencies=no
136
-        Conflicts=umount.target
137
-        Before=umount.target
138
-        After=ironic-python-agent-container-creation.service
139
-        Requires=ironic-python-agent-container-creation.service
140
-
141
-        [Mount]
142
-        What=/run
143
-        Where=/opt/ironic-python-agent/run
144
-        Type=none
145
-        Options=bind
146
-
147
-    - name: opt-ironic\x2dpython\x2dagent-mnt.mount
148
-      command: start
149
-      content: |
150
-        [Unit]
151
-        DefaultDependencies=no
152
-        Conflicts=umount.target
153
-        Before=umount.target
154
-        After=ironic-python-agent-container-creation.service
155
-        Requires=ironic-python-agent-container-creation.service
156
-
157
-        [Mount]
158
-        What=/usr/share/oem
159
-        Where=/opt/ironic-python-agent/mnt
160
-        Type=none
161
-        Options=bind
162
-
163
-    - name: opt-ironic\x2dpython\x2dagent-etc-resolvconf.service
164
-      command: start
165
-      content: |
166
-        [Unit]
167
-        Description="Provide host resolv.conf to chroot"
168
-        After=ironic-python-agent-container-creation.service
169
-        Requires=ironic-python-agent-container-creation.service
170
-
171
-        [Service]
172
-        Type=oneshot
173
-        RemainAfterExit=yes
174
-        ExecStart=/bin/ln -f /etc/resolv.conf /opt/ironic-python-agent/etc/resolv.conf
175
-
176
-    - name: opt-ironic\x2dpython\x2dagent-run-log.mount
177
-      command: start
178
-      content: |
179
-        [Unit]
180
-        DefaultDependencies=no
181
-        Conflicts=umount.target
182
-        Before=umount.target
183
-        After=ironic-python-agent-container-creation.service
184
-        Requires=ironic-python-agent-container-creation.service
185
-
186
-        [Mount]
187
-        What=/run/log
188
-        Where=/opt/ironic-python-agent/run/log
189
-        Type=none
190
-        Options=bind
191
-
192
-    - name: setup-rescue-directories.service
193
-      command: start
194
-      content: |
195
-        [Unit]
196
-        Description=Create directories for rescue mode configuration
197
-        After=ironic-python-agent-container-creation.service
198
-        Requires=ironic-python-agent-container-creation.service
199
-
200
-        [Service]
201
-        Type=oneshot
202
-        RemainAfterExit=yes
203
-        ExecStart=/usr/bin/mkdir /etc/ipa-rescue-config
204
-        ExecStart=/usr/bin/mkdir /opt/ironic-python-agent/etc/ipa-rescue-config
205
-
206
-    - name: opt-ironic\x2dpython\x2dagent-etc-ipa\x2drescue\x2dconfig.mount
207
-      command: start
208
-      content: |
209
-        [Unit]
210
-        DefaultDependencies=no
211
-
212
-        Conflicts=umount.target
213
-        Before=umount.target
214
-
215
-        After=ironic-python-agent-container-creation.service
216
-        After=setup-rescue-directories.service
217
-
218
-        Requires=ironic-python-agent-container-creation.service
219
-        Requires=setup-rescue-directories.service
220
-
221
-        [Mount]
222
-        What=/etc/ipa-rescue-config
223
-        Where=/opt/ironic-python-agent/etc/ipa-rescue-config
224
-        Type=none
225
-        Options=bind
226
-
227
-    - name: ironic-python-agent.service
228
-      command: start
229
-      content: |
230
-        [Unit]
231
-        Description=Ironic Python Agent
232
-        After=ironic-python-agent-container-creation.service
233
-        After=opt-ironic\x2dpython\x2dagent-proc.mount
234
-        After=opt-ironic\x2dpython\x2dagent-dev.mount
235
-        After=opt-ironic\x2dpython\x2dagent-dev-pts.mount
236
-        After=opt-ironic\x2dpython\x2dagent-sys.mount
237
-        After=opt-ironic\x2dpython\x2dagent-run.mount
238
-        After=opt-ironic\x2dpython\x2dagent-mnt.mount
239
-        After=opt-ironic\x2dpython\x2dagent-etc-resolvconf.service
240
-        After=opt-ironic\x2dpython\x2dagent-run-log.mount
241
-        After=setup-rescue-directories.service
242
-        After=opt-ironic\x2dpython\x2dagent-etc-ipa\x2drescue\x2dconfig.mount
243
-
244
-        Requires=ironic-python-agent-container-creation.service
245
-        Requires=opt-ironic\x2dpython\x2dagent-proc.mount
246
-        Requires=opt-ironic\x2dpython\x2dagent-dev.mount
247
-        Requires=opt-ironic\x2dpython\x2dagent-dev-pts.mount
248
-        Requires=opt-ironic\x2dpython\x2dagent-sys.mount
249
-        Requires=opt-ironic\x2dpython\x2dagent-run.mount
250
-        Requires=opt-ironic\x2dpython\x2dagent-mnt.mount
251
-        Requires=opt-ironic\x2dpython\x2dagent-etc-resolvconf.service
252
-        Requires=opt-ironic\x2dpython\x2dagent-run-log.mount
253
-        Requires=setup-rescue-directories.service
254
-        Requires=opt-ironic\x2dpython\x2dagent-etc-ipa\x2drescue\x2dconfig.mount
255
-
256
-        [Service]
257
-        ExecStartPre=-/usr/sbin/modprobe ipmi_msghandler
258
-        ExecStartPre=-/usr/sbin/modprobe ipmi_devintf
259
-        ExecStartPre=-/usr/sbin/modprobe ipmi_si
260
-        ExecStart=/usr/bin/chroot /opt/ironic-python-agent \
261
-                                  env PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH \
262
-                                  /usr/local/bin/ironic-python-agent
263
-        ExecStopPost=/usr/share/oem/finalize_rescue.sh
264
-        Restart=on-failure
265
-        RestartSec=30s

+ 0
- 37
imagebuild/coreos/oem/finalize_rescue.sh View File

@@ -1,37 +0,0 @@
1
-#!/bin/bash
2
-
3
-create_rescue_user() {
4
-    echo "Adding rescue user with root privileges..."
5
-    crypted_pass=$(</etc/ipa-rescue-config/ipa-rescue-password)
6
-    sudo useradd -m rescue -G sudo -p $crypted_pass
7
-    sudo echo "rescue ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/rescue
8
-}
9
-
10
-setup_dhcp_network() {
11
-    DHCP_CONFIG_TEMPLATE=/usr/share/oem/rescue-dhcp-config.network
12
-
13
-    echo "Configuring DHCP networks on all interfaces..."
14
-    echo "Removing all existing network configuration..."
15
-    sudo rm /etc/systemd/network/*
16
-
17
-    echo "Configuring all interfaces except loopback to DHCP..."
18
-    for interface in $(ls /sys/class/net) ; do
19
-        if [ $interface != "lo" ]; then
20
-            sudo sed "s/RESCUE_NETWORK_INTERFACE/$interface/" $DHCP_CONFIG_TEMPLATE > /etc/systemd/network/50-$interface.network || true
21
-        fi
22
-    done
23
-
24
-    sudo systemctl restart systemd-networkd
25
-}
26
-
27
-echo "Attempting to start rescue mode configuration..."
28
-if [ -f /etc/ipa-rescue-config/ipa-rescue-password ]; then
29
-    # NOTE(mariojv) An exit code of 0 is always forced here to avoid making IPA
30
-    # restart after something fails. IPA should not restart when this script
31
-    # executes to avoid exposing its API to a tenant network.
32
-    create_rescue_user || exit 0
33
-    setup_dhcp_network || exit 0
34
-    # TODO(mariojv) Add support for configdrive and static networks
35
-else
36
-    echo "One or more of the files needed for rescue mode does not exist, not rescuing."
37
-fi

+ 0
- 5
imagebuild/coreos/oem/rescue-dhcp-config.network View File

@@ -1,5 +0,0 @@
1
-[Match]
2
-Name=RESCUE_NETWORK_INTERFACE
3
-
4
-[Network]
5
-DHCP=yes

+ 0
- 11
imagebuild/coreos/pin_latest_coreos.sh View File

@@ -1,11 +0,0 @@
1
-#!/bin/bash -xe
2
-
3
-HERE=$(dirname $0)
4
-
5
-CHANNEL="stable"
6
-ARCH="amd64-usr"
7
-VERSION="current"
8
-
9
-URL="https://${CHANNEL}.release.core-os.net/${ARCH}/${VERSION}/version.txt"
10
-
11
-wget $URL -O "${HERE}/version.txt"

+ 0
- 7
imagebuild/coreos/version.txt View File

@@ -1,7 +0,0 @@
1
-COREOS_BUILD=1688
2
-COREOS_BRANCH=5
3
-COREOS_PATCH=3
4
-COREOS_VERSION=1688.5.3
5
-COREOS_VERSION_ID=1688.5.3
6
-COREOS_BUILD_ID="2018-04-03-0540"
7
-COREOS_SDK_VERSION=1688.5.2

+ 0
- 5
playbooks/ironic-python-agent-buildimage/run.yaml View File

@@ -48,11 +48,6 @@
48 48
                   make clean
49 49
                   popd
50 50
               ;;
51
-              coreos)
52
-                  imagebuild/coreos/full_trusty_build.sh
53
-                  mv imagebuild/coreos/UPLOAD/coreos_production_pxe* UPLOAD_RAW
54
-                  mv ipa-coreos*.tar.gz* UPLOAD_TAR
55
-              ;;
56 51
               dib)
57 52
                   NAME=ipa-{{ image_distro }}-$BRANCH_PATH
58 53
                   ironic-python-agent-builder -e dhcp-all-interfaces -o $NAME {{ image_distro }}

+ 0
- 15
playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/post.yaml View File

@@ -1,15 +0,0 @@
1
-- hosts: primary
2
-  tasks:
3
-
4
-    - name: Copy files from {{ ansible_user_dir }}/workspace/ on node
5
-      synchronize:
6
-        src: '{{ ansible_user_dir }}/workspace/'
7
-        dest: '{{ zuul.executor.log_root }}'
8
-        mode: pull
9
-        copy_links: true
10
-        verify_host: true
11
-        rsync_opts:
12
-          - --include=/logs/**
13
-          - --include=*/
14
-          - --exclude=*
15
-          - --prune-empty-dirs

+ 0
- 111
playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/run.yaml View File

@@ -1,111 +0,0 @@
1
-- hosts: all
2
-  name: Autoconverted job legacy-tempest-dsvm-ironic-ipa-partition-bios-agent_ipmitool-coreos-src
3
-    from old job gate-tempest-dsvm-ironic-ipa-partition-bios-agent_ipmitool-coreos-src-ubuntu-xenial
4
-  tasks:
5
-
6
-    - name: Ensure legacy workspace directory
7
-      file:
8
-        path: '{{ ansible_user_dir }}/workspace'
9
-        state: directory
10
-
11
-    - shell:
12
-        cmd: |
13
-          set -e
14
-          set -x
15
-          cat > clonemap.yaml << EOF
16
-          clonemap:
17
-            - name: openstack/devstack-gate
18
-              dest: devstack-gate
19
-          EOF
20
-          /usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
21
-              https://opendev.org \
22
-              openstack/devstack-gate
23
-        executable: /bin/bash
24
-        chdir: '{{ ansible_user_dir }}/workspace'
25
-      environment: '{{ zuul | zuul_legacy_vars }}'
26
-
27
-    # NOTE(TheJulia): The CoreOS ramdisk is generally slow to startup,
28
-    # on the order of 300-500 seconds.
29
-    - shell:
30
-        cmd: |
31
-          cat << 'EOF' >> ironic-extra-vars
32
-            export DEVSTACK_GATE_OS_TEST_TIMEOUT=2400
33
-            export DEVSTACK_GATE_TEMPEST_BAREMETAL_BUILD_TIMEOUT=1800
34
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_ENGINE=auto"
35
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_CPU=1"
36
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_RAM=2048"
37
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_RAMDISK_TYPE=coreos"
38
-          EOF
39
-        chdir: '{{ ansible_user_dir }}/workspace'
40
-      environment: '{{ zuul | zuul_legacy_vars }}'
41
-
42
-    - shell:
43
-        cmd: |
44
-          cat << 'EOF' >> ironic-extra-vars
45
-            export DEVSTACK_GATE_TEMPEST_REGEX="ironic_tempest_plugin.tests.scenario"
46
-          EOF
47
-        chdir: '{{ ansible_user_dir }}/workspace'
48
-      environment: '{{ zuul | zuul_legacy_vars }}'
49
-
50
-    - shell:
51
-        cmd: |
52
-          cat << 'EOF' >> ironic-vars-early
53
-            # use tempest plugin
54
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"TEMPEST_PLUGINS+=' /opt/stack/new/ironic-tempest-plugin'"
55
-            export TEMPEST_CONCURRENCY=1
56
-          EOF
57
-        chdir: '{{ ansible_user_dir }}/workspace'
58
-      environment: '{{ zuul | zuul_legacy_vars }}'
59
-
60
-    - shell:
61
-        cmd: |
62
-          set -e
63
-          set -x
64
-          export PROJECTS="openstack/ironic $PROJECTS"
65
-          export PROJECTS="openstack/ironic-lib $PROJECTS"
66
-          export PROJECTS="openstack/ironic-python-agent $PROJECTS"
67
-          export PROJECTS="openstack/ironic-tempest-plugin $PROJECTS"
68
-          export PROJECTS="openstack/python-ironicclient $PROJECTS"
69
-          export PROJECTS="openstack/virtualbmc $PROJECTS"
70
-          export PYTHONUNBUFFERED=true
71
-          export DEVSTACK_GATE_TEMPEST=1
72
-          export DEVSTACK_GATE_IRONIC=1
73
-          export DEVSTACK_GATE_NEUTRON=1
74
-          export DEVSTACK_GATE_VIRT_DRIVER=ironic
75
-          export DEVSTACK_GATE_CONFIGDRIVE=1
76
-          export DEVSTACK_GATE_IRONIC_DRIVER=ipmi
77
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_DEFAULT_DEPLOY_INTERFACE=direct"
78
-          # direct deploy requires Swift temporary URLs
79
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_ENABLE_TEMPURLS=True"
80
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_TEMPURL_KEY=secretkey"
81
-
82
-          if [[ ! "stable/newton stable/ocata stable/pike" =~ $ZUUL_BRANCH ]] ; then
83
-              export DEVSTACK_GATE_TLSPROXY=1
84
-          fi
85
-
86
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_TEMPEST_WHOLE_DISK_IMAGE=False"
87
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_EPHEMERAL_DISK=1"
88
-
89
-          export DEVSTACK_GATE_IRONIC_BUILD_RAMDISK=1
90
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_INSPECTOR_BUILD_RAMDISK=True"
91
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"USE_SUBNETPOOL=False"
92
-
93
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_COUNT=1"
94
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"LIBVIRT_NIC_DRIVER=e1000"
95
-          # Ensure the ironic-vars-EARLY file exists
96
-          touch ironic-vars-early
97
-          # Pull in the EARLY variables injected by the optional builders
98
-          source ironic-vars-early
99
-
100
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin ironic https://opendev.org/openstack/ironic"
101
-
102
-          # Ensure the ironic-EXTRA-vars file exists
103
-          touch ironic-extra-vars
104
-          # Pull in the EXTRA variables injected by the optional builders
105
-          source ironic-extra-vars
106
-
107
-          cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
108
-          ./safe-devstack-vm-gate-wrap.sh
109
-        executable: /bin/bash
110
-        chdir: '{{ ansible_user_dir }}/workspace'
111
-      environment: '{{ zuul | zuul_legacy_vars }}'

+ 0
- 15
playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/post.yaml View File

@@ -1,15 +0,0 @@
1
-- hosts: primary
2
-  tasks:
3
-
4
-    - name: Copy files from {{ ansible_user_dir }}/workspace/ on node
5
-      synchronize:
6
-        src: '{{ ansible_user_dir }}/workspace/'
7
-        dest: '{{ zuul.executor.log_root }}'
8
-        mode: pull
9
-        copy_links: true
10
-        verify_host: true
11
-        rsync_opts:
12
-          - --include=/logs/**
13
-          - --include=*/
14
-          - --exclude=*
15
-          - --prune-empty-dirs

+ 0
- 108
playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/run.yaml View File

@@ -1,108 +0,0 @@
1
-- hosts: all
2
-  name: Autoconverted job legacy-tempest-dsvm-ironic-ipa-partition-bios-pxe_ipmitool-coreos-src
3
-    from old job gate-tempest-dsvm-ironic-ipa-partition-bios-pxe_ipmitool-coreos-src-ubuntu-xenial
4
-  tasks:
5
-
6
-    - name: Ensure legacy workspace directory
7
-      file:
8
-        path: '{{ ansible_user_dir }}/workspace'
9
-        state: directory
10
-
11
-    - shell:
12
-        cmd: |
13
-          set -e
14
-          set -x
15
-          cat > clonemap.yaml << EOF
16
-          clonemap:
17
-            - name: openstack/devstack-gate
18
-              dest: devstack-gate
19
-          EOF
20
-          /usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
21
-              https://opendev.org \
22
-              openstack/devstack-gate
23
-        executable: /bin/bash
24
-        chdir: '{{ ansible_user_dir }}/workspace'
25
-      environment: '{{ zuul | zuul_legacy_vars }}'
26
-
27
-    # NOTE(TheJulia): The CoreOS ramdisk is generally slow to startup,
28
-    # on the order of 300-500 seconds.
29
-    - shell:
30
-        cmd: |
31
-          cat << 'EOF' >> ironic-extra-vars
32
-            export DEVSTACK_GATE_OS_TEST_TIMEOUT=2400
33
-            export DEVSTACK_GATE_TEMPEST_BAREMETAL_BUILD_TIMEOUT=1800
34
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_ENGINE=auto"
35
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_CPU=1"
36
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_RAM=2048"
37
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_RAMDISK_TYPE=coreos"
38
-          EOF
39
-        chdir: '{{ ansible_user_dir }}/workspace'
40
-      environment: '{{ zuul | zuul_legacy_vars }}'
41
-
42
-    - shell:
43
-        cmd: |
44
-          cat << 'EOF' >> ironic-extra-vars
45
-            export DEVSTACK_GATE_TEMPEST_REGEX="ironic_tempest_plugin.tests.scenario"
46
-
47
-          EOF
48
-        chdir: '{{ ansible_user_dir }}/workspace'
49
-      environment: '{{ zuul | zuul_legacy_vars }}'
50
-
51
-    - shell:
52
-        cmd: |
53
-          cat << 'EOF' >> ironic-vars-early
54
-            # use tempest plugin
55
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"TEMPEST_PLUGINS+=' /opt/stack/new/ironic-tempest-plugin'"
56
-            export TEMPEST_CONCURRENCY=1
57
-          EOF
58
-        chdir: '{{ ansible_user_dir }}/workspace'
59
-      environment: '{{ zuul | zuul_legacy_vars }}'
60
-
61
-    - shell:
62
-        cmd: |
63
-          set -e
64
-          set -x
65
-          export PROJECTS="openstack/ironic $PROJECTS"
66
-          export PROJECTS="openstack/ironic-lib $PROJECTS"
67
-          export PROJECTS="openstack/ironic-python-agent $PROJECTS"
68
-          export PROJECTS="openstack/ironic-tempest-plugin $PROJECTS"
69
-          export PROJECTS="openstack/python-ironicclient $PROJECTS"
70
-          export PROJECTS="openstack/virtualbmc $PROJECTS"
71
-          export PYTHONUNBUFFERED=true
72
-          export DEVSTACK_GATE_TEMPEST=1
73
-          export DEVSTACK_GATE_IRONIC=1
74
-          export DEVSTACK_GATE_NEUTRON=1
75
-          export DEVSTACK_GATE_VIRT_DRIVER=ironic
76
-          export DEVSTACK_GATE_CONFIGDRIVE=1
77
-          export DEVSTACK_GATE_IRONIC_DRIVER=ipmi
78
-
79
-          if [[ ! "stable/newton stable/ocata stable/pike" =~ $ZUUL_BRANCH ]] ; then
80
-              export DEVSTACK_GATE_TLSPROXY=1
81
-          fi
82
-
83
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_TEMPEST_WHOLE_DISK_IMAGE=False"
84
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_EPHEMERAL_DISK=1"
85
-
86
-          export DEVSTACK_GATE_IRONIC_BUILD_RAMDISK=1
87
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_INSPECTOR_BUILD_RAMDISK=True"
88
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"USE_SUBNETPOOL=False"
89
-
90
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_COUNT=1"
91
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"LIBVIRT_NIC_DRIVER=e1000"
92
-          # Ensure the ironic-vars-EARLY file exists
93
-          touch ironic-vars-early
94
-          # Pull in the EARLY variables injected by the optional builders
95
-          source ironic-vars-early
96
-
97
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin ironic https://opendev.org/openstack/ironic"
98
-
99
-          # Ensure the ironic-EXTRA-vars file exists
100
-          touch ironic-extra-vars
101
-          # Pull in the EXTRA variables injected by the optional builders
102
-          source ironic-extra-vars
103
-
104
-          cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
105
-          ./safe-devstack-vm-gate-wrap.sh
106
-        executable: /bin/bash
107
-        chdir: '{{ ansible_user_dir }}/workspace'
108
-      environment: '{{ zuul | zuul_legacy_vars }}'

+ 0
- 15
playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/post.yaml View File

@@ -1,15 +0,0 @@
1
-- hosts: primary
2
-  tasks:
3
-
4
-    - name: Copy files from {{ ansible_user_dir }}/workspace/ on node
5
-      synchronize:
6
-        src: '{{ ansible_user_dir }}/workspace/'
7
-        dest: '{{ zuul.executor.log_root }}'
8
-        mode: pull
9
-        copy_links: true
10
-        verify_host: true
11
-        rsync_opts:
12
-          - --include=/logs/**
13
-          - --include=*/
14
-          - --exclude=*
15
-          - --prune-empty-dirs

+ 0
- 112
playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/run.yaml View File

@@ -1,112 +0,0 @@
1
-- hosts: all
2
-  name: Autoconverted job legacy-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-coreos-src
3
-    from old job gate-tempest-dsvm-ironic-ipa-wholedisk-bios-agent_ipmitool-coreos-src-ubuntu-xenial
4
-  tasks:
5
-
6
-    - name: Ensure legacy workspace directory
7
-      file:
8
-        path: '{{ ansible_user_dir }}/workspace'
9
-        state: directory
10
-
11
-    - shell:
12
-        cmd: |
13
-          set -e
14
-          set -x
15
-          cat > clonemap.yaml << EOF
16
-          clonemap:
17
-            - name: openstack/devstack-gate
18
-              dest: devstack-gate
19
-          EOF
20
-          /usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
21
-              https://opendev.org \
22
-              openstack/devstack-gate
23
-        executable: /bin/bash
24
-        chdir: '{{ ansible_user_dir }}/workspace'
25
-      environment: '{{ zuul | zuul_legacy_vars }}'
26
-
27
-    # NOTE(TheJulia): The CoreOS ramdisk is generally slow to startup,
28
-    # on the order of 300-500 seconds.
29
-    - shell:
30
-        cmd: |
31
-          cat << 'EOF' >> ironic-extra-vars
32
-            export DEVSTACK_GATE_OS_TEST_TIMEOUT=2400
33
-            export DEVSTACK_GATE_TEMPEST_BAREMETAL_BUILD_TIMEOUT=1800
34
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_ENGINE=auto"
35
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_CPU=1"
36
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_RAM=2048"
37
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_RAMDISK_TYPE=coreos"
38
-          EOF
39
-        chdir: '{{ ansible_user_dir }}/workspace'
40
-      environment: '{{ zuul | zuul_legacy_vars }}'
41
-
42
-    - shell:
43
-        cmd: |
44
-          cat << 'EOF' >> ironic-extra-vars
45
-            export DEVSTACK_GATE_TEMPEST_REGEX="ironic_tempest_plugin.tests.scenario"
46
-
47
-          EOF
48
-        chdir: '{{ ansible_user_dir }}/workspace'
49
-      environment: '{{ zuul | zuul_legacy_vars }}'
50
-
51
-    - shell:
52
-        cmd: |
53
-          cat << 'EOF' >> ironic-vars-early
54
-            # use tempest plugin
55
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"TEMPEST_PLUGINS+=' /opt/stack/new/ironic-tempest-plugin'"
56
-            export TEMPEST_CONCURRENCY=1
57
-          EOF
58
-        chdir: '{{ ansible_user_dir }}/workspace'
59
-      environment: '{{ zuul | zuul_legacy_vars }}'
60
-
61
-    - shell:
62
-        cmd: |
63
-          set -e
64
-          set -x
65
-          export PROJECTS="openstack/ironic $PROJECTS"
66
-          export PROJECTS="openstack/ironic-lib $PROJECTS"
67
-          export PROJECTS="openstack/ironic-python-agent $PROJECTS"
68
-          export PROJECTS="openstack/ironic-tempest-plugin $PROJECTS"
69
-          export PROJECTS="openstack/python-ironicclient $PROJECTS"
70
-          export PROJECTS="openstack/virtualbmc $PROJECTS"
71
-          export PYTHONUNBUFFERED=true
72
-          export DEVSTACK_GATE_TEMPEST=1
73
-          export DEVSTACK_GATE_IRONIC=1
74
-          export DEVSTACK_GATE_NEUTRON=1
75
-          export DEVSTACK_GATE_VIRT_DRIVER=ironic
76
-          export DEVSTACK_GATE_CONFIGDRIVE=1
77
-          export DEVSTACK_GATE_IRONIC_DRIVER=ipmi
78
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_DEFAULT_DEPLOY_INTERFACE=direct"
79
-          # direct deploy requires Swift temporary URLs
80
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_ENABLE_TEMPURLS=True"
81
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"SWIFT_TEMPURL_KEY=secretkey"
82
-
83
-          if [[ ! "stable/newton stable/ocata stable/pike" =~ $ZUUL_BRANCH ]] ; then
84
-              export DEVSTACK_GATE_TLSPROXY=1
85
-          fi
86
-
87
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_TEMPEST_WHOLE_DISK_IMAGE=True"
88
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_EPHEMERAL_DISK=0"
89
-
90
-          export DEVSTACK_GATE_IRONIC_BUILD_RAMDISK=1
91
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_INSPECTOR_BUILD_RAMDISK=True"
92
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"USE_SUBNETPOOL=False"
93
-
94
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_COUNT=1"
95
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"LIBVIRT_NIC_DRIVER=e1000"
96
-          # Ensure the ironic-vars-EARLY file exists
97
-          touch ironic-vars-early
98
-          # Pull in the EARLY variables injected by the optional builders
99
-          source ironic-vars-early
100
-
101
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin ironic https://opendev.org/openstack/ironic"
102
-
103
-          # Ensure the ironic-EXTRA-vars file exists
104
-          touch ironic-extra-vars
105
-          # Pull in the EXTRA variables injected by the optional builders
106
-          source ironic-extra-vars
107
-
108
-          cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
109
-          ./safe-devstack-vm-gate-wrap.sh
110
-        executable: /bin/bash
111
-        chdir: '{{ ansible_user_dir }}/workspace'
112
-      environment: '{{ zuul | zuul_legacy_vars }}'

+ 0
- 15
playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/post.yaml View File

@@ -1,15 +0,0 @@
1
-- hosts: primary
2
-  tasks:
3
-
4
-    - name: Copy files from {{ ansible_user_dir }}/workspace/ on node
5
-      synchronize:
6
-        src: '{{ ansible_user_dir }}/workspace/'
7
-        dest: '{{ zuul.executor.log_root }}'
8
-        mode: pull
9
-        copy_links: true
10
-        verify_host: true
11
-        rsync_opts:
12
-          - --include=/logs/**
13
-          - --include=*/
14
-          - --exclude=*
15
-          - --prune-empty-dirs

+ 0
- 108
playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/run.yaml View File

@@ -1,108 +0,0 @@
1
-- hosts: all
2
-  name: Autoconverted job legacy-tempest-dsvm-ironic-ipa-wholedisk-bios-pxe_ipmitool-coreos-src
3
-    from old job gate-tempest-dsvm-ironic-ipa-wholedisk-bios-pxe_ipmitool-coreos-src-ubuntu-xenial
4
-  tasks:
5
-
6
-    - name: Ensure legacy workspace directory
7
-      file:
8
-        path: '{{ ansible_user_dir }}/workspace'
9
-        state: directory
10
-
11
-    - shell:
12
-        cmd: |
13
-          set -e
14
-          set -x
15
-          cat > clonemap.yaml << EOF
16
-          clonemap:
17
-            - name: openstack/devstack-gate
18
-              dest: devstack-gate
19
-          EOF
20
-          /usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \
21
-              https://opendev.org \
22
-              openstack/devstack-gate
23
-        executable: /bin/bash
24
-        chdir: '{{ ansible_user_dir }}/workspace'
25
-      environment: '{{ zuul | zuul_legacy_vars }}'
26
-
27
-    # NOTE(TheJulia): The CoreOS ramdisk is generally slow to startup,
28
-    # on the order of 300-500 seconds.
29
-    - shell:
30
-        cmd: |
31
-          cat << 'EOF' >> ironic-extra-vars
32
-            export DEVSTACK_GATE_OS_TEST_TIMEOUT=2400
33
-            export DEVSTACK_GATE_TEMPEST_BAREMETAL_BUILD_TIMEOUT=1800
34
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_ENGINE=auto"
35
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_CPU=1"
36
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_SPECS_RAM=2048"
37
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_RAMDISK_TYPE=coreos"
38
-          EOF
39
-        chdir: '{{ ansible_user_dir }}/workspace'
40
-      environment: '{{ zuul | zuul_legacy_vars }}'
41
-
42
-    - shell:
43
-        cmd: |
44
-          cat << 'EOF' >> ironic-extra-vars
45
-            export DEVSTACK_GATE_TEMPEST_REGEX="ironic_tempest_plugin.tests.scenario"
46
-
47
-          EOF
48
-        chdir: '{{ ansible_user_dir }}/workspace'
49
-      environment: '{{ zuul | zuul_legacy_vars }}'
50
-
51
-    - shell:
52
-        cmd: |
53
-          cat << 'EOF' >> ironic-vars-early
54
-            # use tempest plugin
55
-            export DEVSTACK_LOCAL_CONFIG+=$'\n'"TEMPEST_PLUGINS+=' /opt/stack/new/ironic-tempest-plugin'"
56
-            export TEMPEST_CONCURRENCY=1
57
-          EOF
58
-        chdir: '{{ ansible_user_dir }}/workspace'
59
-      environment: '{{ zuul | zuul_legacy_vars }}'
60
-
61
-    - shell:
62
-        cmd: |
63
-          set -e
64
-          set -x
65
-          export PROJECTS="openstack/ironic $PROJECTS"
66
-          export PROJECTS="openstack/ironic-lib $PROJECTS"
67
-          export PROJECTS="openstack/ironic-python-agent $PROJECTS"
68
-          export PROJECTS="openstack/ironic-tempest-plugin $PROJECTS"
69
-          export PROJECTS="openstack/python-ironicclient $PROJECTS"
70
-          export PROJECTS="openstack/virtualbmc $PROJECTS"
71
-          export PYTHONUNBUFFERED=true
72
-          export DEVSTACK_GATE_TEMPEST=1
73
-          export DEVSTACK_GATE_IRONIC=1
74
-          export DEVSTACK_GATE_NEUTRON=1
75
-          export DEVSTACK_GATE_VIRT_DRIVER=ironic
76
-          export DEVSTACK_GATE_CONFIGDRIVE=1
77
-          export DEVSTACK_GATE_IRONIC_DRIVER=ipmi
78
-
79
-          if [[ ! "stable/newton stable/ocata stable/pike" =~ $ZUUL_BRANCH ]] ; then
80
-              export DEVSTACK_GATE_TLSPROXY=1
81
-          fi
82
-
83
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_TEMPEST_WHOLE_DISK_IMAGE=True"
84
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_EPHEMERAL_DISK=0"
85
-
86
-          export DEVSTACK_GATE_IRONIC_BUILD_RAMDISK=1
87
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_INSPECTOR_BUILD_RAMDISK=True"
88
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"USE_SUBNETPOOL=False"
89
-
90
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"IRONIC_VM_COUNT=1"
91
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"LIBVIRT_NIC_DRIVER=e1000"
92
-          # Ensure the ironic-vars-EARLY file exists
93
-          touch ironic-vars-early
94
-          # Pull in the EARLY variables injected by the optional builders
95
-          source ironic-vars-early
96
-
97
-          export DEVSTACK_LOCAL_CONFIG+=$'\n'"enable_plugin ironic https://opendev.org/openstack/ironic"
98
-
99
-          # Ensure the ironic-EXTRA-vars file exists
100
-          touch ironic-extra-vars
101
-          # Pull in the EXTRA variables injected by the optional builders
102
-          source ironic-extra-vars
103
-
104
-          cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
105
-          ./safe-devstack-vm-gate-wrap.sh
106
-        executable: /bin/bash
107
-        chdir: '{{ ansible_user_dir }}/workspace'
108
-      environment: '{{ zuul | zuul_legacy_vars }}'

+ 6
- 0
releasenotes/notes/no-coreos-3345cc69009dead9.yaml View File

@@ -0,0 +1,6 @@
1
+---
2
+upgrade:
3
+  - |
4
+    Images based on CoreOS are no longer supported and built. They were
5
+    deprecated in the Stein cycle and an alternative based on diskimage-builder
6
+    is being developed.

+ 0
- 9
zuul.d/ironic-python-agent-jobs.yaml View File

@@ -97,15 +97,6 @@
97 97
       - openstack/ironic-python-agent
98 98
       - openstack/ironic-python-agent-builder
99 99
 
100
-- job:
101
-    name: ironic-python-agent-buildimage-coreos
102
-    parent: ironic-python-agent-buildimage-base
103
-    vars:
104
-      image_name: 'coreos'
105
-      # TODO(dtantsur): refactor run.yaml, so that this variable is only
106
-      # required for DIB jobs.
107
-      image_distro: ''
108
-
109 100
 - job:
110 101
     name: ironic-python-agent-buildimage-tinyipa
111 102
     parent: ironic-python-agent-buildimage-base

+ 0
- 51
zuul.d/legacy-ironic-jobs.yaml View File

@@ -1,51 +0,0 @@
1
-- job:
2
-    name: legacy-ipa-dsvm-base
3
-    # NOTE: We do not use 'legacy-ironic-dsvm-base' as simpler and less
4
-    # confusing to define it all here and then use 'legacy-dsvm-base'
5
-    parent: legacy-dsvm-base
6
-    irrelevant-files:
7
-      - ^test-requirements.txt$
8
-      - ^.*\.rst$
9
-      - ^doc/.*$
10
-      - ^ironic_python_agent/tests/.*$
11
-      - ^releasenotes/.*$
12
-      - ^setup.cfg$
13
-      - ^tools/.*$
14
-      - ^tox.ini$
15
-    required-projects:
16
-      - openstack/devstack-gate
17
-      - openstack/ironic
18
-      - openstack/ironic-lib
19
-      - openstack/ironic-python-agent
20
-      - openstack/ironic-tempest-plugin
21
-      - openstack/python-ironicclient
22
-      - openstack/tempest
23
-      - openstack/virtualbmc
24
-
25
-- job:
26
-    name: ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src
27
-    parent: legacy-ipa-dsvm-base
28
-    run: playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/run.yaml
29
-    post-run: playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src/post.yaml
30
-    timeout: 7200
31
-
32
-- job:
33
-    name: ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src
34
-    parent: legacy-ipa-dsvm-base
35
-    run: playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/run.yaml
36
-    post-run: playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-direct-coreos-src/post.yaml
37
-    timeout: 5400
38
-
39
-- job:
40
-    name: ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src
41
-    parent: legacy-ipa-dsvm-base
42
-    run: playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/run.yaml
43
-    post-run: playbooks/legacy/ipa-tempest-dsvm-partition-bios-ipmi-iscsi-coreos-src/post.yaml
44
-    timeout: 7200
45
-
46
-- job:
47
-    name: ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src
48
-    parent: legacy-ipa-dsvm-base
49
-    run: playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/run.yaml
50
-    post-run: playbooks/legacy/ipa-tempest-dsvm-wholedisk-bios-ipmi-iscsi-coreos-src/post.yaml
51
-    timeout: 7200

+ 0
- 11
zuul.d/project.yaml View File

@@ -18,16 +18,6 @@
18 18
             voting: false
19 19
         - metalsmith-integration-ipa-src:
20 20
             voting: false
21
-        # NOTE(TheJulia): CoreOS jobs have a high failure rate.
22
-        # In order to reduce the odds of things like nested virt
23
-        # being detected but not available, we should treat them
24
-        # as non-voting. This is in order to reduce the need to
25
-        # recheck. If we non-voting tem on the gate, they are
26
-        # pointless, and the odds seem to enable them to pass
27
-        # more often than not.
28
-        # https://storyboard.openstack.org/#!/story/2003985
29
-        - ipa-tempest-dsvm-wholedisk-bios-ipmi-direct-coreos-src:
30
-            voting: false
31 21
         - openstack-tox-functional:
32 22
             voting: false
33 23
         - openstack-tox-lower-constraints
@@ -48,6 +38,5 @@
48 38
         - ipa-tempest-dsvm-partition-ipmi-iscsi-tinyipa-python3
49 39
     post:
50 40
       jobs:
51
-        - ironic-python-agent-buildimage-coreos
52 41
         - ironic-python-agent-buildimage-tinyipa
53 42
         - ironic-python-agent-buildimage-dib

Loading…
Cancel
Save