Remove productimg phase

JIRA: COMPOSE-4004
Signed-off-by: Haibo Lin <hlin@redhat.com>
This commit is contained in:
Haibo Lin 2019-12-11 15:59:26 +08:00 committed by lsedlar
parent 38f6162b46
commit 794d151bef
12 changed files with 371 additions and 753 deletions

BIN
doc/_static/phases.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 22 KiB

475
doc/_static/phases.svg vendored
View File

@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@ -9,58 +7,58 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="771.66455"
height="221.50018"
viewBox="0 0 771.66458 221.50019"
id="svg2"
version="1.1"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="phases.svg"
inkscape:export-filename="/home/lsedlar/repos/pungi/doc/_static/phases.png"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
inkscape:export-filename="/home/lsedlar/repos/pungi/doc/_static/phases.png"
sodipodi:docname="phases.svg"
inkscape:version="1.0beta2 (2b71d25, 2019-12-03)"
version="1.1"
id="svg2"
viewBox="0 0 771.66458 221.50019"
height="221.50018"
width="771.66455">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.169022"
inkscape:cx="396.63448"
inkscape:cy="97.894202"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="1"
units="px"
inkscape:document-rotation="0"
showguides="true"
inkscape:guide-bbox="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-bottom="0" />
fit-margin-left="0"
fit-margin-top="0"
inkscape:guide-bbox="true"
showguides="true"
inkscape:document-rotation="0"
units="px"
inkscape:window-maximized="1"
inkscape:window-y="23"
inkscape:window-x="0"
inkscape:window-height="1035"
inkscape:window-width="1920"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:document-units="px"
inkscape:cy="97.894202"
inkscape:cx="396.63448"
inkscape:zoom="1.169022"
inkscape:pageshadow="2"
inkscape:pageopacity="1"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base" />
<defs
id="defs4">
<marker
inkscape:isstock="true"
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
inkscape:stockid="Arrow1Lend"
orient="auto"
inkscape:stockid="Arrow1Lend">
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
id="path4451"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4451" />
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<metadata
@ -71,278 +69,260 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="matrix(1.066667,0,0,1.066667,-2.473231,-910.85239)"
id="layer1"
inkscape:label="Vrstva 1"
inkscape:groupmode="layer"
inkscape:label="Vrstva 1">
id="layer1"
transform="matrix(1.066667,0,0,1.066667,-2.473231,-910.85239)">
<g
transform="translate(-1.131703,-80.47309)"
id="g3411">
id="g3411"
transform="translate(71.99326,-80.817124)">
<rect
style="fill:#8ae234;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3340"
width="26.295755"
height="49.214859"
x="953.49097"
transform="matrix(0,1,1,0,0,0)"
y="49.250374"
transform="matrix(0,1,1,0,0,0)" />
x="953.49097"
height="49.214859"
width="26.295755"
id="rect3340"
style="fill:#8ae234;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
xml:space="preserve"
id="text3360"
y="970.26605"
x="51.554729"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="51.554729"
xml:space="preserve"><tspan
style="font-size:13.1479px;line-height:1.25"
y="970.26605"
id="text3360"><tspan
sodipodi:role="line"
x="51.554729"
id="tspan3362"
x="51.554729"
y="970.26605"
style="font-size:13.14787769px;line-height:1.25">Pkgset</tspan></text>
sodipodi:role="line">Pkgset</tspan></text>
</g>
<g
transform="translate(3.704976,-80.47309)"
id="g3446">
id="g3446"
transform="translate(-22.545013,-80.817124)">
<rect
y="554.10059"
x="953.49097"
height="115.80065"
width="26.295755"
id="rect3338-1"
transform="matrix(0,1,1,0,0,0)"
style="fill:#e9b96e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(0,1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="556.95709"
y="971.54041"
id="text3384-0"><tspan
y="971.54041"
x="556.95709"
sodipodi:role="line"
id="tspan3391"
style="font-size:13.14749908px;line-height:1.25">ImageChecksum</tspan></text>
</g>
<g
transform="translate(125.75393,-80.47309)"
id="g3398">
<rect
y="553.98242"
x="953.49097"
height="46.01757"
id="rect3338-1"
width="26.295755"
id="rect3400"
style="fill:#3465a4;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(0,1,1,0,0,0)" />
height="115.80065"
x="953.49097"
y="554.10059" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="557.61566"
y="971.33813"
id="text3396"><tspan
id="text3384-0"
y="971.54041"
x="556.95709"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.1475px;line-height:1.25"
id="tspan3391"
sodipodi:role="line"
id="tspan3398"
x="557.61566"
y="971.33813"
style="font-size:13.14787769px;line-height:1.25">Test</tspan></text>
x="556.95709"
y="971.54041">ImageChecksum</tspan></text>
</g>
<g
id="g3398"
transform="translate(101.37893,-80.817124)">
<rect
transform="matrix(0,1,1,0,0,0)"
style="fill:#3465a4;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3400"
width="26.295755"
height="46.01757"
x="953.49097"
y="553.98242" />
<text
id="text3396"
y="971.33813"
x="557.61566"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.1479px;line-height:1.25"
y="971.33813"
x="557.61566"
id="tspan3398"
sodipodi:role="line">Test</tspan></text>
</g>
<g
transform="translate(71.249964,-0.34404039)"
id="g3720">
<rect
style="fill:#fce94f;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3336"
width="26.295755"
height="39.669899"
x="873.01788"
transform="matrix(0,1,1,0,0,0)"
y="2.3186533"
transform="matrix(0,1,1,0,0,0)" />
x="873.01788"
height="39.669899"
width="26.295755"
id="rect3336"
style="fill:#fce94f;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
xml:space="preserve"
id="text3356"
y="891.1604"
x="6.2600794"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="6.2600794"
xml:space="preserve"><tspan
style="font-size:13.1479px;line-height:1.25"
y="891.1604"
id="text3356"><tspan
sodipodi:role="line"
x="6.2600794"
id="tspan3358"
x="6.2600794"
y="891.1604"
style="font-size:13.14787769px;line-height:1.25">Init</tspan></text>
sodipodi:role="line">Init</tspan></text>
</g>
<path
inkscape:connector-curvature="0"
id="path3642"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.17466855px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 100.90864,859.8891 H 654.22706"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.17466855px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
<g
id="g241"
transform="translate(-60.108974,42.1407)">
<rect
style="fill:#a40000;fill-rule:evenodd;stroke:none;stroke-width:1.10477591px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3350"
width="26.295755"
height="101.73411"
x="830.8772"
y="400.8551"
transform="matrix(0,1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="403.15945"
y="847.65234"
id="text3380"><tspan
sodipodi:role="line"
id="tspan3382"
x="403.15945"
y="847.65234"
style="font-size:13.14787769px;line-height:1.25">Productimg</tspan></text>
</g>
id="path3642"
inkscape:connector-curvature="0" />
<g
transform="translate(75.925692,-0.34404039)"
id="g3668">
<g
id="g3663">
<rect
transform="matrix(0,1,1,0,0,0)"
y="103.46365"
x="873.01788"
height="231.47725"
width="26.295755"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3342"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
width="26.295755"
height="231.47725"
x="873.01788"
y="103.46365"
transform="matrix(0,1,1,0,0,0)" />
<text
id="text3364"
y="891.06732"
x="105.76799"
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
y="891.06732"
x="105.76799"
y="891.06732"
id="text3364"><tspan
sodipodi:role="line"
id="tspan3366"
sodipodi:role="line">Buildinstall</tspan></text>
x="105.76799"
y="891.06732"
style="font-size:13.1479px;line-height:1.25">Buildinstall</tspan></text>
</g>
<g
id="g3639">
<rect
transform="matrix(0,1,1,0,0,0)"
y="103.28194"
x="905.2099"
height="54.197887"
width="26.295755"
style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3344"
style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
width="26.295755"
height="54.197887"
x="905.2099"
y="103.28194"
transform="matrix(0,1,1,0,0,0)" />
<text
id="text3368"
y="923.25934"
x="106.1384"
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
y="923.25934"
x="106.1384"
y="923.25934"
id="text3368"><tspan
sodipodi:role="line"
id="tspan3370"
sodipodi:role="line">Gather</tspan></text>
x="106.1384"
y="923.25934"
style="font-size:13.1479px;line-height:1.25">Gather</tspan></text>
</g>
<g
id="g3647">
<g
id="g3644">
<rect
style="fill:#ad7fa8;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3346"
width="26.295755"
height="72.729973"
x="905.2099"
transform="matrix(0,1,1,0,0,0)"
y="162.92607"
transform="matrix(0,1,1,0,0,0)" />
x="905.2099"
height="72.729973"
width="26.295755"
id="rect3346"
style="fill:#ad7fa8;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<text
id="text3372"
y="923.25934"
x="165.23042"
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
y="923.25934"
x="165.23042"
y="923.25934"
id="text3372"><tspan
sodipodi:role="line"
id="tspan3374"
sodipodi:role="line">ExtraFiles</tspan></text>
x="165.23042"
y="923.25934"
style="font-size:13.1479px;line-height:1.25">ExtraFiles</tspan></text>
</g>
<g
id="g3658">
<rect
transform="matrix(0,1,1,0,0,0)"
y="241.10229"
x="905.2099"
height="78.636055"
width="26.295755"
style="fill:#e9b96e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3348"
style="fill:#e9b96e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
id="text3376"
y="921.86945"
x="243.95874"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
y="921.86945"
x="243.95874"
id="tspan3378"
sodipodi:role="line">Createrepo</tspan></text>
</g>
<g
id="g3408"
transform="translate(-150.564,114.11662)">
<rect
transform="matrix(0,1,1,0,0,0)"
y="254.60153"
x="823.54675"
height="53.653927"
width="26.295755"
id="rect3350-3"
style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
id="text3380-2"
y="840.3219"
x="256.90588"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
id="tspan3406"
sodipodi:role="line"
x="256.90588"
y="840.3219">OSTree</tspan></text>
</g>
<g
transform="translate(-328.39105,-85.517823)"
id="g288">
<g
transform="translate(0.56706579)"
id="g3653">
<rect
style="fill:#fcaf3e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3428"
width="26.295755"
height="101.85102"
x="1022.637"
y="490.33765"
height="78.636055"
x="905.2099"
y="241.10229"
transform="matrix(0,1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="492.642"
y="1039.4121"
id="text3430"><tspan
id="tspan283"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="243.95874"
y="921.86945"
id="text3376"><tspan
sodipodi:role="line"
x="492.642"
id="tspan3378"
x="243.95874"
y="921.86945"
style="font-size:13.1479px;line-height:1.25">Createrepo</tspan></text>
</g>
<g
transform="translate(-150.564,114.11662)"
id="g3408">
<rect
style="fill:#729fcf;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect3350-3"
width="26.295755"
height="53.653927"
x="823.54675"
y="254.60153"
transform="matrix(0,1,1,0,0,0)" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="256.90588"
y="840.3219"
id="text3380-2"><tspan
y="840.3219"
x="256.90588"
sodipodi:role="line"
id="tspan3406"
style="font-size:13.1479px;line-height:1.25">OSTree</tspan></text>
</g>
<g
id="g288"
transform="translate(-328.39105,-85.517823)">
<g
id="g3653"
transform="translate(0.56706579)">
<rect
transform="matrix(0,1,1,0,0,0)"
y="490.33765"
x="1022.637"
height="101.85102"
width="26.295755"
id="rect3428"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<text
id="text3430"
y="1039.4121"
style="font-size:11.99999714px;line-height:0">OSTreeInstaller</tspan></text>
x="492.642"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:12px;line-height:0"
y="1039.4121"
x="492.642"
sodipodi:role="line"
id="tspan283">OSTreeInstaller</tspan></text>
</g>
</g>
</g>
<g
transform="translate(-29.683562,-0.34408888)"
id="g236">
<g
id="g3458"
transform="translate(28.723958,-80.473035)">
@ -360,7 +340,7 @@
x="422.99252"
y="971.54041"
id="text3384"><tspan
style="font-size:13.14787769px;line-height:1.25"
style="font-size:13.1479px;line-height:1.25"
sodipodi:role="line"
id="tspan3386"
x="422.99252"
@ -383,7 +363,7 @@
x="422.69772"
y="1006.4276"
id="text3388"><tspan
style="font-size:13.14787769px;line-height:1.25"
style="font-size:13.1479px;line-height:1.25"
sodipodi:role="line"
id="tspan3390"
x="422.69772"
@ -406,7 +386,7 @@
x="422.69772"
y="1042.8416"
id="text3392"><tspan
style="font-size:13.14787769px;line-height:1.25"
style="font-size:13.1479px;line-height:1.25"
sodipodi:role="line"
id="tspan3394"
x="422.69772"
@ -429,7 +409,7 @@
x="423.40482"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:13.14787769px;line-height:1.25"
style="font-size:13.1479px;line-height:1.25"
y="1079.6111"
x="423.40482"
sodipodi:role="line"
@ -452,7 +432,7 @@
x="492.642"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:11.99999714px;line-height:0"
style="font-size:12px;line-height:0"
id="tspan301"
sodipodi:role="line"
x="492.642"
@ -479,7 +459,8 @@
y="1069.0087"
x="451.16522"
sodipodi:role="line"
style="font-size:13.14787769px;line-height:1.25">ExtraIsos</tspan></text>
style="font-size:13.1479px;line-height:1.25">ExtraIsos</tspan></text>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1046,44 +1046,6 @@ in the ``os/`` directory and media. The checksums generated are determined by
}
Productimg Settings
===================
Product images are placed on installation media and provide additional branding
and Anaconda changes specific to product variants.
Options
-------
**productimg** = False
(*bool*) -- create product images; requires buildinstall_method option
**productimg_install_class**
(:ref:`scm_dict <scm_support>`, *str*) -- reference to install class **file**
**productimg_po_files**
(:ref:`scm_dict <scm_support>`, *str*) -- reference to a **directory** with
po files for install class translations
Example
-------
::
productimg = True
productimg_install_class = {
"scm": "git",
"repo": "http://git.example.com/productimg.git",
"branch": None,
"file": "fedora23/%(variant_id)s.py",
}
productimg_po_files = {
"scm": "git",
"repo": "http://git.example.com/productimg.git",
"branch": None,
"dir": "po",
}
CreateISO Settings
==================

View File

@ -78,12 +78,6 @@ compose fails in a later stage, the commit will not be reverted.
Implementation wise, this phase runs ``rpm-ostree`` command in Koji runroot (to
allow running on different arches).
Productimg
----------
Creates ``product.img`` files for customizing the bootable media created in
``buildinstall`` phase.
Createiso
---------

View File

@ -52,22 +52,18 @@ from productmd.composeinfo import COMPOSE_TYPES
from . import util
def _will_productimg_run(conf):
return conf.get('productimg', False) and conf.get('buildinstall_method', '')
def is_jigdo_needed(conf):
return conf.get('create_jigdo', True)
def is_isohybrid_needed(conf):
"""The isohybrid command is needed locally only for productimg phase and
"""The isohybrid command is needed locally only for
createiso phase without runroot. If that is not going to run, we don't need
to check for it. Additionally, the syslinux package is only available on
x86_64 and i386.
"""
runroot_tag = conf.get('runroot_tag', '')
if runroot_tag and not _will_productimg_run(conf):
if runroot_tag:
return False
if platform.machine() not in ('x86_64', 'i686', 'i386'):
print('Not checking for /usr/bin/isohybrid due to current architecture. '
@ -77,10 +73,10 @@ def is_isohybrid_needed(conf):
def is_genisoimage_needed(conf):
"""This is only needed locally for productimg and createiso without runroot.
"""This is only needed locally for createiso without runroot.
"""
runroot_tag = conf.get('runroot_tag', '')
if runroot_tag and not _will_productimg_run(conf):
if runroot_tag:
return False
return True
@ -98,7 +94,6 @@ tools = [
("isomd5sum", "/usr/bin/checkisomd5", None),
("jigdo", "/usr/bin/jigdo-lite", is_jigdo_needed),
("genisoimage", "/usr/bin/genisoimage", is_genisoimage_needed),
("gettext", "/usr/bin/msgfmt", _will_productimg_run),
("syslinux", "/usr/bin/isohybrid", is_isohybrid_needed),
# createrepo, modifyrepo and mergerepo are not needed by default, only when
# createrepo_c is not configured
@ -1269,11 +1264,8 @@ def make_schema():
"signing_key_password_file": {"type": "string"},
"signing_command": {"type": "string"},
"productimg": {
"type": "boolean",
"default": False
"deprecated": "remove it. Productimg phase has been removed"
},
"productimg_install_class": {"$ref": "#/definitions/str_or_scm_dict"},
"productimg_po_files": {"$ref": "#/definitions/str_or_scm_dict"},
"iso_size": {
"anyOf": [
{"type": "string"},
@ -1396,13 +1388,6 @@ def get_num_cpus():
# encountered and its value satisfies the lambda, an error is reported for each
# missing (for requires) option in the list.
CONFIG_DEPS = {
"productimg": {
"requires": (
(lambda x: bool(x), ["productimg_install_class"]),
(lambda x: bool(x), ["productimg_po_files"]),
),
},
"buildinstall_method": {
"conflicts": (
(lambda val: val == "buildinstall", ["lorax_options"]),

View File

@ -332,14 +332,6 @@ def write_tree_info(compose, arch, variant, timestamp=None, bi=None):
ti.images.images[platform][image] = path
ti.checksums.add(path, createrepo_checksum, root_dir=os_tree)
# add product.img to images-$arch
product_img = os.path.join(os_tree, "images", "product.img")
product_img_relpath = relative_path(product_img, os_tree.rstrip("/") + "/")
if os.path.isfile(product_img):
for platform in ti.images.images:
ti.images.images[platform]["product.img"] = product_img_relpath
ti.checksums.add(product_img_relpath, createrepo_checksum, root_dir=os_tree)
path = os.path.join(compose.paths.compose.os_tree(arch=arch, variant=variant), ".treeinfo")
compose.log_info("Writing treeinfo: %s" % path)
ti.dump(path)

View File

@ -324,16 +324,6 @@ class WorkPaths(object):
path = os.path.join(path, file_name)
return path
def product_img(self, variant, create_dir=True):
"""
Examples:
work/global/product-Server.img
"""
file_name = "product-%s.img" % variant
path = self.topdir(arch="global", create_dir=create_dir)
path = os.path.join(path, file_name)
return path
def iso_dir(self, arch, filename, create_dir=True):
"""
Examples:

View File

@ -21,7 +21,6 @@ from .weaver import WeaverPhase # noqa
from .pkgset import PkgsetPhase # noqa
from .gather import GatherPhase # noqa
from .createrepo import CreaterepoPhase # noqa
from .product_img import ProductimgPhase # noqa
from .buildinstall import BuildinstallPhase # noqa
from .extra_files import ExtraFilesPhase # noqa
from .createiso import CreateisoPhase # noqa

View File

@ -1,276 +0,0 @@
# -*- coding: utf-8 -*-
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <https://gnu.org/licenses/>.
"""
Expected product.img paths
==========================
RHEL 6
------
installclasses/$variant.py
locale/$lang/LC_MESSAGES/comps.mo
RHEL 7
------
run/install/product/installclasses/$variant.py
run/install/product/locale/$lang/LC_MESSAGES/comps.mo
Compatibility symlinks
----------------------
installclasses -> run/install/product/installclasses
locale -> run/install/product/locale
run/install/product/pyanaconda/installclasses -> ../installclasses
"""
import os
import fnmatch
import shutil
from six.moves import shlex_quote
from kobo.shortcuts import run
from pungi.arch import split_name_arch
from pungi.util import makedirs, pkg_is_rpm
from pungi.phases.base import PhaseBase
from pungi.wrappers import iso
from pungi.wrappers.scm import get_file_from_scm, get_dir_from_scm
class ProductimgPhase(PhaseBase):
"""PRODUCTIMG"""
name = "productimg"
def __init__(self, compose, pkgset_phase):
PhaseBase.__init__(self, compose)
# pkgset_phase provides package_sets and path_prefix
self.pkgset_phase = pkgset_phase
def skip(self):
if PhaseBase.skip(self):
return True
if not self.compose.conf["productimg"]:
msg = "Config option 'productimg' not set. Skipping creating product images."
self.compose.log_debug(msg)
return True
if not self.compose.conf["buildinstall_method"]:
msg = "Not a bootable product. Skipping creating product images."
self.compose.log_debug(msg)
return True
return False
def run(self):
# create PRODUCT.IMG
for variant in self.compose.get_variants():
if variant.type != "variant" or variant.is_empty:
continue
create_product_img(self.compose, "global", variant)
# copy PRODUCT.IMG
for arch in self.compose.get_arches():
for variant in self.compose.get_variants(arch=arch):
if variant.type != "variant" or variant.is_empty:
continue
image = self.compose.paths.work.product_img(variant)
os_tree = self.compose.paths.compose.os_tree(arch, variant)
target_dir = os.path.join(os_tree, "images")
target_path = os.path.join(target_dir, "product.img")
if not os.path.isfile(target_path):
makedirs(target_dir)
shutil.copy2(image, target_path)
for arch in self.compose.get_arches():
for variant in self.compose.get_variants(arch=arch):
if variant.type != "variant" or variant.is_empty:
continue
rebuild_boot_iso(self.compose, arch, variant, self.pkgset_phase.package_sets)
def create_product_img(compose, arch, variant):
# product.img is noarch (at least on rhel6 and rhel7)
arch = "global"
msg = "Creating product.img (arch: %s, variant: %s)" % (arch, variant)
image = compose.paths.work.product_img(variant)
if os.path.exists(image):
compose.log_warning("[SKIP ] %s" % msg)
return
compose.log_info("[BEGIN] %s" % msg)
product_tmp = compose.mkdtemp(prefix="product_img_")
install_class = compose.conf["productimg_install_class"].copy()
install_class["file"] = install_class["file"] % {"variant_id": variant.id.lower()}
install_dir = os.path.join(product_tmp, "installclasses")
makedirs(install_dir)
get_file_from_scm(install_class, target_path=install_dir)
po_files = compose.conf["productimg_po_files"]
po_tmp = compose.mkdtemp(prefix="pofiles_")
get_dir_from_scm(po_files, po_tmp, compose=compose)
for po_file in os.listdir(po_tmp):
if not po_file.endswith(".po"):
continue
lang = po_file[:-3]
target_dir = os.path.join(product_tmp, "locale", lang, "LC_MESSAGES")
makedirs(target_dir)
run(["msgfmt", "--output-file", os.path.join(target_dir, "comps.mo"), os.path.join(po_tmp, po_file)])
shutil.rmtree(po_tmp)
ret, __ = run(["which", "guestmount"], can_fail=True)
guestmount_available = not bool(ret) # return code 0 means that guestmount is available
mount_tmp = compose.mkdtemp(prefix="product_img_mount_")
cmds = [
# allocate image
"dd if=/dev/zero of=%s bs=1k count=5760" % shlex_quote(image),
# create file system
"mke2fs -F %s" % shlex_quote(image),
# use guestmount to mount the image, which doesn't require root privileges
# LIBGUESTFS_BACKEND=direct: running qemu directly without libvirt
"LIBGUESTFS_BACKEND=direct guestmount -a %s -m /dev/sda %s" % (shlex_quote(image), shlex_quote(mount_tmp)) if guestmount_available
else "mount -o loop %s %s" % (shlex_quote(image), shlex_quote(mount_tmp)),
"mkdir -p %s/run/install/product" % shlex_quote(mount_tmp),
"cp -rp %s/* %s/run/install/product/" % (shlex_quote(product_tmp), shlex_quote(mount_tmp)),
"mkdir -p %s/run/install/product/pyanaconda" % shlex_quote(mount_tmp),
# compat symlink: installclasses -> run/install/product/installclasses
"ln -s run/install/product/installclasses %s" % shlex_quote(mount_tmp),
# compat symlink: locale -> run/install/product/locale
"ln -s run/install/product/locale %s" % shlex_quote(mount_tmp),
# compat symlink: run/install/product/pyanaconda/installclasses -> ../installclasses
"ln -s ../installclasses %s/run/install/product/pyanaconda/installclasses" % shlex_quote(mount_tmp),
"fusermount -u %s" % shlex_quote(mount_tmp) if guestmount_available
else "umount %s" % shlex_quote(mount_tmp),
# tweak last mount path written in the image
"tune2fs -M /run/install/product %s" % shlex_quote(image),
]
run(" && ".join(cmds))
shutil.rmtree(mount_tmp)
shutil.rmtree(product_tmp)
compose.log_info("[DONE ] %s" % msg)
def rebuild_boot_iso(compose, arch, variant, package_sets):
os_tree = compose.paths.compose.os_tree(arch, variant)
buildinstall_dir = compose.paths.work.buildinstall_dir(arch)
boot_iso = os.path.join(os_tree, "images", "boot.iso")
product_img = compose.paths.work.product_img(variant)
buildinstall_boot_iso = os.path.join(buildinstall_dir, "images", "boot.iso")
buildinstall_method = compose.conf["buildinstall_method"]
log_file = compose.paths.log.log_file(arch, "rebuild_boot_iso-%s.%s" % (variant, arch))
msg = "Rebuilding boot.iso (arch: %s, variant: %s)" % (arch, variant)
if not os.path.isfile(boot_iso):
# nothing to do
compose.log_warning("[SKIP ] %s" % msg)
return
compose.log_info("[BEGIN] %s" % msg)
# read the original volume id
volume_id = iso.get_volume_id(boot_iso)
# remove the original boot.iso (created during buildinstall) from the os dir
os.remove(boot_iso)
tmp_dir = compose.mkdtemp(prefix="boot_iso_")
mount_dir = compose.mkdtemp(prefix="boot_iso_mount_")
cmd = "mount -o loop %s %s" % (shlex_quote(buildinstall_boot_iso), shlex_quote(mount_dir))
run(cmd, logfile=log_file, show_cmd=True)
images_dir = os.path.join(tmp_dir, "images")
os.makedirs(images_dir)
shutil.copy2(product_img, os.path.join(images_dir, "product.img"))
if os.path.isfile(os.path.join(mount_dir, "isolinux", "isolinux.bin")):
os.makedirs(os.path.join(tmp_dir, "isolinux"))
shutil.copy2(os.path.join(mount_dir, "isolinux", "isolinux.bin"), os.path.join(tmp_dir, "isolinux"))
graft_points = iso.get_graft_points([mount_dir, tmp_dir])
graft_points_path = os.path.join(compose.paths.work.topdir(arch=arch), "boot-%s.%s.iso-graft-points" % (variant, arch))
iso.write_graft_points(graft_points_path, graft_points, exclude=["*/TRANS.TBL", "*/boot.cat"])
mkisofs_kwargs = {}
boot_files = None
if buildinstall_method == "lorax":
# TODO: $arch instead of ppc
mkisofs_kwargs["boot_args"] = iso.get_boot_options(arch, "/usr/share/lorax/config_files/ppc")
elif buildinstall_method == "buildinstall":
boot_files = explode_anaconda(compose, arch, variant, package_sets)
mkisofs_kwargs["boot_args"] = iso.get_boot_options(arch, boot_files)
# ppc(64) doesn't seem to support utf-8
if arch in ("ppc", "ppc64"):
mkisofs_kwargs["input_charset"] = None
mkisofs_cmd = iso.get_mkisofs_cmd(boot_iso, None, volid=volume_id, exclude=["./lost+found"], graft_points=graft_points_path, **mkisofs_kwargs)
run(mkisofs_cmd, logfile=log_file, show_cmd=True)
cmd = "umount %s" % shlex_quote(mount_dir)
run(cmd, logfile=log_file, show_cmd=True)
if arch == "x86_64":
isohybrid_cmd = "isohybrid --uefi %s" % shlex_quote(boot_iso)
run(isohybrid_cmd, logfile=log_file, show_cmd=True)
elif arch == "i386":
isohybrid_cmd = "isohybrid %s" % shlex_quote(boot_iso)
run(isohybrid_cmd, logfile=log_file, show_cmd=True)
# implant MD5SUM to iso
isomd5sum_cmd = iso.get_implantisomd5_cmd(boot_iso, compose.supported)
isomd5sum_cmd = " ".join([shlex_quote(i) for i in isomd5sum_cmd])
run(isomd5sum_cmd, logfile=log_file, show_cmd=True)
if boot_files:
shutil.rmtree(boot_files)
shutil.rmtree(tmp_dir)
shutil.rmtree(mount_dir)
compose.log_info("[DONE ] %s" % msg)
def explode_anaconda(compose, arch, variant, package_sets):
tmp_dir = compose.mkdtemp(prefix="anaconda_")
scm_dict = {
"scm": "rpm",
"repo": "anaconda.%s" % arch,
"file": [
"/usr/lib/anaconda-runtime/boot/*",
]
}
# if scm is "rpm" and repo contains a package name, find the package(s) in package set
if scm_dict["scm"] == "rpm" and not (scm_dict["repo"].startswith("/") or "://" in scm_dict["repo"]):
rpms = []
for pkgset in package_sets:
for pkgset_file in pkgset[arch]:
pkg_obj = pkgset[arch][pkgset_file]
if not pkg_is_rpm(pkg_obj):
continue
pkg_name, pkg_arch = split_name_arch(scm_dict["repo"])
if fnmatch.fnmatch(pkg_obj.name, pkg_name) and (pkg_arch is None or pkg_arch == pkg_obj.arch):
compose.log_critical("%s %s %s" % (pkg_obj.name, pkg_name, pkg_arch))
rpms.append(pkg_obj.file_path)
scm_dict["repo"] = rpms
if not rpms:
return None
get_file_from_scm(scm_dict, tmp_dir, logger=compose._logger)
return tmp_dir

View File

@ -115,7 +115,6 @@ def run(config, topdir, has_old, offline, defined_variables):
pungi.phases.CreaterepoPhase(compose),
pungi.phases.OstreeInstallerPhase(compose, buildinstall_phase),
pungi.phases.OSTreePhase(compose),
pungi.phases.ProductimgPhase(compose, pkgset_phase),
pungi.phases.CreateisoPhase(compose, buildinstall_phase),
pungi.phases.ExtraIsosPhase(compose),
pungi.phases.LiveImagesPhase(compose),

View File

@ -35,6 +35,8 @@ COMPOSE = None
def main():
global COMPOSE
PHASES_NAMES_MODIFIED = PHASES_NAMES + ['productimg']
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
@ -79,7 +81,7 @@ def main():
parser.add_argument(
"--skip-phase",
metavar="PHASE",
choices=PHASES_NAMES,
choices=PHASES_NAMES_MODIFIED,
action="append",
default=[],
help="skip a compose phase",
@ -87,7 +89,7 @@ def main():
parser.add_argument(
"--just-phase",
metavar="PHASE",
choices=PHASES_NAMES,
choices=PHASES_NAMES_MODIFIED,
action="append",
default=[],
help="run only a specified compose phase",
@ -224,6 +226,16 @@ def main():
if not pungi.checks.check_skip_phases(logger, opts.skip_phase):
sys.exit(1)
errors, warnings = pungi.checks.validate(conf)
# TODO: workaround for config files containing skip_phase = productimg
# Remove when all config files are up to date
if 'productimg' in opts.skip_phase or 'productimg' in opts.just_phase:
print('WARNING: productimg phase has been removed, please remove it from --skip-phase or --just-phase option', file=sys.stderr)
for err in errors[:]:
if "'productimg' is not one of" in err:
errors.remove(err)
print("WARNING: %s" % err, file=sys.stderr)
if not opts.quiet:
for warning in warnings:
print(warning, file=sys.stderr)
@ -291,7 +303,6 @@ def run_compose(compose, create_latest_link=True, latest_link_status=None):
createrepo_phase = pungi.phases.CreaterepoPhase(compose, pkgset_phase)
ostree_installer_phase = pungi.phases.OstreeInstallerPhase(compose, buildinstall_phase, pkgset_phase)
ostree_phase = pungi.phases.OSTreePhase(compose, pkgset_phase)
productimg_phase = pungi.phases.ProductimgPhase(compose, pkgset_phase)
createiso_phase = pungi.phases.CreateisoPhase(compose, buildinstall_phase)
extra_isos_phase = pungi.phases.ExtraIsosPhase(compose)
liveimages_phase = pungi.phases.LiveImagesPhase(compose)
@ -303,7 +314,7 @@ def run_compose(compose, create_latest_link=True, latest_link_status=None):
# check if all config options are set
for phase in (init_phase, pkgset_phase, createrepo_phase,
buildinstall_phase, productimg_phase, gather_phase,
buildinstall_phase, gather_phase,
extrafiles_phase, createiso_phase, liveimages_phase,
livemedia_phase, image_build_phase, image_checksum_phase,
test_phase, ostree_phase, ostree_installer_phase,
@ -374,9 +385,6 @@ def run_compose(compose, create_latest_link=True, latest_link_status=None):
essentials_phase.start()
essentials_phase.stop()
productimg_phase.start()
productimg_phase.stop()
# write treeinfo before ISOs are created
for variant in compose.get_variants():
for arch in variant.arches + ["src"]:

View File

@ -89,8 +89,7 @@ class CheckDependenciesTestCase(unittest.TestCase):
def test_isohybrid_not_required_on_arm(self):
conf = {
'buildinstall_method': 'lorax',
'productimg': True,
'runroot_tag': 'dummy_tag',
'runroot_tag': '',
}
with mock.patch('sys.stdout', new_callable=StringIO) as out:
@ -129,21 +128,6 @@ class CheckDependenciesTestCase(unittest.TestCase):
self.assertEqual('', out.getvalue())
self.assertTrue(result)
def test_genisoimg_needed_for_productimg(self):
conf = {
'runroot_tag': 'dummy_tag',
'productimg': True,
'buildinstall_method': 'lorax',
}
with mock.patch('sys.stdout', new_callable=StringIO) as out:
with mock.patch('os.path.exists') as exists:
exists.side_effect = self.dont_find(['/usr/bin/genisoimage'])
result = checks.check(conf)
self.assertIn('genisoimage', out.getvalue())
self.assertFalse(result)
def test_requires_modifyrepo(self):
with mock.patch('sys.stdout', new_callable=StringIO) as out:
with mock.patch('os.path.exists') as exists: