数据管理页面的样式修改

This commit is contained in:
Linda 2016-09-06 17:41:54 +08:00
parent 7073155320
commit 29637f20e8
168 changed files with 26623 additions and 26621 deletions

View File

@ -1,5 +1,5 @@
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
/// <reference path="kubernetesPlugin.d.ts" /> /// <reference path="kubernetesPlugin.d.ts" />
declare module Kubernetes { declare module Kubernetes {
var BuildConfigsController: ng.IModule; var BuildConfigsController: ng.IModule;
} }

View File

@ -1,6 +1,6 @@
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
/// <reference path="kubernetesHelpers.d.ts" /> /// <reference path="kubernetesHelpers.d.ts" />
/// <reference path="kubernetesPlugin.d.ts" /> /// <reference path="kubernetesPlugin.d.ts" />
declare module Kubernetes { declare module Kubernetes {
var PodController: ng.IModule; var PodController: ng.IModule;
} }

View File

@ -1,6 +1,6 @@
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
/// <reference path="kubernetesHelpers.d.ts" /> /// <reference path="kubernetesHelpers.d.ts" />
/// <reference path="kubernetesPlugin.d.ts" /> /// <reference path="kubernetesPlugin.d.ts" />
declare module Kubernetes { declare module Kubernetes {
var KubernetesJsonDirective: ng.IModule; var KubernetesJsonDirective: ng.IModule;
} }

View File

@ -1,9 +1,9 @@
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
/// <reference path="kubernetesPlugin.d.ts" /> /// <reference path="kubernetesPlugin.d.ts" />
declare module Kubernetes { declare module Kubernetes {
class oracleModelService { class oracleModelService {
oraclecontrollers: any[]; oraclecontrollers: any[];
oracleControllers: Array<any>; oracleControllers: Array<any>;
findIndexOfOracleControllers(oracleControllers: Array<any>, name: string): number; findIndexOfOracleControllers(oracleControllers: Array<any>, name: string): number;
} }
} }

View File

@ -1,30 +1,30 @@
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
declare module Service { declare module Service {
var pluginName: string; var pluginName: string;
var log: Logging.Logger; var log: Logging.Logger;
/** /**
* Used to specify whether the "service" URL should be polled for services using kubernetes or kubernetes-like service discover. * Used to specify whether the "service" URL should be polled for services using kubernetes or kubernetes-like service discover.
* For more details see: https://github.com/hawtio/hawtio/blob/master/docs/Services.md * For more details see: https://github.com/hawtio/hawtio/blob/master/docs/Services.md
*/ */
var pollServices: boolean; var pollServices: boolean;
/** /**
* Returns true if there is a service available for the given ID or false * Returns true if there is a service available for the given ID or false
*/ */
function hasService(ServiceRegistry: any, serviceName: string): boolean; function hasService(ServiceRegistry: any, serviceName: string): boolean;
/** /**
* Returns the service for the given service name (ID) or null if it cannot be found * Returns the service for the given service name (ID) or null if it cannot be found
* *
* @param ServiceRegistry * @param ServiceRegistry
* @param serviceName * @param serviceName
* @return {null} * @return {null}
*/ */
function findService(ServiceRegistry: any, serviceName: string): any; function findService(ServiceRegistry: any, serviceName: string): any;
/** /**
* Returns the service link for the given service name * Returns the service link for the given service name
* *
* @param ServiceRegistry * @param ServiceRegistry
* @param serviceName * @param serviceName
* @return {null} * @return {null}
*/ */
function serviceLink(ServiceRegistry: any, serviceName: string): string; function serviceLink(ServiceRegistry: any, serviceName: string): string;
} }

View File

@ -1,19 +1,19 @@
/// <reference path="serviceHelpers.d.ts" /> /// <reference path="serviceHelpers.d.ts" />
/// <reference path="../../includes.d.ts" /> /// <reference path="../../includes.d.ts" />
declare module Service { declare module Service {
interface SelectorMap { interface SelectorMap {
[name: string]: string; [name: string]: string;
} }
interface Service { interface Service {
kind: string; kind: string;
id: string; id: string;
portalIP: string; portalIP: string;
selector?: SelectorMap; selector?: SelectorMap;
port: number; port: number;
containerPort: number; containerPort: number;
} }
interface ServiceResponse { interface ServiceResponse {
items: Array<Service>; items: Array<Service>;
} }
var _module: ng.IModule; var _module: ng.IModule;
} }

View File

@ -1,108 +1,108 @@
/* console specific stuff here */ /* console specific stuff here */
body { body {
padding-top: 110px; padding-top: 110px;
} }
.pane { .pane {
top: 110px; top: 110px;
} }
.navbar-brand > img { .navbar-brand > img {
height: 20px; height: 20px;
margin-top: -5px; margin-top: -5px;
margin-bottom: -5px; margin-bottom: -5px;
} }
.navbar-persistent { .navbar-persistent {
background: #f6f6f6; background: #f6f6f6;
border-bottom: 1px solid #cecdcd; border-bottom: 1px solid #cecdcd;
padding: 0; padding: 0;
width: 100%; width: 100%;
} }
.navbar-persistent > li.active:before, .navbar-persistent > li.active:before,
.navbar-persistent > li.active:hover:before { .navbar-persistent > li.active:hover:before {
background: #0099d3; background: #0099d3;
bottom: -1px; bottom: -1px;
content: ''; content: '';
display: block; display: block;
height: 2px; height: 2px;
left: 20px; left: 20px;
position: absolute; position: absolute;
right: 20px; right: 20px;
} }
.navbar-persistent > li.active > a, .navbar-persistent > li.active > a,
.navbar-persistent > li.active > a:hover, .navbar-persistent > li.active > a:hover,
.navbar-persistent > li.active:hover > a { .navbar-persistent > li.active:hover > a {
background: transparent !important; background: transparent !important;
color: #0099d3 !important; color: #0099d3 !important;
} }
.navbar-persistent > li.active .active > a { .navbar-persistent > li.active .active > a {
color: #f1f1f1; color: #f1f1f1;
} }
.navbar-persistent > li.dropdown-submenu:hover > .dropdown-menu { .navbar-persistent > li.dropdown-submenu:hover > .dropdown-menu {
display: none; display: none;
} }
.navbar-persistent > li.dropdown-submenu.open > .dropdown-menu { .navbar-persistent > li.dropdown-submenu.open > .dropdown-menu {
display: block; display: block;
left: 20px; left: 20px;
margin-top: 1px; margin-top: 1px;
top: 100%; top: 100%;
} }
.navbar-persistent > li.dropdown-submenu.open > .dropdown-toggle { .navbar-persistent > li.dropdown-submenu.open > .dropdown-toggle {
color: #222222; color: #222222;
} }
.navbar-persistent > li.dropdown-submenu.open > .dropdown-toggle:after { .navbar-persistent > li.dropdown-submenu.open > .dropdown-toggle:after {
border-top-color: #222222; border-top-color: #222222;
} }
.navbar-persistent > li.dropdown-submenu > .dropdown-toggle { .navbar-persistent > li.dropdown-submenu > .dropdown-toggle {
padding-right: 35px !important; padding-right: 35px !important;
} }
.navbar-persistent > li.dropdown-submenu > .dropdown-toggle:after { .navbar-persistent > li.dropdown-submenu > .dropdown-toggle:after {
position: absolute; position: absolute;
right: 20px; right: 20px;
top: 10px; top: 10px;
} }
.navbar-persistent > li:hover:before, .navbar-persistent > li:hover:before,
.navbar-persistent > li.open:before { .navbar-persistent > li.open:before {
background: #aaaaaa; background: #aaaaaa;
bottom: -1px; bottom: -1px;
content: ''; content: '';
display: block; display: block;
height: 2px; height: 2px;
left: 20px; left: 20px;
position: absolute; position: absolute;
right: 20px; right: 20px;
} }
.navbar-persistent > li:hover > a, .navbar-persistent > li:hover > a,
.navbar-persistent > li.open > a { .navbar-persistent > li.open > a {
color: #222222; color: #222222;
} }
.navbar-persistent > li:hover > a:after, .navbar-persistent > li:hover > a:after,
.navbar-persistent > li.open > a:after { .navbar-persistent > li.open > a:after {
border-top-color: #222222; border-top-color: #222222;
} }
.navbar-persistent > li > a { .navbar-persistent > li > a {
background-color: transparent; background-color: transparent;
display: block; display: block;
line-height: 1; line-height: 1;
padding: 9px 20px !important; padding: 9px 20px !important;
} }
.navbar-persistent > li > a.dropdown-toggle { .navbar-persistent > li > a.dropdown-toggle {
padding-right: 35px; padding-right: 35px;
} }
.navbar-persistent > li > a.dropdown-toggle:after { .navbar-persistent > li > a.dropdown-toggle:after {
font-size: 15px; font-size: 15px;
position: absolute; position: absolute;
right: 20px; right: 20px;
top: 9px; top: 9px;
} }
.navbar-persistent > li > a:hover { .navbar-persistent > li > a:hover {
color: #222222 !important; color: #222222 !important;
} }
.navbar-persistent > li a { .navbar-persistent > li a {
color: #4d5258 !important; color: #4d5258 !important;
} }
.navbar-pf .navbar-primary > li > a { .navbar-pf .navbar-primary > li > a {
border-bottom: 1px solid transparent; border-bottom: 1px solid transparent;
border-top: 1px solid transparent; border-top: 1px solid transparent;
position: relative; position: relative;
margin: -1px 0 0; margin: -1px 0 0;
} }

View File

@ -686,6 +686,73 @@ a:hover.data_file_btn {
background: url(../img/icons2.gif) -6px 9px no-repeat; background: url(../img/icons2.gif) -6px 9px no-repeat;
} }
.layout-pf.layout-pf-fixed .container-pf-nav-pf-vertical {
margin-left: 170px;
}
.nav-pf-vertical {
width: auto;
min-width: 170px;
}
.nav-pf-vertical .list-group > .list-group-item > a {
width: auto;
}
.nav-pf-vertical > .list-group > .list-group-item > a .fa,
.nav-pf-vertical > .list-group > .list-group-item > a .glyphicon,
.nav-pf-vertical > .list-group > .list-group-item > a .pficon {
line-height: 25px;
margin-right: 3px;
}
.nav-pf-vertical > .list-group > .list-group-item > a img {
max-height: 16px;
max-width: 16px;
margin-right: 10px;
}
.navbar-tab-vertical {
height: 70px;
width: 100%;
display: block;
background: #1d1d1d;
border-color: #1d1d1d;
}
.navbar-tab-horizontal {
height: 100%;
width: 100px;
display: block;
background: #1d1d1d;
border-color: #1d1d1d;
}
.gesture {
cursor: pointer;
}
.navbar-lf {
width: 200px;
min-height: 800px;
background: #1d1d1d;
position: absolute;
left: 0;
top: 0px;
}
.navbar-lf-menu {
display: block;
text-decoration: none;
}
.log-img {
width: "66";
height: "21";
alt: "logo";
}
.fl {
float: left;
}
a.logo {
display: block;
width: 130px;
padding: 20px 0 0 40px;
}
.content-margin {
margin-left: 170px;
}
/* This is for the 'Overview' page with all the rows of boxes */ /* This is for the 'Overview' page with all the rows of boxes */
.service-view-rectangle { .service-view-rectangle {
position: relative; position: relative;
@ -1032,70 +1099,3 @@ kubernetes-container-terminal .terminal-actions {
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
} }
.layout-pf.layout-pf-fixed .container-pf-nav-pf-vertical {
margin-left: 170px;
}
.nav-pf-vertical {
width: auto;
min-width: 170px;
}
.nav-pf-vertical .list-group > .list-group-item > a {
width: auto;
}
.nav-pf-vertical > .list-group > .list-group-item > a .fa,
.nav-pf-vertical > .list-group > .list-group-item > a .glyphicon,
.nav-pf-vertical > .list-group > .list-group-item > a .pficon {
line-height: 25px;
margin-right: 3px;
}
.nav-pf-vertical > .list-group > .list-group-item > a img {
max-height: 16px;
max-width: 16px;
margin-right: 10px;
}
.navbar-tab-vertical {
height: 70px;
width: 100%;
display: block;
background: #1d1d1d;
border-color: #1d1d1d;
}
.navbar-tab-horizontal {
height: 100%;
width: 100px;
display: block;
background: #1d1d1d;
border-color: #1d1d1d;
}
.gesture {
cursor: pointer;
}
.navbar-lf {
width: 200px;
min-height: 800px;
background: #1d1d1d;
position: absolute;
left: 0;
top: 0px;
}
.navbar-lf-menu {
display: block;
text-decoration: none;
}
.log-img {
width: "66";
height: "21";
alt: "logo";
}
.fl {
float: left;
}
a.logo {
display: block;
width: 130px;
padding: 20px 0 0 40px;
}
.content-margin {
margin-left: 170px;
}

File diff suppressed because one or more lines are too long

632
dist/img/host.svg vendored
View File

@ -1,316 +1,316 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/" xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr" xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612" id="svg1612"
sodipodi:docname="sagar_ns_server.svg" sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36" viewBox="0 0 359.37 469.36"
sodipodi:version="0.32" sodipodi:version="0.32"
version="1.0" version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1" inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg" sodipodi:docbase="/Users/johnolsen/Pictures/svg"
> >
<defs <defs
id="defs1614" id="defs1614"
> >
<linearGradient <linearGradient
id="linearGradient29808" id="linearGradient29808"
y2="654.74" y2="654.74"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="191.45" x2="191.45"
gradientTransform="translate(225.21 -257.03)" gradientTransform="translate(225.21 -257.03)"
y1="654.74" y1="654.74"
x1="177.95" x1="177.95"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29806" id="linearGradient29806"
y2="611.48" y2="611.48"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="306.18" x2="306.18"
gradientTransform="translate(-9.0156 192.16)" gradientTransform="translate(-9.0156 192.16)"
y1="596.63" y1="596.63"
x1="309.71" x1="309.71"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient24757" id="linearGradient24757"
> >
<stop <stop
id="stop24759" id="stop24759"
style="stop-color:#d5d5d5" style="stop-color:#d5d5d5"
offset="0" offset="0"
/> />
<stop <stop
id="stop24761" id="stop24761"
style="stop-color:#848484;stop-opacity:0" style="stop-color:#848484;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient29804" id="linearGradient29804"
y2="560.57" y2="560.57"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="379.72" x2="379.72"
y1="560.57" y1="560.57"
x1="253.14" x1="253.14"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29802" id="linearGradient29802"
y2="949.11" y2="949.11"
xlink:href="#linearGradient22094" xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="659.71" x2="659.71"
gradientTransform="translate(-220.88 106.92)" gradientTransform="translate(-220.88 106.92)"
y1="400.17" y1="400.17"
x1="491.76" x1="491.76"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29800" id="linearGradient29800"
y2="482.62" y2="482.62"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="265.58" x2="265.58"
gradientTransform="translate(-208.22 109.74)" gradientTransform="translate(-208.22 109.74)"
y1="306.18" y1="306.18"
x1="705.01" x1="705.01"
inkscape:collect="always" inkscape:collect="always"
> >
<stop <stop
id="stop22985" id="stop22985"
style="stop-color:#000000" style="stop-color:#000000"
offset="0" offset="0"
/> />
<stop <stop
id="stop22987" id="stop22987"
style="stop-color:#000000;stop-opacity:0" style="stop-color:#000000;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient22094" id="linearGradient22094"
> >
<stop <stop
id="stop22096" id="stop22096"
style="stop-color:#000000" style="stop-color:#000000"
offset="0" offset="0"
/> />
<stop <stop
id="stop22098" id="stop22098"
style="stop-color:#000000;stop-opacity:0" style="stop-color:#000000;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient29798" id="linearGradient29798"
y2="211.3" y2="211.3"
xlink:href="#linearGradient22094" xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="576.57" x2="576.57"
gradientTransform="translate(-208.22 109.74)" gradientTransform="translate(-208.22 109.74)"
y1="133.76" y1="133.76"
x1="575.89" x1="575.89"
inkscape:collect="always" inkscape:collect="always"
/> />
</defs </defs
> >
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
bordercolor="#666666" bordercolor="#666666"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-y="176" inkscape:window-y="176"
pagecolor="#ffffff" pagecolor="#ffffff"
inkscape:window-height="581" inkscape:window-height="581"
inkscape:zoom="0.7" inkscape:zoom="0.7"
inkscape:window-x="176" inkscape:window-x="176"
borderopacity="1.0" borderopacity="1.0"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
inkscape:cx="454.3678" inkscape:cx="454.3678"
inkscape:cy="517.33549" inkscape:cy="517.33549"
inkscape:window-width="756" inkscape:window-width="756"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:document-units="px" inkscape:document-units="px"
/> />
<g <g
id="layer1" id="layer1"
inkscape:label="Layer 1" inkscape:label="Layer 1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)" transform="translate(-226.03 -301.23)"
> >
<g <g
id="g29774" id="g29774"
inkscape:export-ydpi="90" inkscape:export-ydpi="90"
inkscape:export-xdpi="90" inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png" inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)" transform="matrix(.95252 0 0 .80631 78.742 104.9)"
> >
<path <path
id="path29776" id="path29776"
style="fill-rule:evenodd;fill:#ffffff" style="fill-rule:evenodd;fill:#ffffff"
d="m154.75 296.11l209-52.5 167.75 5.75-3 363.25-125.25 213-233.75-56.5-14.75-473z" d="m154.75 296.11l209-52.5 167.75 5.75-3 363.25-125.25 213-233.75-56.5-14.75-473z"
/> />
<g <g
id="g29778" id="g29778"
> >
<path <path
id="path29780" id="path29780"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29798)" style="fill-rule:evenodd;fill:url(#linearGradient29798)"
d="m363.7 243.5l168.21 6.13-127.82 56.4-249.31-9.77 208.92-52.76z" d="m363.7 243.5l168.21 6.13-127.82 56.4-249.31-9.77 208.92-52.76z"
/> />
<path <path
id="path29782" id="path29782"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29800)" style="fill-rule:evenodd;fill:url(#linearGradient29800)"
d="m531.39 249.13l-3.1 362.98-125.04 212.97 0.18-519.27 127.96-56.68z" d="m531.39 249.13l-3.1 362.98-125.04 212.97 0.18-519.27 127.96-56.68z"
/> />
<path <path
id="path29784" id="path29784"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29802)" style="fill-rule:evenodd;fill:url(#linearGradient29802)"
d="m154.63 296.26l249.02 9.38-0.18 519.59-233.54-56.28-15.3-472.69z" d="m154.63 296.26l249.02 9.38-0.18 519.59-233.54-56.28-15.3-472.69z"
/> />
<path <path
id="path29786" id="path29786"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29804)" style="fill-rule:evenodd;fill:url(#linearGradient29804)"
d="m253.14 300l124.46 4.6 2.47 514.77-33.29-7.78-93.64-511.59z" d="m253.14 300l124.46 4.6 2.47 514.77-33.29-7.78-93.64-511.59z"
/> />
<path <path
id="path29788" id="path29788"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29806)" style="fill-rule:evenodd;fill:url(#linearGradient29806)"
d="m169.88 768.99l-0.53-16.09 233.7 53.39-0.06 18.38-233.11-55.68z" d="m169.88 768.99l-0.53-16.09 233.7 53.39-0.06 18.38-233.11-55.68z"
/> />
<path <path
id="path29790" id="path29790"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)" style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z" d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/> />
<path <path
id="path29792" id="path29792"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 337.78l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 337.78l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
<path <path
id="path29794" id="path29794"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 371.94l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 371.94l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
<path <path
id="path29796" id="path29796"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 406.1l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 406.1l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
</g </g
> >
</g </g
> >
</g </g
> >
<metadata <metadata
> >
<rdf:RDF <rdf:RDF
> >
<cc:Work <cc:Work
> >
<dc:format <dc:format
>image/svg+xml</dc:format >image/svg+xml</dc:format
> >
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/> />
<cc:license <cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/> />
<dc:publisher <dc:publisher
> >
<cc:Agent <cc:Agent
rdf:about="http://openclipart.org/" rdf:about="http://openclipart.org/"
> >
<dc:title <dc:title
>Openclipart</dc:title >Openclipart</dc:title
> >
</cc:Agent </cc:Agent
> >
</dc:publisher </dc:publisher
> >
<dc:title <dc:title
>Server Cabinet CPU</dc:title >Server Cabinet CPU</dc:title
> >
<dc:date <dc:date
>2007-09-03T13:59:19</dc:date >2007-09-03T13:59:19</dc:date
> >
<dc:description <dc:description
>Represents a server in Network Diagrams</dc:description >Represents a server in Network Diagrams</dc:description
> >
<dc:source <dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source >https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
> >
<dc:creator <dc:creator
> >
<cc:Agent <cc:Agent
> >
<dc:title <dc:title
>sagar_ns</dc:title >sagar_ns</dc:title
> >
</cc:Agent </cc:Agent
> >
</dc:creator </dc:creator
> >
<dc:subject <dc:subject
> >
<rdf:Bag <rdf:Bag
> >
<rdf:li <rdf:li
>mainframe</rdf:li >mainframe</rdf:li
> >
<rdf:li <rdf:li
>server</rdf:li >server</rdf:li
> >
</rdf:Bag </rdf:Bag
> >
</dc:subject </dc:subject
> >
</cc:Work </cc:Work
> >
<cc:License <cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/" rdf:about="http://creativecommons.org/licenses/publicdomain/"
> >
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" rdf:resource="http://creativecommons.org/ns#Reproduction"
/> />
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" rdf:resource="http://creativecommons.org/ns#Distribution"
/> />
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/> />
</cc:License </cc:License
> >
</rdf:RDF </rdf:RDF
> >
</metadata </metadata
> >
</svg </svg
> >

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -1,451 +1,451 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1" version="1.1"
width="138" width="138"
height="138" height="138"
id="svg2" id="svg2"
xml:space="preserve" xml:space="preserve"
inkscape:version="0.48.5 r10040" inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff" pagecolor="#ffffff"
bordercolor="#666666" bordercolor="#666666"
borderopacity="1" borderopacity="1"
objecttolerance="10" objecttolerance="10"
gridtolerance="10" gridtolerance="10"
guidetolerance="10" guidetolerance="10"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-width="1918" inkscape:window-width="1918"
inkscape:window-height="1054" inkscape:window-height="1054"
id="namedview147" id="namedview147"
showgrid="false" showgrid="false"
fit-margin-top="0" fit-margin-top="0"
fit-margin-left="0" fit-margin-left="0"
fit-margin-right="0" fit-margin-right="0"
fit-margin-bottom="0" fit-margin-bottom="0"
inkscape:zoom="3.0970926" inkscape:zoom="3.0970926"
inkscape:cx="203.09647" inkscape:cx="203.09647"
inkscape:cy="61.870747" inkscape:cy="61.870747"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="31" inkscape:window-y="31"
inkscape:window-maximized="0" inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><g id="defs6" /><g
id="g12" id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:118.52590179;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:118.52590179;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path14" id="path14"
d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><path d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path16" id="path16"
d="M 69.164415,13.544412 24.50791,35.450754 13.47369,84.683616 l 30.897917,39.486744 49.562617,0 L 124.84026,84.691321 113.81667,35.45512 69.164415,13.539019 z" /><g d="M 69.164415,13.544412 24.50791,35.450754 13.47369,84.683616 l 30.897917,39.486744 49.562617,0 L 124.84026,84.691321 113.81667,35.45512 69.164415,13.539019 z" /><g
id="g18" id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#336ee5;stroke-width:74.74790192;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#336ee5;stroke-width:74.74790192;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path20" id="path20"
d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><g d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><g
id="g22" id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:30.78089905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:30.78089905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path24" id="path24"
d="m 1013.0746,6022.3961 c 73.5242,16.6963 146.8281,-29.4129 163.7263,-102.9867 16.9013,-73.5707 -29.0033,-146.7473 -102.5275,-163.4423 -73.5273,-16.6918 -146.8312,29.4174 -163.7308,102.9881 -16.8982,73.5738 29.0033,146.7505 102.532,163.4409 z" /></g><path d="m 1013.0746,6022.3961 c 73.5242,16.6963 146.8281,-29.4129 163.7263,-102.9867 16.9013,-73.5707 -29.0033,-146.7473 -102.5275,-163.4423 -73.5273,-16.6918 -146.8312,29.4174 -163.7308,102.9881 -16.8982,73.5738 29.0033,146.7505 102.532,163.4409 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path26" id="path26"
d="m 72.040533,34.450779 -3.433866,0.01284 -0.21825,25.929869 5.082487,0.0488 -1.430371,-25.986244 z" /><g d="m 72.040533,34.450779 -3.433866,0.01284 -0.21825,25.929869 5.082487,0.0488 -1.430371,-25.986244 z" /><g
id="g28" id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path30" id="path30"
d="m 1096.8024,6045.6095 15.9899,-0.034 1.0191,-110.4911 -23.6699,-0.2094 6.6609,110.7345 z" /></g><path d="m 1096.8024,6045.6095 15.9899,-0.034 1.0191,-110.4911 -23.6699,-0.2094 6.6609,110.7345 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path32" id="path32"
d="m 66.275173,34.450779 3.434616,0.01284 0.212499,25.929869 -5.081736,0.04751 1.434621,-25.985473 z" /><g d="m 66.275173,34.450779 3.434616,0.01284 0.212499,25.929869 -5.081736,0.04751 1.434621,-25.985473 z" /><g
id="g34" id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path36" id="path36"
d="m 1123.6518,6045.6098 -15.9947,-0.034 -0.9893,-110.4911 23.6664,-0.2029 -6.6824,110.7283 z" /></g><path d="m 1123.6518,6045.6098 -15.9947,-0.034 -0.9893,-110.4911 23.6664,-0.2029 -6.6824,110.7283 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path38" id="path38"
d="m 66.486048,24.660222 c 0,1.684688 1.196246,3.050905 2.672367,3.050905 1.475746,0 2.672368,-1.366217 2.672368,-3.049749 0,-1.685074 -1.195497,-3.050777 -2.672368,-3.051933 -1.476121,0 -2.672367,1.365832 -2.672367,3.050777" /><g d="m 66.486048,24.660222 c 0,1.684688 1.196246,3.050905 2.672367,3.050905 1.475746,0 2.672368,-1.366217 2.672368,-3.049749 0,-1.685074 -1.195497,-3.050777 -2.672368,-3.051933 -1.476121,0 -2.672367,1.365832 -2.672367,3.050777" /><g
id="g40" id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path42" id="path42"
d="m 1173.5053,6087.183 c -8e-4,-7.1804 -5.8238,-12.9997 -13.0019,-12.9988 -7.1785,8e-4 -12.998,5.8229 -12.9986,12.9971 0,7.1802 5.8204,12.9994 13.0023,13.0031 7.1801,-6e-4 12.9994,-5.8212 12.9982,-13.0014 z" /></g><path d="m 1173.5053,6087.183 c -8e-4,-7.1804 -5.8238,-12.9997 -13.0019,-12.9988 -7.1785,8e-4 -12.998,5.8229 -12.9986,12.9971 0,7.1802 5.8204,12.9994 13.0023,13.0031 7.1801,-6e-4 12.9994,-5.8212 12.9982,-13.0014 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path44" id="path44"
d="m 71.829658,24.619899 c -6.25e-4,0.240909 0.01125,0.58853 0.0025,0.82045 -0.03575,0.97198 -0.242749,1.716663 -0.366749,2.612493 -0.224999,1.915837 -0.413874,3.504342 -0.297999,4.980482 0.106375,0.738906 0.522999,1.030538 0.869873,1.372253 l -4.215114,2.865601 0.633623,-12.630219 3.373491,-0.02055 z" /><g d="m 71.829658,24.619899 c -6.25e-4,0.240909 0.01125,0.58853 0.0025,0.82045 -0.03575,0.97198 -0.242749,1.716663 -0.366749,2.612493 -0.224999,1.915837 -0.413874,3.504342 -0.297999,4.980482 0.106375,0.738906 0.522999,1.030538 0.869873,1.372253 l -4.215114,2.865601 0.633623,-12.630219 3.373491,-0.02055 z" /><g
id="g46" id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path48" id="path48"
d="m -6476.0579,1031.9675 c 1.0925,0 2.6683,-0.048 3.7194,-0.012 4.4045,0.1551 7.7839,1.0624 11.8431,1.6053 8.6848,0.9836 15.8877,1.8119 22.5774,1.3045 3.35,-0.4652 4.6718,-2.2896 6.2229,-3.8095 l 12.9884,18.4538 -57.2553,-2.7734 -0.096,-14.7685 z" /></g><path d="m -6476.0579,1031.9675 c 1.0925,0 2.6683,-0.048 3.7194,-0.012 4.4045,0.1551 7.7839,1.0624 11.8431,1.6053 8.6848,0.9836 15.8877,1.8119 22.5774,1.3045 3.35,-0.4652 4.6718,-2.2896 6.2229,-3.8095 l 12.9884,18.4538 -57.2553,-2.7734 -0.096,-14.7685 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path50" id="path50"
d="m 66.486048,24.619899 c 7.5e-4,0.240909 -0.01125,0.58853 -0.0025,0.82045 0.0355,0.97198 0.242749,1.716663 0.366374,2.612493 0.225374,1.915837 0.414249,3.504342 0.298374,4.980482 -0.10625,0.738906 -0.522999,1.030538 -0.869873,1.372253 l 4.215114,2.865601 -0.633499,-12.630219 -3.373615,-0.02055 z" /><g d="m 66.486048,24.619899 c 7.5e-4,0.240909 -0.01125,0.58853 -0.0025,0.82045 0.0355,0.97198 0.242749,1.716663 0.366374,2.612493 0.225374,1.915837 0.414249,3.504342 0.298374,4.980482 -0.10625,0.738906 -0.522999,1.030538 -0.869873,1.372253 l 4.215114,2.865601 -0.633499,-12.630219 -3.373615,-0.02055 z" /><g
id="g52" id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path54" id="path54"
d="m -6476.0579,1055.3604 c 1.0925,0 2.6683,0.048 3.7194,0.013 4.4045,-0.1551 7.7839,-1.0627 11.8431,-1.6056 8.6848,-0.985 15.8877,-1.8133 22.5774,-1.3059 3.35,0.4669 4.6718,2.291 6.2229,3.8095 l 12.9884,-18.4538 -57.2553,2.7748 -0.096,14.7685 z" /></g><g d="m -6476.0579,1055.3604 c 1.0925,0 2.6683,0.048 3.7194,0.013 4.4045,-0.1551 7.7839,-1.0627 11.8431,-1.6056 8.6848,-0.985 15.8877,-1.8133 22.5774,-1.3059 3.35,0.4669 4.6718,2.291 6.2229,3.8095 l 12.9884,-18.4538 -57.2553,2.7748 -0.096,14.7685 z" /></g><g
id="g56" id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:30.34600067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:30.34600067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path58" id="path58"
d="m 1073.7275,5865.2637 -30.1062,-14.4286 -30.1014,14.4363 -7.433,32.4408 20.8395,26.0096 33.4099,0 20.8321,-26.0158 -7.4409,-32.4374 z" /></g><path d="m 1073.7275,5865.2637 -30.1062,-14.4286 -30.1014,14.4363 -7.433,32.4408 20.8395,26.0096 33.4099,0 20.8321,-26.0158 -7.4409,-32.4374 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path60" id="path60"
d="m 98.919585,50.580588 -2.146869,-2.752723 -19.869322,15.99189 3.131117,4.112262 18.885074,-17.351429 z" /><g d="m 98.919585,50.580588 -2.146869,-2.752723 -19.869322,15.99189 3.131117,4.112262 18.885074,-17.351429 z" /><g
id="g62" id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path64" id="path64"
d="m 5577.0313,3012.37 15.9896,-0.035 1.0146,-110.4928 -23.6665,-0.2083 6.6623,110.7357 z" /></g><path d="m 5577.0313,3012.37 15.9896,-0.035 1.0146,-110.4928 -23.6665,-0.2083 6.6623,110.7357 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path66" id="path66"
d="M 95.325345,45.949654 97.459839,48.713549 77.859267,65.05152 74.654776,60.998971 95.325345,45.949654 z" /><g d="M 95.325345,45.949654 97.459839,48.713549 77.859267,65.05152 74.654776,60.998971 95.325345,45.949654 z" /><g
id="g68" id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path70" id="path70"
d="m 5603.881,3012.3717 -15.9925,-0.037 -0.9946,-110.4931 23.6681,-0.201 -6.681,110.7309 z" /></g><path d="m 5603.881,3012.3717 -15.9925,-0.037 -0.9946,-110.4931 23.6681,-0.201 -6.681,110.7309 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path72" id="path72"
d="m 102.9072,40.014784 c -1.28224,1.050442 -1.57562,2.862904 -0.65588,4.04921 0.921,1.185279 2.70638,1.295203 3.98874,0.244633 1.28238,-1.050571 1.57575,-2.862905 0.65475,-4.048184 -0.91975,-1.18592 -2.70561,-1.295202 -3.98761,-0.245659" /><g d="m 102.9072,40.014784 c -1.28224,1.050442 -1.57562,2.862904 -0.65588,4.04921 0.921,1.185279 2.70638,1.295203 3.98874,0.244633 1.28238,-1.050571 1.57575,-2.862905 0.65475,-4.048184 -0.91975,-1.18592 -2.70561,-1.295202 -3.98761,-0.245659" /><g
id="g74" id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path76" id="path76"
d="m 5852.363,3053.3992 c 0,-7.181 -5.8201,-12.9999 -13.0023,-13.0013 -7.1801,0 -13.0011,5.8235 -12.9999,13.0033 0,7.1788 5.8212,12.9986 13.0013,12.9949 7.1799,0 12.998,-5.8198 13.0009,-12.9969 z" /></g><path d="m 5852.363,3053.3992 c 0,-7.181 -5.8201,-12.9999 -13.0023,-13.0013 -7.1801,0 -13.0011,5.8235 -12.9999,13.0033 0,7.1788 5.8212,12.9986 13.0013,12.9949 7.1799,0 12.998,-5.8198 13.0009,-12.9969 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path78" id="path78"
d="m 106.26944,44.282045 c -0.18388,0.150375 -0.44,0.376001 -0.62288,0.514305 -0.76111,0.577358 -1.45736,0.87554 -2.21636,1.333856 -1.59837,1.013716 -2.92537,1.852785 -3.976241,2.8665 -0.496124,0.545383 -0.457749,1.061486 -0.501374,1.553704 l -4.808612,-1.598778 10.006227,-7.365423 2.11924,2.695836 z" /><g d="m 106.26944,44.282045 c -0.18388,0.150375 -0.44,0.376001 -0.62288,0.514305 -0.76111,0.577358 -1.45736,0.87554 -2.21636,1.333856 -1.59837,1.013716 -2.92537,1.852785 -3.976241,2.8665 -0.496124,0.545383 -0.457749,1.061486 -0.501374,1.553704 l -4.808612,-1.598778 10.006227,-7.365423 2.11924,2.695836 z" /><g
id="g80" id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path82" id="path82"
d="m -3249.2313,5243.3223 c 1.0933,0 2.664,-0.052 3.7219,-0.013 4.403,0.1539 7.7794,1.0602 11.8409,1.6067 8.6825,0.9833 15.8867,1.8108 22.5788,1.3017 3.3474,-0.4627 4.6661,-2.2856 6.2166,-3.8075 l 12.9912,18.4521 -57.2539,-2.7749 -0.095,-14.7648 z" /></g><path d="m -3249.2313,5243.3223 c 1.0933,0 2.664,-0.052 3.7219,-0.013 4.403,0.1539 7.7794,1.0602 11.8409,1.6067 8.6825,0.9833 15.8867,1.8108 22.5788,1.3017 3.3474,-0.4627 4.6661,-2.2856 6.2166,-3.8075 l 12.9912,18.4521 -57.2539,-2.7749 -0.095,-14.7648 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path84" id="path84"
d="m 102.93845,39.99 c -0.18388,0.151402 -0.455,0.357381 -0.62613,0.509939 -0.71749,0.634118 -1.15586,1.265025 -1.75999,1.923157 -1.317746,1.375206 -2.408993,2.51708 -3.604865,3.344079 -0.628248,0.37613 -1.109122,0.222416 -1.58637,0.156539 L 95.808968,51.09605 105.02582,42.713573 102.93845,39.99 z" /><g d="m 102.93845,39.99 c -0.18388,0.151402 -0.455,0.357381 -0.62613,0.509939 -0.71749,0.634118 -1.15586,1.265025 -1.75999,1.923157 -1.317746,1.375206 -2.408993,2.51708 -3.604865,3.344079 -0.628248,0.37613 -1.109122,0.222416 -1.58637,0.156539 L 95.808968,51.09605 105.02582,42.713573 102.93845,39.99 z" /><g
id="g86" id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path88" id="path88"
d="m -3249.2339,5266.7135 c 1.0976,0 2.668,0.05 3.7202,0.011 4.4071,-0.1545 7.7848,-1.0607 11.8446,-1.6044 8.6862,-0.9839 15.8862,-1.8108 22.578,-1.302 3.3491,0.4632 4.668,2.287 6.2194,3.8072 l 12.9861,-18.4518 -57.2505,2.7689 -0.098,14.771 z" /></g><path d="m -3249.2339,5266.7135 c 1.0976,0 2.668,0.05 3.7202,0.011 4.4071,-0.1545 7.7848,-1.0607 11.8446,-1.6044 8.6862,-0.9839 15.8862,-1.8108 22.578,-1.302 3.3491,0.4632 4.668,2.287 6.2194,3.8072 l 12.9861,-18.4518 -57.2505,2.7689 -0.098,14.771 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path90" id="path90"
d="m 103.34907,82.246154 0.7565,-3.441418 -24.558183,-5.988805 -1.176746,5.079492 24.978429,4.350731 z" /><g d="m 103.34907,82.246154 0.7565,-3.441418 -24.558183,-5.988805 -1.176746,5.079492 24.978429,4.350731 z" /><g
id="g92" id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path94" id="path94"
d="m -5847.3578,2171.5747 -15.9939,0.032 -1.0168,110.4913 23.6687,0.207 -6.658,-110.7301 z" /></g><path d="m -5847.3578,2171.5747 -15.9939,0.032 -1.0168,110.4913 23.6687,0.207 -6.658,-110.7301 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path96" id="path96"
d="m 104.63282,76.471804 -0.77237,3.437694 -24.654687,-5.556942 1.085622,-5.10068 24.341435,7.219928 z" /><g d="m 104.63282,76.471804 -0.77237,3.437694 -24.654687,-5.556942 1.085622,-5.10068 24.341435,7.219928 z" /><g
id="g98" id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path100" id="path100"
d="m -5874.2073,2171.5679 15.9931,0.04 0.9907,110.4919 -23.6673,0.203 6.6835,-110.7352 z" /></g><path d="m -5874.2073,2171.5679 15.9931,0.04 0.9907,110.4919 -23.6673,0.203 6.6835,-110.7352 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path102" id="path102"
d="m 113.87654,78.861881 c -1.59836,-0.376002 -3.16161,0.518672 -3.49011,1.997381 -0.32813,1.477553 0.70162,2.980148 2.30062,3.355122 1.59812,0.376002 3.16062,-0.519057 3.48987,-1.997766 0.32812,-1.477553 -0.70163,-2.979763 -2.30038,-3.354737" /><g d="m 113.87654,78.861881 c -1.59836,-0.376002 -3.16161,0.518672 -3.49011,1.997381 -0.32813,1.477553 0.70162,2.980148 2.30062,3.355122 1.59812,0.376002 3.16062,-0.519057 3.48987,-1.997766 0.32812,-1.477553 -0.70163,-2.979763 -2.30038,-3.354737" /><g
id="g104" id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path106" id="path106"
d="m -6133.9467,2130.5761 c 0,7.1785 5.8181,13 13.0008,12.9983 7.1756,0 12.9951,-5.8181 12.9934,-13 0.01,-7.177 -5.8169,-12.9952 -12.9988,-12.9988 -7.177,0 -12.9963,5.8218 -12.9954,13.0005 z" /></g><path d="m -6133.9467,2130.5761 c 0,7.1785 5.8181,13 13.0008,12.9983 7.1756,0 12.9951,-5.8181 12.9934,-13 0.01,-7.177 -5.8169,-12.9952 -12.9988,-12.9988 -7.177,0 -12.9963,5.8218 -12.9954,13.0005 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path108" id="path108"
d="m 112.72543,84.222731 c -0.22825,-0.05393 -0.56063,-0.120711 -0.77925,-0.179782 -0.9145,-0.251952 -1.57575,-0.625 -2.39738,-0.948608 -1.76886,-0.651968 -3.23399,-1.194782 -4.66048,-1.406283 -0.72462,-0.05907 -1.09312,0.293431 -1.49562,0.565672 l -1.78124,-4.859515 11.84483,3.443858 -0.73086,3.384658 z" /><g d="m 112.72543,84.222731 c -0.22825,-0.05393 -0.56063,-0.120711 -0.77925,-0.179782 -0.9145,-0.251952 -1.57575,-0.625 -2.39738,-0.948608 -1.76886,-0.651968 -3.23399,-1.194782 -4.66048,-1.406283 -0.72462,-0.05907 -1.09312,0.293431 -1.49562,0.565672 l -1.78124,-4.859515 11.84483,3.443858 -0.73086,3.384658 z" /><g
id="g110" id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path112" id="path112"
d="m 2265.6285,5497.4356 c 1.0922,0 2.6646,-0.046 3.7191,-0.012 4.4067,0.157 7.7848,1.0615 11.842,1.6055 8.6871,0.9856 15.8868,1.813 22.5785,1.3017 3.3494,-0.4609 4.6676,-2.2825 6.219,-3.8053 l 12.9892,18.4519 -57.2525,-2.7689 -0.095,-14.773 z" /></g><path d="m 2265.6285,5497.4356 c 1.0922,0 2.6646,-0.046 3.7191,-0.012 4.4067,0.157 7.7848,1.0615 11.842,1.6055 8.6871,0.9856 15.8868,1.813 22.5785,1.3017 3.3494,-0.4609 4.6676,-2.2825 6.219,-3.8053 l 12.9892,18.4519 -57.2525,-2.7689 -0.095,-14.773 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path114" id="path114"
d="m 113.91479,78.870998 c -0.22925,-0.05393 -0.55587,-0.142285 -0.778,-0.186074 -0.93086,-0.18081 -1.68386,-0.13869 -2.56111,-0.213556 -1.86837,-0.201741 -3.41749,-0.365857 -4.79237,-0.81069 -0.67811,-0.270187 -0.86136,-0.752388 -1.10836,-1.176931 l -3.65737,3.584088 12.12621,2.177548 0.771,-3.374385 z" /><g d="m 113.91479,78.870998 c -0.22925,-0.05393 -0.55587,-0.142285 -0.778,-0.186074 -0.93086,-0.18081 -1.68386,-0.13869 -2.56111,-0.213556 -1.86837,-0.201741 -3.41749,-0.365857 -4.79237,-0.81069 -0.67811,-0.270187 -0.86136,-0.752388 -1.10836,-1.176931 l -3.65737,3.584088 12.12621,2.177548 0.771,-3.374385 z" /><g
id="g116" id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path118" id="path118"
d="m 2265.6266,5520.8273 c 1.0955,0 2.6674,0.048 3.7204,0.015 4.4087,-0.1554 7.7848,-1.0642 11.8437,-1.6076 8.6865,-0.9822 15.8857,-1.8093 22.5766,-1.3005 3.3519,0.4629 4.6701,2.2867 6.2195,3.8092 l 12.9914,-18.4544 -57.255,2.7686 -0.097,14.7696 z" /></g><path d="m 2265.6266,5520.8273 c 1.0955,0 2.6674,0.048 3.7204,0.015 4.4087,-0.1554 7.7848,-1.0642 11.8437,-1.6076 8.6865,-0.9822 15.8857,-1.8093 22.5766,-1.3005 3.3519,0.4629 4.6701,2.2867 6.2195,3.8092 l 12.9914,-18.4544 -57.255,2.7686 -0.097,14.7696 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path120" id="path120"
d="M 82.060256,105.57792 85.151372,104.04 74.396776,80.580728 l -4.599487,2.22121 12.262967,22.775982 z" /><g d="M 82.060256,105.57792 85.151372,104.04 74.396776,80.580728 l -4.599487,2.22121 12.262967,22.775982 z" /><g
id="g122" id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path124" id="path124"
d="m -1704.3131,5602.1797 -15.9959,0.035 -1.0163,110.4899 23.6696,0.2089 -6.6574,-110.7337 z" /></g><path d="m -1704.3131,5602.1797 -15.9959,0.035 -1.0163,110.4899 23.6696,0.2089 -6.6574,-110.7337 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path126" id="path126"
d="m 87.255492,103.00832 -3.098367,1.52274 -11.14222,-23.266646 4.558863,-2.308276 9.681724,24.052182 z" /><g d="m 87.255492,103.00832 -3.098367,1.52274 -11.14222,-23.266646 4.558863,-2.308276 9.681724,24.052182 z" /><g
id="g128" id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path130" id="path130"
d="m -1731.1657,5602.1774 15.9936,0.038 0.9913,110.4894 -23.6685,0.2032 6.6836,-110.7309 z" /></g><path d="m -1731.1657,5602.1774 15.9936,0.038 0.9913,110.4894 -23.6685,0.2032 6.6836,-110.7309 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path132" id="path132"
d="m 91.200231,111.92345 c -0.712248,-1.518 -2.366619,-2.21581 -3.69674,-1.55832 -1.329872,0.65813 -1.831245,2.42179 -1.120122,3.93967 0.711248,1.51826 2.366619,2.21582 3.696115,1.55756 1.330496,-0.65698 1.83187,-2.42103 1.120747,-3.93891" /><g d="m 91.200231,111.92345 c -0.712248,-1.518 -2.366619,-2.21581 -3.69674,-1.55832 -1.329872,0.65813 -1.831245,2.42179 -1.120122,3.93967 0.711248,1.51826 2.366619,2.21582 3.696115,1.55756 1.330496,-0.65698 1.83187,-2.42103 1.120747,-3.93891" /><g
id="g134" id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path136" id="path136"
d="m -1806.2385,5560.6793 c 0,7.1805 5.8215,13.0009 13.0028,13.0031 7.1782,0 12.9977,-5.8221 12.9983,-13.0005 0,-7.1799 -5.8204,-13.0003 -13,-12.9986 -7.1804,0 -13.0005,5.8176 -13.0011,12.996 z" /></g><path d="m -1806.2385,5560.6793 c 0,7.1805 5.8215,13.0009 13.0028,13.0031 7.1782,0 12.9977,-5.8221 12.9983,-13.0005 0,-7.1799 -5.8204,-13.0003 -13,-12.9986 -7.1804,0 -13.0005,5.8176 -13.0011,12.996 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path138" id="path138"
d="m 86.402244,114.3405 c -0.10175,-0.21728 -0.258999,-0.5242 -0.348999,-0.73787 -0.379124,-0.8907 -0.506749,-1.65439 -0.772873,-2.51606 -0.606623,-1.82698 -1.107247,-3.34241 -1.83537,-4.62002 -0.407499,-0.61883 -0.905748,-0.69601 -1.363496,-0.84933 l 2.587618,-4.46028 4.763362,11.66119 -3.030242,1.52237 z" /><g d="m 86.402244,114.3405 c -0.10175,-0.21728 -0.258999,-0.5242 -0.348999,-0.73787 -0.379124,-0.8907 -0.506749,-1.65439 -0.772873,-2.51606 -0.606623,-1.82698 -1.107247,-3.34241 -1.83537,-4.62002 -0.407499,-0.61883 -0.905748,-0.69601 -1.363496,-0.84933 l 2.587618,-4.46028 4.763362,11.66119 -3.030242,1.52237 z" /><g
id="g140" id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path142" id="path142"
d="m 5915.2105,1602.9556 c 1.093,5e-4 2.6634,-0.051 3.7187,-0.013 4.4056,0.1519 7.7811,1.0601 11.8386,1.6055 8.6885,0.9839 15.8874,1.8114 22.5786,1.3023 3.3522,-0.4658 4.6717,-2.2873 6.222,-3.8084 l 12.9909,18.4516 -57.2525,-2.7717 -0.096,-14.7668 z" /></g><path d="m 5915.2105,1602.9556 c 1.093,5e-4 2.6634,-0.051 3.7187,-0.013 4.4056,0.1519 7.7811,1.0601 11.8386,1.6055 8.6885,0.9839 15.8874,1.8114 22.5786,1.3023 3.3522,-0.4658 4.6717,-2.2873 6.222,-3.8084 l 12.9909,18.4516 -57.2525,-2.7717 -0.096,-14.7668 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path144" id="path144"
d="m 91.216106,111.95915 c -0.101625,-0.2174 -0.238124,-0.53445 -0.343374,-0.74044 -0.442499,-0.86013 -0.943873,-1.43864 -1.433871,-2.19026 -1.011998,-1.62613 -1.852495,-2.97296 -2.371869,-4.35433 -0.216874,-0.71309 0.03575,-1.16049 0.205125,-1.6242 l -5.008487,-0.70218 5.904609,11.09655 3.047867,-1.48514 z" /><g d="m 91.216106,111.95915 c -0.101625,-0.2174 -0.238124,-0.53445 -0.343374,-0.74044 -0.442499,-0.86013 -0.943873,-1.43864 -1.433871,-2.19026 -1.011998,-1.62613 -1.852495,-2.97296 -2.371869,-4.35433 -0.216874,-0.71309 0.03575,-1.16049 0.205125,-1.6242 l -5.008487,-0.70218 5.904609,11.09655 3.047867,-1.48514 z" /><g
id="g146" id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path148" id="path148"
d="m 5915.2102,1626.3454 c 1.093,5e-4 2.6634,0.049 3.719,0.015 4.4068,-0.1576 7.7814,-1.0642 11.8418,-1.6073 8.6876,-0.9845 15.8853,-1.8102 22.5771,-1.3051 3.3508,0.4632 4.6675,2.2868 6.2209,3.8126 l 12.9861,-18.4566 -57.2525,2.7734 -0.092,14.7677 z" /></g><path d="m 5915.2102,1626.3454 c 1.093,5e-4 2.6634,0.049 3.719,0.015 4.4068,-0.1576 7.7814,-1.0642 11.8418,-1.6073 8.6876,-0.9845 15.8853,-1.8102 22.5771,-1.3051 3.3508,0.4632 4.6675,2.2868 6.2209,3.8126 l 12.9861,-18.4566 -57.2525,2.7734 -0.092,14.7677 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path150" id="path150"
d="m 51.046089,102.96363 3.097242,1.52339 11.148595,-23.264855 -4.558738,-2.309303 -9.687099,24.050768 z" /><g d="m 51.046089,102.96363 3.097242,1.52339 11.148595,-23.264855 -4.558738,-2.309303 -9.687099,24.050768 z" /><g
id="g152" id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path154" id="path154"
d="m 3732.2325,4696.5302 -15.9925,0.033 -1.0145,110.4942 23.669,0.2069 -6.662,-110.7343 z" /></g><path d="m 3732.2325,4696.5302 -15.9925,0.033 -1.0145,110.4942 23.669,0.2069 -6.662,-110.7343 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path156" id="path156"
d="M 56.2402,105.53387 53.149459,103.9948 63.90968,80.538479 68.508542,82.761615 56.2402,105.53387 z" /><g d="M 56.2402,105.53387 53.149459,103.9948 63.90968,80.538479 68.508542,82.761615 56.2402,105.53387 z" /><g
id="g158" id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path160" id="path160"
d="m 3705.3831,4696.5288 15.9973,0.037 0.9887,110.4928 -23.6687,0.2009 6.6827,-110.7306 z" /></g><path d="m 3705.3831,4696.5288 15.9973,0.037 0.9887,110.4928 -23.6687,0.2009 6.6827,-110.7306 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path162" id="path162"
d="m 51.915337,114.26076 c 0.712123,-1.51788 0.210374,-3.2827 -1.118997,-3.93967 -1.329496,-0.65814 -2.984492,0.0385 -3.697115,1.55652 -0.711123,1.51788 -0.210125,3.28154 1.119372,3.94006 1.330121,0.65813 2.984492,-0.0398 3.69674,-1.55691" /><g d="m 51.915337,114.26076 c 0.712123,-1.51788 0.210374,-3.2827 -1.118997,-3.93967 -1.329496,-0.65814 -2.984492,0.0385 -3.697115,1.55652 -0.711123,1.51788 -0.210125,3.28154 1.119372,3.94006 1.330121,0.65813 2.984492,-0.0398 3.69674,-1.55691" /><g
id="g164" id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path166" id="path166"
d="m 3871.7606,4654.3567 c 8e-4,7.181 5.8243,13.003 13.0011,13.0008 7.1782,5e-4 12.9991,-5.8187 12.9997,-13.0006 0,-7.1784 -5.8195,-12.9982 -12.9994,-12.9982 -7.1819,-6e-4 -12.9974,5.8215 -13.0014,12.998 z" /></g><path d="m 3871.7606,4654.3567 c 8e-4,7.181 5.8243,13.003 13.0011,13.0008 7.1782,5e-4 12.9991,-5.8187 12.9997,-13.0006 0,-7.1784 -5.8195,-12.9982 -12.9994,-12.9982 -7.1819,-6e-4 -12.9974,5.8215 -13.0014,12.998 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path168" id="path168"
d="m 47.08435,111.91511 c 0.10175,-0.21805 0.237374,-0.53549 0.343374,-0.74161 0.442874,-0.85973 0.944247,-1.43812 1.433996,-2.18987 1.011872,-1.62639 1.85237,-2.97219 2.371869,-4.35471 0.216874,-0.71309 -0.03588,-1.16049 -0.204125,-1.62305 l 5.007362,-0.70334 -5.904109,11.09656 -3.048367,-1.48398 z" /><g d="m 47.08435,111.91511 c 0.10175,-0.21805 0.237374,-0.53549 0.343374,-0.74161 0.442874,-0.85973 0.944247,-1.43812 1.433996,-2.18987 1.011872,-1.62639 1.85237,-2.97219 2.371869,-4.35471 0.216874,-0.71309 -0.03588,-1.16049 -0.204125,-1.62305 l 5.007362,-0.70334 -5.904109,11.09656 -3.048367,-1.48398 z" /><g
id="g170" id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path172" id="path172"
d="m -4951.7391,3507.378 c -1.0975,0 -2.6668,0.053 -3.7224,0.017 -4.4065,-0.1571 -7.7837,-1.0644 -11.8432,-1.6058 -8.6862,-0.9848 -15.8811,-1.8114 -22.5771,-1.304 -3.3491,0.4626 -4.6666,2.2847 -6.2161,3.8075 l -12.992,-18.4507 57.2536,2.7686 0.097,14.7677 z" /></g><path d="m -4951.7391,3507.378 c -1.0975,0 -2.6668,0.053 -3.7224,0.017 -4.4065,-0.1571 -7.7837,-1.0644 -11.8432,-1.6058 -8.6862,-0.9848 -15.8811,-1.8114 -22.5771,-1.304 -3.3491,0.4626 -4.6666,2.2847 -6.2161,3.8075 l -12.992,-18.4507 57.2536,2.7686 0.097,14.7677 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path174" id="path174"
d="m 51.897212,114.29685 c 0.10275,-0.21742 0.258999,-0.52575 0.350124,-0.73788 0.378374,-0.89223 0.506624,-1.65593 0.772373,-2.5176 0.606998,-1.82697 1.107622,-3.34125 1.83587,-4.62001 0.407749,-0.61885 0.905248,-0.69487 1.362996,-0.84781 l -2.587618,-4.46092 -4.763612,11.66043 3.029867,1.52379 z" /><g d="m 51.897212,114.29685 c 0.10275,-0.21742 0.258999,-0.52575 0.350124,-0.73788 0.378374,-0.89223 0.506624,-1.65593 0.772373,-2.5176 0.606998,-1.82697 1.107622,-3.34125 1.83587,-4.62001 0.407749,-0.61885 0.905248,-0.69487 1.362996,-0.84781 l -2.587618,-4.46092 -4.763612,11.66043 3.029867,1.52379 z" /><g
id="g176" id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path178" id="path178"
d="m -4951.7379,3483.9904 c -1.0962,0 -2.6697,-0.048 -3.7205,-0.015 -4.4084,0.1573 -7.7868,1.0636 -11.8437,1.607 -8.6876,0.9856 -15.8839,1.8108 -22.5782,1.3033 -3.3517,-0.4643 -4.6684,-2.2869 -6.2195,-3.8094 l -12.989,18.4538 57.2514,-2.7692 0.1,-14.7702 z" /></g><path d="m -4951.7379,3483.9904 c -1.0962,0 -2.6697,-0.048 -3.7205,-0.015 -4.4084,0.1573 -7.7868,1.0636 -11.8437,1.607 -8.6876,0.9856 -15.8839,1.8108 -22.5782,1.3033 -3.3517,-0.4643 -4.6684,-2.2869 -6.2195,-3.8094 l -12.989,18.4538 57.2514,-2.7692 0.1,-14.7702 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path180" id="path180"
d="m 33.681885,76.408495 0.771618,3.437694 24.65644,-5.550521 -1.084998,-5.101579 -24.34306,7.214406 z" /><g d="m 33.681885,76.408495 0.771618,3.437694 24.65644,-5.550521 -1.084998,-5.101579 -24.34306,7.214406 z" /><g
id="g182" id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path184" id="path184"
d="m 6368.633,136.4414 -15.9914,0.0349 -1.0179,110.4945 23.6696,0.2061 -6.6603,-110.7355 z" /></g><path d="m 6368.633,136.4414 -15.9914,0.0349 -1.0179,110.4945 23.6696,0.2061 -6.6603,-110.7355 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path186" id="path186"
d="m 34.964132,82.183101 -0.755748,-3.441289 24.560059,-5.98264 1.175997,5.079491 -24.980308,4.344438 z" /><g d="m 34.964132,82.183101 -0.755748,-3.441289 24.560059,-5.98264 1.175997,5.079491 -24.980308,4.344438 z" /><g
id="g188" id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path190" id="path190"
d="m 6341.7858,136.44 15.9911,0.0369 0.9918,110.4913 -23.6678,0.2033 6.6849,-110.7315 z" /></g><path d="m 6341.7858,136.44 15.9911,0.0369 0.9918,110.4913 -23.6678,0.2033 6.6849,-110.7315 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path192" id="path192"
d="m 25.626907,84.150305 c 1.598996,-0.374975 2.628743,-1.876542 2.300244,-3.355123 -0.328499,-1.47858 -1.890745,-2.373383 -3.488741,-1.998408 -1.599116,0.373819 -2.629493,1.876413 -2.301364,3.355122 0.328499,1.478581 1.890735,2.372998 3.489861,1.998409" /><g d="m 25.626907,84.150305 c 1.598996,-0.374975 2.628743,-1.876542 2.300244,-3.355123 -0.328499,-1.47858 -1.890745,-2.373383 -3.488741,-1.998408 -1.599116,0.373819 -2.629493,1.876413 -2.301364,3.355122 0.328499,1.478581 1.890735,2.372998 3.489861,1.998409" /><g
id="g194" id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path196" id="path196"
d="m 6624.6812,93.8699 c 0,7.1801 5.8189,12.9977 12.9999,12.9968 7.1805,6e-4 13.0009,-5.8207 12.9983,-12.9966 0,-7.1795 -5.8178,-13.0025 -12.9991,-12.9999 -7.1805,-6e-4 -13.0006,5.8209 -12.9991,12.9997 z" /></g><path d="m 6624.6812,93.8699 c 0,7.1801 5.8189,12.9977 12.9999,12.9968 7.1805,6e-4 13.0009,-5.8207 12.9983,-12.9966 0,-7.1795 -5.8178,-13.0025 -12.9991,-12.9999 -7.1805,-6e-4 -13.0006,5.8209 -12.9991,12.9997 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path198" id="path198"
d="m 24.39978,78.806534 c 0.22863,-0.05265 0.555249,-0.1419 0.778508,-0.184919 0.929748,-0.18158 1.682746,-0.139332 2.559993,-0.214327 1.868365,-0.20097 3.418241,-0.365214 4.793357,-0.809662 0.677128,-0.270444 0.861128,-0.752774 1.108377,-1.177188 l 3.65636,3.5855 -12.125587,2.17498 -0.771008,-3.374384 z" /><g d="m 24.39978,78.806534 c 0.22863,-0.05265 0.555249,-0.1419 0.778508,-0.184919 0.929748,-0.18158 1.682746,-0.139332 2.559993,-0.214327 1.868365,-0.20097 3.418241,-0.365214 4.793357,-0.809662 0.677128,-0.270444 0.861128,-0.752774 1.108377,-1.177188 l 3.65636,3.5855 -12.125587,2.17498 -0.771008,-3.374384 z" /><g
id="g200" id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path202" id="path202"
d="m -100.5077,5985.5958 c -1.0914,0 -2.6643,0.049 -3.7197,0.011 -4.4061,-0.1513 -7.7822,-1.0601 -11.8411,-1.603 -8.686,-0.985 -15.8899,-1.8127 -22.5805,-1.3053 -3.3472,0.464 -4.6684,2.2887 -6.2178,3.8114 l -12.987,-18.4558 57.2485,2.7726 0.0976,14.7696 z" /></g><path d="m -100.5077,5985.5958 c -1.0914,0 -2.6643,0.049 -3.7197,0.011 -4.4061,-0.1513 -7.7822,-1.0601 -11.8411,-1.603 -8.686,-0.985 -15.8899,-1.8127 -22.5805,-1.3053 -3.3472,0.464 -4.6684,2.2887 -6.2178,3.8114 l -12.987,-18.4558 57.2485,2.7726 0.0976,14.7696 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path204" id="path204"
d="m 25.588537,84.158652 c 0.229249,-0.05394 0.560618,-0.119427 0.779988,-0.179782 0.913747,-0.251182 1.574996,-0.624359 2.396623,-0.947967 1.768496,-0.651967 3.233622,-1.194653 4.660488,-1.406154 0.724628,-0.05907 1.093877,0.29343 1.495616,0.565287 l 1.780875,-4.85913 -11.843468,3.443858 0.729878,3.383888 z" /><g d="m 25.588537,84.158652 c 0.229249,-0.05394 0.560618,-0.119427 0.779988,-0.179782 0.913747,-0.251182 1.574996,-0.624359 2.396623,-0.947967 1.768496,-0.651967 3.233622,-1.194653 4.660488,-1.406154 0.724628,-0.05907 1.093877,0.29343 1.495616,0.565287 l 1.780875,-4.85913 -11.843468,3.443858 0.729878,3.383888 z" /><g
id="g206" id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path208" id="path208"
d="m -100.5077,5962.2049 c -1.0956,0 -2.6652,-0.052 -3.7219,-0.014 -4.4028,0.1551 -7.7792,1.0599 -11.8381,1.6036 -8.687,0.9862 -15.8862,1.8125 -22.5785,1.3028 -3.3494,-0.4606 -4.6721,-2.2844 -6.2206,-3.8052 l -12.9884,18.4524 57.2491,-2.772 0.0984,-14.7674 z" /></g><path d="m -100.5077,5962.2049 c -1.0956,0 -2.6652,-0.052 -3.7219,-0.014 -4.4028,0.1551 -7.7792,1.0599 -11.8381,1.6036 -8.687,0.9862 -15.8862,1.8125 -22.5785,1.3028 -3.3494,-0.4606 -4.6721,-2.2844 -6.2206,-3.8052 l -12.9884,18.4524 57.2491,-2.772 0.0984,-14.7674 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path210" id="path210"
d="M 43.009986,45.898287 40.874742,48.661155 60.471689,65.004263 63.67693,60.953126 43.009986,45.898287 z" /><g d="M 43.009986,45.898287 40.874742,48.661155 60.471689,65.004263 63.67693,60.953126 43.009986,45.898287 z" /><g
id="g212" id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path214" id="path214"
d="m -4219.3791,4644.5956 15.993,-0.032 1.0131,-110.4936 -23.6625,-0.2061 6.6564,110.7318 z" /></g><path d="m -4219.3791,4644.5956 15.993,-0.032 1.0131,-110.4936 -23.6625,-0.2061 6.6564,110.7318 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path216" id="path216"
d="M 39.414246,50.52858 41.56249,47.775856 61.427311,63.772112 58.29532,67.883219 39.414246,50.52858 z" /><g d="M 39.414246,50.52858 41.56249,47.775856 61.427311,63.772112 58.29532,67.883219 39.414246,50.52858 z" /><g
id="g218" id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path220" id="path220"
d="m -4192.5257,4644.6018 -15.9973,-0.04 -0.9896,-110.4882 23.665,-0.2044 -6.6781,110.7329 z" /></g><path d="m -4192.5257,4644.6018 -15.9973,-0.04 -0.9896,-110.4882 23.665,-0.2044 -6.6781,110.7329 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path222" id="path222"
d="m 32.095139,44.254692 c 1.282377,1.050185 3.068122,0.941417 3.98799,-0.243862 0.920497,-1.18515 0.627128,-2.998768 -0.654119,-4.04921 -1.282246,-1.050571 -3.067751,-0.941417 -3.988619,0.243861 -0.920247,1.185536 -0.627248,2.998384 0.654748,4.049211" /><g d="m 32.095139,44.254692 c 1.282377,1.050185 3.068122,0.941417 3.98799,-0.243862 0.920497,-1.18515 0.627128,-2.998768 -0.654119,-4.04921 -1.282246,-1.050571 -3.067751,-0.941417 -3.988619,0.243861 -0.920247,1.185536 -0.627248,2.998384 0.654748,4.049211" /><g
id="g224" id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path226" id="path226"
d="m -4379.2058,4686.834 c -3e-4,-7.1787 -5.8215,-12.9999 -12.9986,-12.9979 -7.179,-6e-4 -13.0014,5.8226 -13.0031,12.9988 0,7.1802 5.8215,13 13.0009,13.0005 7.1793,0 13.0022,-5.8192 13.0008,-13.0014 z" /></g><path d="m -4379.2058,4686.834 c -3e-4,-7.1787 -5.8215,-12.9999 -12.9986,-12.9979 -7.179,-6e-4 -13.0014,5.8226 -13.0031,12.9988 0,7.1802 5.8215,13 13.0009,13.0005 7.1793,0 13.0022,-5.8192 13.0008,-13.0014 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path228" id="path228"
d="m 35.39676,39.937863 c 0.18387,0.150375 0.454989,0.35751 0.626499,0.508527 0.717498,0.634503 1.155487,1.266052 1.758495,1.923542 1.319242,1.375976 2.40949,2.518236 3.605361,3.345234 0.628249,0.375617 1.108997,0.222416 1.586371,0.156539 l -0.447874,5.171951 -9.215846,-8.383248 2.086994,-2.722545 z" /><g d="m 35.39676,39.937863 c 0.18387,0.150375 0.454989,0.35751 0.626499,0.508527 0.717498,0.634503 1.155487,1.266052 1.758495,1.923542 1.319242,1.375976 2.40949,2.518236 3.605361,3.345234 0.628249,0.375617 1.108997,0.222416 1.586371,0.156539 l -0.447874,5.171951 -9.215846,-8.383248 2.086994,-2.722545 z" /><g
id="g230" id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path232" id="path232"
d="m 4985.5952,3965.326 c -1.0933,0 -2.6668,0.051 -3.7182,0.016 -4.4047,-0.1539 -7.7865,-1.065 -11.8409,-1.607 -8.6896,-0.985 -15.8882,-1.8124 -22.5799,-1.3033 -3.3489,0.4609 -4.6664,2.2841 -6.2192,3.8072 l -12.9867,-18.4533 57.2485,2.7743 0.096,14.7662 z" /></g><path d="m 4985.5952,3965.326 c -1.0933,0 -2.6668,0.051 -3.7182,0.016 -4.4047,-0.1539 -7.7865,-1.065 -11.8409,-1.607 -8.6896,-0.985 -15.8882,-1.8124 -22.5799,-1.3033 -3.3489,0.4609 -4.6664,2.2841 -6.2192,3.8072 l -12.9867,-18.4533 57.2485,2.7743 0.096,14.7662 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path234" id="path234"
d="m 32.065019,44.22888 c 0.18387,0.150375 0.440739,0.376002 0.622869,0.514434 0.761128,0.577615 1.457746,0.875412 2.216374,1.33437 1.597996,1.014229 2.924992,1.852913 3.97636,2.866629 0.495999,0.545382 0.457374,1.061871 0.501374,1.55396 l 4.808612,-1.598649 -10.005594,-7.366579 -2.119995,2.695835 z" /><g d="m 32.065019,44.22888 c 0.18387,0.150375 0.440739,0.376002 0.622869,0.514434 0.761128,0.577615 1.457746,0.875412 2.216374,1.33437 1.597996,1.014229 2.924992,1.852913 3.97636,2.866629 0.495999,0.545382 0.457374,1.061871 0.501374,1.55396 l 4.808612,-1.598649 -10.005594,-7.366579 -2.119995,2.695835 z" /><g
id="g236" id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path238" id="path238"
d="m 4985.5975,3941.9365 c -1.0933,3e-4 -2.6654,-0.049 -3.7205,-0.014 -4.4053,0.154 -7.7836,1.0656 -11.8429,1.6047 -8.6839,0.9848 -15.887,1.8114 -22.5788,1.3028 -3.3485,-0.4637 -4.6672,-2.2867 -6.2183,-3.8063 l -12.9901,18.4504 57.2505,-2.7686 0.1001,-14.7688 z" /></g><path d="m 4985.5975,3941.9365 c -1.0933,3e-4 -2.6654,-0.049 -3.7205,-0.014 -4.4053,0.154 -7.7836,1.0656 -11.8429,1.6047 -8.6839,0.9848 -15.887,1.8114 -22.5788,1.3028 -3.3485,-0.4637 -4.6672,-2.2867 -6.2183,-3.8063 l -12.9901,18.4504 57.2505,-2.7686 0.1001,-14.7688 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path240" id="path240"
d="m 73.354779,57.337705 c 0.0535,1.289039 1.085247,2.317393 2.352994,2.317393 0.519498,0 0.998497,-0.171435 1.387621,-0.463067 l 0.611248,0.299209 -1.251121,2.65731 -5.482236,-2.716253 1.244747,-2.657696 1.136747,0.563104 z" /><path d="m 73.354779,57.337705 c 0.0535,1.289039 1.085247,2.317393 2.352994,2.317393 0.519498,0 0.998497,-0.171435 1.387621,-0.463067 l 0.611248,0.299209 -1.251121,2.65731 -5.482236,-2.716253 1.244747,-2.657696 1.136747,0.563104 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path242" id="path242"
d="m 82.303005,65.916787 c -0.947873,0.846389 -1.086747,2.317778 -0.297374,3.335089 0.323874,0.417223 0.753373,0.694987 1.218246,0.825971 l 0.153375,0.677779 -2.802742,0.651583 -1.350997,-6.096802 2.799118,-0.657361 0.280374,1.263741 z" /><path d="m 82.303005,65.916787 c -0.947873,0.846389 -1.086747,2.317778 -0.297374,3.335089 0.323874,0.417223 0.753373,0.694987 1.218246,0.825971 l 0.153375,0.677779 -2.802742,0.651583 -1.350997,-6.096802 2.799118,-0.657361 0.280374,1.263741 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path244" id="path244"
d="m 81.362632,78.447226 c -1.234246,-0.233589 -2.440618,0.571194 -2.722742,1.840842 -0.115875,0.519827 -0.0595,1.038885 0.131124,1.49322 l -0.420248,0.545639 -2.243994,-1.844437 3.798489,-4.885841 2.244994,1.837889 -0.787623,1.012688 z" /><path d="m 81.362632,78.447226 c -1.234246,-0.233589 -2.440618,0.571194 -2.722742,1.840842 -0.115875,0.519827 -0.0595,1.038885 0.131124,1.49322 l -0.420248,0.545639 -2.243994,-1.844437 3.798489,-4.885841 2.244994,1.837889 -0.787623,1.012688 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path246" id="path246"
d="m 71.240035,85.50047 c -0.591624,-1.137637 -1.95687,-1.6043 -3.097867,-1.039656 -0.467749,0.231149 -0.827373,0.599831 -1.055122,1.035932 l -0.677123,0 0.005,-2.951768 6.087483,0 0,2.94997 -1.261871,-0.001 z" /><path d="m 71.240035,85.50047 c -0.591624,-1.137637 -1.95687,-1.6043 -3.097867,-1.039656 -0.467749,0.231149 -0.827373,0.599831 -1.055122,1.035932 l -0.677123,0 0.005,-2.951768 6.087483,0 0,2.94997 -1.261871,-0.001 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path248" id="path248"
d="m 59.572316,81.726711 c 0.496124,-1.185664 7.5e-4,-2.572556 -1.141247,-3.137457 -0.467748,-0.231534 -0.971872,-0.290477 -1.445621,-0.200586 l -0.423874,-0.542685 2.248619,-1.836862 3.792365,4.891234 -2.244244,1.840072 -0.785998,-1.013716 z" /><path d="m 59.572316,81.726711 c 0.496124,-1.185664 7.5e-4,-2.572556 -1.141247,-3.137457 -0.467748,-0.231534 -0.971872,-0.290477 -1.445621,-0.200586 l -0.423874,-0.542685 2.248619,-1.836862 3.792365,4.891234 -2.244244,1.840072 -0.785998,-1.013716 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path250" id="path250"
d="m 55.117078,70.006576 c 1.210622,-0.34043 1.957245,-1.602373 1.675621,-2.87215 -0.11525,-0.519827 -0.384874,-0.961707 -0.748748,-1.286727 l 0.148124,-0.67855 2.800243,0.6607 -1.358122,6.09616 -2.799242,-0.655306 0.282124,-1.264127 z" /><path d="m 55.117078,70.006576 c 1.210622,-0.34043 1.957245,-1.602373 1.675621,-2.87215 -0.11525,-0.519827 -0.384874,-0.961707 -0.748748,-1.286727 l 0.148124,-0.67855 2.800243,0.6607 -1.358122,6.09616 -2.799242,-0.655306 0.282124,-1.264127 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path252" id="path252"
d="m 61.258562,59.140664 c 1.013747,0.760094 2.440368,0.572992 3.230491,-0.445089 0.323499,-0.416453 0.492499,-0.908671 0.512999,-1.403715 l 0.608498,-0.304217 1.241872,2.661933 -5.484986,2.709705 -1.246621,-2.657568 1.137747,-0.561049 z" /></svg> d="m 61.258562,59.140664 c 1.013747,0.760094 2.440368,0.572992 3.230491,-0.445089 0.323499,-0.416453 0.492499,-0.908671 0.512999,-1.403715 l 0.608498,-0.304217 1.241872,2.661933 -5.484986,2.709705 -1.246621,-2.657568 1.137747,-0.561049 z" /></svg>

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,358 +1,358 @@
var gulp = require('gulp'), var gulp = require('gulp'),
wiredep = require('wiredep').stream, wiredep = require('wiredep').stream,
eventStream = require('event-stream'), eventStream = require('event-stream'),
gulpLoadPlugins = require('gulp-load-plugins'), gulpLoadPlugins = require('gulp-load-plugins'),
fs = require('fs'), fs = require('fs'),
path = require('path'), path = require('path'),
url = require('url'), url = require('url'),
uri = require('urijs'), uri = require('urijs'),
urljoin = require('url-join'), urljoin = require('url-join'),
s = require('underscore.string'), s = require('underscore.string'),
stringifyObject = require('stringify-object'), stringifyObject = require('stringify-object'),
hawtio = require('hawtio-node-backend'), hawtio = require('hawtio-node-backend'),
argv = require('yargs').argv, argv = require('yargs').argv,
del = require('del'); del = require('del');
var plugins = gulpLoadPlugins({}); var plugins = gulpLoadPlugins({});
var pkg = require('./package.json'); var pkg = require('./package.json');
var config = { var config = {
main: '.', main: '.',
ts: ['plugins/**/*.ts'], ts: ['plugins/**/*.ts'],
less: ['plugins/**/*.less'], less: ['plugins/**/*.less'],
templates: ['plugins/**/*.html'], templates: ['plugins/**/*.html'],
templateModule: pkg.name + '-templates', templateModule: pkg.name + '-templates',
dist: argv.out || './dist/', dist: argv.out || './dist/',
js: pkg.name + '.js', js: pkg.name + '.js',
css: pkg.name + '.css', css: pkg.name + '.css',
tsProject: plugins.typescript.createProject({ tsProject: plugins.typescript.createProject({
target: 'ES5', target: 'ES5',
module: 'commonjs', module: 'commonjs',
declarationFiles: true, declarationFiles: true,
noExternalResolve: false noExternalResolve: false
}) })
}; };
gulp.task('bower', function() { gulp.task('bower', function() {
return gulp.src('index.html') return gulp.src('index.html')
.pipe(wiredep({})) .pipe(wiredep({}))
.pipe(gulp.dest('.')); .pipe(gulp.dest('.'));
}); });
/** Adjust the reference path of any typescript-built plugin this project depends on */ /** Adjust the reference path of any typescript-built plugin this project depends on */
gulp.task('path-adjust', function() { gulp.task('path-adjust', function() {
return gulp.src('libs/**/includes.d.ts') return gulp.src('libs/**/includes.d.ts')
.pipe(plugins.replace(/"\.\.\/libs/gm, '"../../../libs')) .pipe(plugins.replace(/"\.\.\/libs/gm, '"../../../libs'))
.pipe(gulp.dest('libs')); .pipe(gulp.dest('libs'));
}); });
gulp.task('clean-defs', function() { gulp.task('clean-defs', function() {
return del('defs.d.ts'); return del('defs.d.ts');
}); });
gulp.task('tsc', ['clean-defs'], function() { gulp.task('tsc', ['clean-defs'], function() {
var cwd = process.cwd(); var cwd = process.cwd();
var tsResult = gulp.src(config.ts) var tsResult = gulp.src(config.ts)
.pipe(plugins.sourcemaps.init()) .pipe(plugins.sourcemaps.init())
.pipe(plugins.typescript(config.tsProject)) .pipe(plugins.typescript(config.tsProject))
.on('error', plugins.notify.onError({ .on('error', plugins.notify.onError({
onLast: true, onLast: true,
message: '<%= error.message %>', message: '<%= error.message %>',
title: 'Typescript compilation error' title: 'Typescript compilation error'
})); }));
return eventStream.merge( return eventStream.merge(
tsResult.js tsResult.js
.pipe(plugins.concat('compiled.js')) .pipe(plugins.concat('compiled.js'))
.pipe(plugins.sourcemaps.write()) .pipe(plugins.sourcemaps.write())
.pipe(gulp.dest('.')), .pipe(gulp.dest('.')),
tsResult.dts tsResult.dts
.pipe(gulp.dest('d.ts'))) .pipe(gulp.dest('d.ts')))
.pipe(plugins.filter('**/*.d.ts')) .pipe(plugins.filter('**/*.d.ts'))
.pipe(plugins.concatFilenames('defs.d.ts', { .pipe(plugins.concatFilenames('defs.d.ts', {
root: cwd, root: cwd,
prepend: '/// <reference path="', prepend: '/// <reference path="',
append: '"/>' append: '"/>'
})) }))
.pipe(gulp.dest('.')); .pipe(gulp.dest('.'));
}); });
gulp.task('less', function() { gulp.task('less', function() {
return gulp.src(config.less) return gulp.src(config.less)
.pipe(plugins.less({ .pipe(plugins.less({
paths: [path.join(__dirname, 'less', 'includes')] paths: [path.join(__dirname, 'less', 'includes')]
})) }))
.on('error', plugins.notify.onError({ .on('error', plugins.notify.onError({
onLast: true, onLast: true,
message: '<%= error.message %>', message: '<%= error.message %>',
title: 'less file compilation error' title: 'less file compilation error'
})) }))
.pipe(plugins.concat(config.css)) .pipe(plugins.concat(config.css))
.pipe(gulp.dest(config.dist)); .pipe(gulp.dest(config.dist));
}); });
gulp.task('template', ['tsc'], function() { gulp.task('template', ['tsc'], function() {
return gulp.src(config.templates) return gulp.src(config.templates)
.pipe(plugins.angularTemplatecache({ .pipe(plugins.angularTemplatecache({
filename: 'templates.js', filename: 'templates.js',
root: 'plugins/', root: 'plugins/',
standalone: true, standalone: true,
module: config.templateModule, module: config.templateModule,
templateFooter: '}]); hawtioPluginLoader.addModule("' + config.templateModule + '");' templateFooter: '}]); hawtioPluginLoader.addModule("' + config.templateModule + '");'
})) }))
.pipe(gulp.dest('.')); .pipe(gulp.dest('.'));
}); });
gulp.task('concat', ['template'], function() { gulp.task('concat', ['template'], function() {
return gulp.src(['compiled.js', 'templates.js']) return gulp.src(['compiled.js', 'templates.js'])
.pipe(plugins.concat(config.js)) .pipe(plugins.concat(config.js))
.pipe(plugins.ngAnnotate()) .pipe(plugins.ngAnnotate())
.pipe(gulp.dest(config.dist)); .pipe(gulp.dest(config.dist));
}); });
gulp.task('clean', ['concat'], function() { gulp.task('clean', ['concat'], function() {
return del(['templates.js', 'compiled.js', './site/']); return del(['templates.js', 'compiled.js', './site/']);
}); });
gulp.task('watch-less', function() { gulp.task('watch-less', function() {
plugins.watch(config.less, function() { plugins.watch(config.less, function() {
gulp.start('less'); gulp.start('less');
}); });
}); });
gulp.task('watch', ['build', 'watch-less'], function() { gulp.task('watch', ['build', 'watch-less'], function() {
plugins.watch(['libs/**/*.js', 'libs/**/*.css', 'index.html', config.dist + '/*'], function() { plugins.watch(['libs/**/*.js', 'libs/**/*.css', 'index.html', config.dist + '/*'], function() {
gulp.start('reload'); gulp.start('reload');
}); });
plugins.watch(['libs/**/*.d.ts', config.ts, config.templates], function() { plugins.watch(['libs/**/*.d.ts', config.ts, config.templates], function() {
gulp.start(['tsc', 'template', 'concat', 'clean']); gulp.start(['tsc', 'template', 'concat', 'clean']);
}); });
}); });
gulp.task('connect', ['watch'], function() { gulp.task('connect', ['watch'], function() {
// lets disable unauthorised TLS issues with kube REST API // lets disable unauthorised TLS issues with kube REST API
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var kubeBase = process.env.KUBERNETES_MASTER || 'https://localhost:8443'; var kubeBase = process.env.KUBERNETES_MASTER || 'https://localhost:8443';
console.log("==== using KUBERNETES URL: " + kubeBase); console.log("==== using KUBERNETES URL: " + kubeBase);
var kube = uri(urljoin(kubeBase, 'api')); var kube = uri(urljoin(kubeBase, 'api'));
var kubeapis = uri(urljoin(kubeBase, 'apis')); var kubeapis = uri(urljoin(kubeBase, 'apis'));
var oapi = uri(urljoin(kubeBase, 'oapi')); var oapi = uri(urljoin(kubeBase, 'oapi'));
console.log("Connecting to Kubernetes on: " + kube); console.log("Connecting to Kubernetes on: " + kube);
var staticAssets = [{ var staticAssets = [{
path: '/', path: '/',
dir: '.' dir: '.'
}]; }];
var dirs = fs.readdirSync('./libs'); var dirs = fs.readdirSync('./libs');
dirs.forEach(function(dir) { dirs.forEach(function(dir) {
var dir = './libs/' + dir; var dir = './libs/' + dir;
console.log("dir: ", dir); console.log("dir: ", dir);
if (fs.statSync(dir).isDirectory()) { if (fs.statSync(dir).isDirectory()) {
console.log("Adding directory to search path: ", dir); console.log("Adding directory to search path: ", dir);
staticAssets.push({ staticAssets.push({
path: '/', path: '/',
dir: dir dir: dir
}); });
} }
}); });
var localProxies = []; var localProxies = [];
if (process.env.LOCAL_APP_LIBRARY === "true") { if (process.env.LOCAL_APP_LIBRARY === "true") {
localProxies.push({ localProxies.push({
proto: "http", proto: "http",
port: "8588", port: "8588",
hostname: "localhost", hostname: "localhost",
path: '/api/v1/proxy/namespaces/default/services/app-library', path: '/api/v1/proxy/namespaces/default/services/app-library',
targetPath: "/" targetPath: "/"
}); });
console.log("because of $LOCAL_APP_LIBRARY being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/app-library"); console.log("because of $LOCAL_APP_LIBRARY being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/app-library");
} }
if (process.env.LOCAL_FABRIC8_FORGE === "true") { if (process.env.LOCAL_FABRIC8_FORGE === "true") {
localProxies.push({ localProxies.push({
proto: "http", proto: "http",
port: "8080", port: "8080",
hostname: "localhost", hostname: "localhost",
path: '/api/v1/proxy/namespaces/default/services/fabric8-forge', path: '/api/v1/proxy/namespaces/default/services/fabric8-forge',
targetPath: "/" targetPath: "/"
}); });
console.log("because of LOCAL_FABRIC8_FORGE being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/fabric8-forge"); console.log("because of LOCAL_FABRIC8_FORGE being true we are using a local proxy for /api/v1/proxy/namespaces/default/services/fabric8-forge");
} }
if (process.env.LOCAL_GOGS_HOST) { if (process.env.LOCAL_GOGS_HOST) {
var gogsPort = process.env.LOCAL_GOGS_PORT || "3000"; var gogsPort = process.env.LOCAL_GOGS_PORT || "3000";
//var gogsHostName = process.env.LOCAL_GOGS_HOST + ":" + gogsPort; //var gogsHostName = process.env.LOCAL_GOGS_HOST + ":" + gogsPort;
var gogsHostName = process.env.LOCAL_GOGS_HOST; var gogsHostName = process.env.LOCAL_GOGS_HOST;
console.log("Using gogs host: " + gogsHostName); console.log("Using gogs host: " + gogsHostName);
localProxies.push({ localProxies.push({
proto: "http", proto: "http",
port: gogsPort, port: gogsPort,
hostname: gogsHostName, hostname: gogsHostName,
path: '/kubernetes/api/v1/proxy/services/gogs-http-service', path: '/kubernetes/api/v1/proxy/services/gogs-http-service',
targetPath: "/" targetPath: "/"
}); });
console.log("because of LOCAL_GOGS_HOST being set we are using a local proxy for /kubernetes/api/v1/proxy/services/gogs-http-service to point to http://" + process.env.LOCAL_GOGS_HOST + ":" + gogsPort); console.log("because of LOCAL_GOGS_HOST being set we are using a local proxy for /kubernetes/api/v1/proxy/services/gogs-http-service to point to http://" + process.env.LOCAL_GOGS_HOST + ":" + gogsPort);
} }
if (process.env.LOCAL_JENKINSHIFT) { if (process.env.LOCAL_JENKINSHIFT) {
var jenkinshiftPort = process.env.LOCAL_JENKINSHIFT_PORT || "9090"; var jenkinshiftPort = process.env.LOCAL_JENKINSHIFT_PORT || "9090";
var jenkinshiftHost = process.env.LOCAL_JENKINSHIFT; var jenkinshiftHost = process.env.LOCAL_JENKINSHIFT;
console.log("Using jenkinshift host: " + jenkinshiftHost); console.log("Using jenkinshift host: " + jenkinshiftHost);
var proxyPath = '/api/v1/proxy/namespaces/default/services/templates/oapi/v1'; var proxyPath = '/api/v1/proxy/namespaces/default/services/templates/oapi/v1';
console.log("Using jenkinshift host: " + jenkinshiftHost); console.log("Using jenkinshift host: " + jenkinshiftHost);
localProxies.push({ localProxies.push({
proto: "http", proto: "http",
port: jenkinshiftPort, port: jenkinshiftPort,
hostname: jenkinshiftHost, hostname: jenkinshiftHost,
path: proxyPath, path: proxyPath,
targetPath: "/oapi/v1" targetPath: "/oapi/v1"
}); });
localProxies.push({ localProxies.push({
proto: "http", proto: "http",
port: jenkinshiftPort, port: jenkinshiftPort,
hostname: jenkinshiftHost, hostname: jenkinshiftHost,
path: "/oapi/v1", path: "/oapi/v1",
targetPath: "/oapi/v1" targetPath: "/oapi/v1"
}); });
console.log("because of LOCAL_JENKINSHIFT being set we are using a local proxy for " + proxyPath + " to point to http://" + jenkinshiftHost + ":" + jenkinshiftPort); console.log("because of LOCAL_JENKINSHIFT being set we are using a local proxy for " + proxyPath + " to point to http://" + jenkinshiftHost + ":" + jenkinshiftPort);
} }
var defaultProxies = [{ var defaultProxies = [{
proto: kube.protocol(), proto: kube.protocol(),
port: kube.port(), port: kube.port(),
hostname: kube.hostname(), hostname: kube.hostname(),
path: '/kubernetes/api', path: '/kubernetes/api',
targetPath: kube.path() targetPath: kube.path()
}, { }, {
proto: kubeapis.protocol(), proto: kubeapis.protocol(),
port: kubeapis.port(), port: kubeapis.port(),
hostname: kubeapis.hostname(), hostname: kubeapis.hostname(),
path: '/apis', path: '/apis',
targetPath: kubeapis.path() targetPath: kubeapis.path()
}, { }, {
proto: oapi.protocol(), proto: oapi.protocol(),
port: oapi.port(), port: oapi.port(),
hostname: oapi.hostname(), hostname: oapi.hostname(),
path: '/kubernetes/oapi', path: '/kubernetes/oapi',
targetPath: oapi.path() targetPath: oapi.path()
}, { }, {
proto: kube.protocol(), proto: kube.protocol(),
hostname: kube.hostname(), hostname: kube.hostname(),
port: kube.port(), port: kube.port(),
path: '/jolokia', path: '/jolokia',
targetPath: '/hawtio/jolokia' targetPath: '/hawtio/jolokia'
}, { }, {
proto: kube.protocol(), proto: kube.protocol(),
hostname: kube.hostname(), hostname: kube.hostname(),
port: kube.port(), port: kube.port(),
path: '/git', path: '/git',
targetPath: '/hawtio/git' targetPath: '/hawtio/git'
}, { }, {
proto: "http", proto: "http",
port: "8080", port: "8080",
hostname: "192.168.0.102", hostname: "192.168.0.101",
path: '/java/console/api', path: '/java/console/api',
targetPath: "/" targetPath: "/"
}]; }];
var staticProxies = localProxies.concat(defaultProxies); var staticProxies = localProxies.concat(defaultProxies);
hawtio.setConfig({ hawtio.setConfig({
port: process.env.DEV_PORT || 9000, port: process.env.DEV_PORT || 9000,
staticProxies: staticProxies, staticProxies: staticProxies,
staticAssets: staticAssets, staticAssets: staticAssets,
fallback: 'index.html', fallback: 'index.html',
liveReload: { liveReload: {
enabled: true enabled: true
} }
}); });
var debugLoggingOfProxy = process.env.DEBUG_PROXY === "true"; var debugLoggingOfProxy = process.env.DEBUG_PROXY === "true";
var useAuthentication = process.env.DISABLE_OAUTH !== "true"; var useAuthentication = process.env.DISABLE_OAUTH !== "true";
var googleClientId = process.env.GOOGLE_OAUTH_CLIENT_ID; var googleClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;
var googleClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET; var googleClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;
hawtio.use('/osconsole/config.js', function(req, res, next) { hawtio.use('/osconsole/config.js', function(req, res, next) {
var config = { var config = {
api: { api: {
openshift: { openshift: {
proto: oapi.protocol(), proto: oapi.protocol(),
hostPort: oapi.host(), hostPort: oapi.host(),
prefix: oapi.path() prefix: oapi.path()
}, },
k8s: { k8s: {
proto: kube.protocol(), proto: kube.protocol(),
hostPort: kube.host(), hostPort: kube.host(),
prefix: kube.path() prefix: kube.path()
} }
} }
}; };
if (googleClientId && googleClientSecret) { if (googleClientId && googleClientSecret) {
config.master_uri = kubeBase; config.master_uri = kubeBase;
config.google = { config.google = {
clientId: googleClientId, clientId: googleClientId,
clientSecret: googleClientSecret, clientSecret: googleClientSecret,
authenticationURI: "https://accounts.google.com/o/oauth2/auth", authenticationURI: "https://accounts.google.com/o/oauth2/auth",
authorizationURI: "https://accounts.google.com/o/oauth2/auth", authorizationURI: "https://accounts.google.com/o/oauth2/auth",
scope: "profile", scope: "profile",
redirectURI: "http://localhost:9000" redirectURI: "http://localhost:9000"
}; };
} else if (useAuthentication) { } else if (useAuthentication) {
config.master_uri = kubeBase; config.master_uri = kubeBase;
config.openshift = { config.openshift = {
oauth_authorize_uri: urljoin(kubeBase, '/oauth/authorize'), oauth_authorize_uri: urljoin(kubeBase, '/oauth/authorize'),
oauth_client_id: 'fabric8' oauth_client_id: 'fabric8'
}; };
} }
var answer = "window.OPENSHIFT_CONFIG = window.HAWTIO_OAUTH_CONFIG = " + stringifyObject(config); var answer = "window.OPENSHIFT_CONFIG = window.HAWTIO_OAUTH_CONFIG = " + stringifyObject(config);
res.set('Content-Type', 'application/javascript'); res.set('Content-Type', 'application/javascript');
res.send(answer); res.send(answer);
}); });
hawtio.use('/', function(req, res, next) { hawtio.use('/', function(req, res, next) {
var path = req.originalUrl; var path = req.originalUrl;
// avoid returning these files, they should get pulled from js // avoid returning these files, they should get pulled from js
if (s.startsWith(path, '/plugins/') && s.endsWith(path, 'html')) { if (s.startsWith(path, '/plugins/') && s.endsWith(path, 'html')) {
console.log("returning 404 for: ", path); console.log("returning 404 for: ", path);
res.statusCode = 404; res.statusCode = 404;
res.end(); res.end();
} else { } else {
if (debugLoggingOfProxy) { if (debugLoggingOfProxy) {
console.log("allowing: ", path); console.log("allowing: ", path);
} }
next(); next();
} }
}); });
hawtio.listen(function(server) { hawtio.listen(function(server) {
var host = server.address().address; var host = server.address().address;
var port = server.address().port; var port = server.address().port;
console.log("started from gulp file at ", host, ":", port); console.log("started from gulp file at ", host, ":", port);
}); });
}); });
gulp.task('reload', function() { gulp.task('reload', function() {
gulp.src('.') gulp.src('.')
.pipe(hawtio.reload()); .pipe(hawtio.reload());
}); });
gulp.task('build', ['bower', 'path-adjust', 'tsc', 'less', 'template', 'concat', 'clean']); gulp.task('build', ['bower', 'path-adjust', 'tsc', 'less', 'template', 'concat', 'clean']);
gulp.task('site', ['clean', 'build'], function() { gulp.task('site', ['clean', 'build'], function() {
gulp.src(['index.html', 'osconsole/config.js.tmpl', 'css/**', 'images/**', 'img/**', 'libs/**', 'dist/**'], { base: '.' }).pipe(gulp.dest('site')); gulp.src(['index.html', 'osconsole/config.js.tmpl', 'css/**', 'images/**', 'img/**', 'libs/**', 'dist/**'], { base: '.' }).pipe(gulp.dest('site'));
var dirs = fs.readdirSync('./libs'); var dirs = fs.readdirSync('./libs');
dirs.forEach(function(dir) { dirs.forEach(function(dir) {
var path = './libs/' + dir + "/img"; var path = './libs/' + dir + "/img";
try { try {
if (fs.statSync(path).isDirectory()) { if (fs.statSync(path).isDirectory()) {
console.log("found image dir: " + path); console.log("found image dir: " + path);
var pattern = 'libs/' + dir + "/img/**"; var pattern = 'libs/' + dir + "/img/**";
gulp.src([pattern]).pipe(gulp.dest('site/img')); gulp.src([pattern]).pipe(gulp.dest('site/img'));
} }
} catch (e) { } catch (e) {
// ignore, file does not exist // ignore, file does not exist
} }
}); });
}); });
gulp.task('default', ['connect']); gulp.task('default', ['connect']);

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4"> <module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true"> <component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View File

@ -1,316 +1,316 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/" xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr" xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612" id="svg1612"
sodipodi:docname="sagar_ns_server.svg" sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36" viewBox="0 0 359.37 469.36"
sodipodi:version="0.32" sodipodi:version="0.32"
version="1.0" version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1" inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg" sodipodi:docbase="/Users/johnolsen/Pictures/svg"
> >
<defs <defs
id="defs1614" id="defs1614"
> >
<linearGradient <linearGradient
id="linearGradient29808" id="linearGradient29808"
y2="654.74" y2="654.74"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="191.45" x2="191.45"
gradientTransform="translate(225.21 -257.03)" gradientTransform="translate(225.21 -257.03)"
y1="654.74" y1="654.74"
x1="177.95" x1="177.95"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29806" id="linearGradient29806"
y2="611.48" y2="611.48"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="306.18" x2="306.18"
gradientTransform="translate(-9.0156 192.16)" gradientTransform="translate(-9.0156 192.16)"
y1="596.63" y1="596.63"
x1="309.71" x1="309.71"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient24757" id="linearGradient24757"
> >
<stop <stop
id="stop24759" id="stop24759"
style="stop-color:#d5d5d5" style="stop-color:#d5d5d5"
offset="0" offset="0"
/> />
<stop <stop
id="stop24761" id="stop24761"
style="stop-color:#848484;stop-opacity:0" style="stop-color:#848484;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient29804" id="linearGradient29804"
y2="560.57" y2="560.57"
xlink:href="#linearGradient24757" xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="379.72" x2="379.72"
y1="560.57" y1="560.57"
x1="253.14" x1="253.14"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29802" id="linearGradient29802"
y2="949.11" y2="949.11"
xlink:href="#linearGradient22094" xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="659.71" x2="659.71"
gradientTransform="translate(-220.88 106.92)" gradientTransform="translate(-220.88 106.92)"
y1="400.17" y1="400.17"
x1="491.76" x1="491.76"
inkscape:collect="always" inkscape:collect="always"
/> />
<linearGradient <linearGradient
id="linearGradient29800" id="linearGradient29800"
y2="482.62" y2="482.62"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="265.58" x2="265.58"
gradientTransform="translate(-208.22 109.74)" gradientTransform="translate(-208.22 109.74)"
y1="306.18" y1="306.18"
x1="705.01" x1="705.01"
inkscape:collect="always" inkscape:collect="always"
> >
<stop <stop
id="stop22985" id="stop22985"
style="stop-color:#000000" style="stop-color:#000000"
offset="0" offset="0"
/> />
<stop <stop
id="stop22987" id="stop22987"
style="stop-color:#000000;stop-opacity:0" style="stop-color:#000000;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient22094" id="linearGradient22094"
> >
<stop <stop
id="stop22096" id="stop22096"
style="stop-color:#000000" style="stop-color:#000000"
offset="0" offset="0"
/> />
<stop <stop
id="stop22098" id="stop22098"
style="stop-color:#000000;stop-opacity:0" style="stop-color:#000000;stop-opacity:0"
offset="1" offset="1"
/> />
</linearGradient </linearGradient
> >
<linearGradient <linearGradient
id="linearGradient29798" id="linearGradient29798"
y2="211.3" y2="211.3"
xlink:href="#linearGradient22094" xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
x2="576.57" x2="576.57"
gradientTransform="translate(-208.22 109.74)" gradientTransform="translate(-208.22 109.74)"
y1="133.76" y1="133.76"
x1="575.89" x1="575.89"
inkscape:collect="always" inkscape:collect="always"
/> />
</defs </defs
> >
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
bordercolor="#666666" bordercolor="#666666"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-y="176" inkscape:window-y="176"
pagecolor="#ffffff" pagecolor="#ffffff"
inkscape:window-height="581" inkscape:window-height="581"
inkscape:zoom="0.7" inkscape:zoom="0.7"
inkscape:window-x="176" inkscape:window-x="176"
borderopacity="1.0" borderopacity="1.0"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
inkscape:cx="454.3678" inkscape:cx="454.3678"
inkscape:cy="517.33549" inkscape:cy="517.33549"
inkscape:window-width="756" inkscape:window-width="756"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:document-units="px" inkscape:document-units="px"
/> />
<g <g
id="layer1" id="layer1"
inkscape:label="Layer 1" inkscape:label="Layer 1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)" transform="translate(-226.03 -301.23)"
> >
<g <g
id="g29774" id="g29774"
inkscape:export-ydpi="90" inkscape:export-ydpi="90"
inkscape:export-xdpi="90" inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png" inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)" transform="matrix(.95252 0 0 .80631 78.742 104.9)"
> >
<path <path
id="path29776" id="path29776"
style="fill-rule:evenodd;fill:#ffffff" style="fill-rule:evenodd;fill:#ffffff"
d="m154.75 296.11l209-52.5 167.75 5.75-3 363.25-125.25 213-233.75-56.5-14.75-473z" d="m154.75 296.11l209-52.5 167.75 5.75-3 363.25-125.25 213-233.75-56.5-14.75-473z"
/> />
<g <g
id="g29778" id="g29778"
> >
<path <path
id="path29780" id="path29780"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29798)" style="fill-rule:evenodd;fill:url(#linearGradient29798)"
d="m363.7 243.5l168.21 6.13-127.82 56.4-249.31-9.77 208.92-52.76z" d="m363.7 243.5l168.21 6.13-127.82 56.4-249.31-9.77 208.92-52.76z"
/> />
<path <path
id="path29782" id="path29782"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29800)" style="fill-rule:evenodd;fill:url(#linearGradient29800)"
d="m531.39 249.13l-3.1 362.98-125.04 212.97 0.18-519.27 127.96-56.68z" d="m531.39 249.13l-3.1 362.98-125.04 212.97 0.18-519.27 127.96-56.68z"
/> />
<path <path
id="path29784" id="path29784"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29802)" style="fill-rule:evenodd;fill:url(#linearGradient29802)"
d="m154.63 296.26l249.02 9.38-0.18 519.59-233.54-56.28-15.3-472.69z" d="m154.63 296.26l249.02 9.38-0.18 519.59-233.54-56.28-15.3-472.69z"
/> />
<path <path
id="path29786" id="path29786"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29804)" style="fill-rule:evenodd;fill:url(#linearGradient29804)"
d="m253.14 300l124.46 4.6 2.47 514.77-33.29-7.78-93.64-511.59z" d="m253.14 300l124.46 4.6 2.47 514.77-33.29-7.78-93.64-511.59z"
/> />
<path <path
id="path29788" id="path29788"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29806)" style="fill-rule:evenodd;fill:url(#linearGradient29806)"
d="m169.88 768.99l-0.53-16.09 233.7 53.39-0.06 18.38-233.11-55.68z" d="m169.88 768.99l-0.53-16.09 233.7 53.39-0.06 18.38-233.11-55.68z"
/> />
<path <path
id="path29790" id="path29790"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)" style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z" d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/> />
<path <path
id="path29792" id="path29792"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 337.78l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 337.78l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
<path <path
id="path29794" id="path29794"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 371.94l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 371.94l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
<path <path
id="path29796" id="path29796"
sodipodi:nodetypes="ccccc" sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:#3c36d3" style="fill-rule:evenodd;fill:#3c36d3"
d="m352.16 406.1l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z" d="m352.16 406.1l39.58 2.22-0.76 11.63-39.42-2.26 0.6-11.59z"
/> />
</g </g
> >
</g </g
> >
</g </g
> >
<metadata <metadata
> >
<rdf:RDF <rdf:RDF
> >
<cc:Work <cc:Work
> >
<dc:format <dc:format
>image/svg+xml</dc:format >image/svg+xml</dc:format
> >
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/> />
<cc:license <cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/> />
<dc:publisher <dc:publisher
> >
<cc:Agent <cc:Agent
rdf:about="http://openclipart.org/" rdf:about="http://openclipart.org/"
> >
<dc:title <dc:title
>Openclipart</dc:title >Openclipart</dc:title
> >
</cc:Agent </cc:Agent
> >
</dc:publisher </dc:publisher
> >
<dc:title <dc:title
>Server Cabinet CPU</dc:title >Server Cabinet CPU</dc:title
> >
<dc:date <dc:date
>2007-09-03T13:59:19</dc:date >2007-09-03T13:59:19</dc:date
> >
<dc:description <dc:description
>Represents a server in Network Diagrams</dc:description >Represents a server in Network Diagrams</dc:description
> >
<dc:source <dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source >https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
> >
<dc:creator <dc:creator
> >
<cc:Agent <cc:Agent
> >
<dc:title <dc:title
>sagar_ns</dc:title >sagar_ns</dc:title
> >
</cc:Agent </cc:Agent
> >
</dc:creator </dc:creator
> >
<dc:subject <dc:subject
> >
<rdf:Bag <rdf:Bag
> >
<rdf:li <rdf:li
>mainframe</rdf:li >mainframe</rdf:li
> >
<rdf:li <rdf:li
>server</rdf:li >server</rdf:li
> >
</rdf:Bag </rdf:Bag
> >
</dc:subject </dc:subject
> >
</cc:Work </cc:Work
> >
<cc:License <cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/" rdf:about="http://creativecommons.org/licenses/publicdomain/"
> >
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" rdf:resource="http://creativecommons.org/ns#Reproduction"
/> />
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" rdf:resource="http://creativecommons.org/ns#Distribution"
/> />
<cc:permits <cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/> />
</cc:License </cc:License
> >
</rdf:RDF </rdf:RDF
> >
</metadata </metadata
> >
</svg </svg
> >

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -1,451 +1,451 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1" version="1.1"
width="138" width="138"
height="138" height="138"
id="svg2" id="svg2"
xml:space="preserve" xml:space="preserve"
inkscape:version="0.48.5 r10040" inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff" pagecolor="#ffffff"
bordercolor="#666666" bordercolor="#666666"
borderopacity="1" borderopacity="1"
objecttolerance="10" objecttolerance="10"
gridtolerance="10" gridtolerance="10"
guidetolerance="10" guidetolerance="10"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-width="1918" inkscape:window-width="1918"
inkscape:window-height="1054" inkscape:window-height="1054"
id="namedview147" id="namedview147"
showgrid="false" showgrid="false"
fit-margin-top="0" fit-margin-top="0"
fit-margin-left="0" fit-margin-left="0"
fit-margin-right="0" fit-margin-right="0"
fit-margin-bottom="0" fit-margin-bottom="0"
inkscape:zoom="3.0970926" inkscape:zoom="3.0970926"
inkscape:cx="203.09647" inkscape:cx="203.09647"
inkscape:cy="61.870747" inkscape:cy="61.870747"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="31" inkscape:window-y="31"
inkscape:window-maximized="0" inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><g id="defs6" /><g
id="g12" id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:118.52590179;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:118.52590179;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path14" id="path14"
d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><path d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path16" id="path16"
d="M 69.164415,13.544412 24.50791,35.450754 13.47369,84.683616 l 30.897917,39.486744 49.562617,0 L 124.84026,84.691321 113.81667,35.45512 69.164415,13.539019 z" /><g d="M 69.164415,13.544412 24.50791,35.450754 13.47369,84.683616 l 30.897917,39.486744 49.562617,0 L 124.84026,84.691321 113.81667,35.45512 69.164415,13.539019 z" /><g
id="g18" id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#336ee5;stroke-width:74.74790192;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#336ee5;stroke-width:74.74790192;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path20" id="path20"
d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><g d="m 6196.6587,-1043.6173 -94.2902,-195.4939 -211.9113,-48.3046 -169.9617,135.2607 -0.025,216.9692 169.9297,135.2974 211.9254,-48.257 94.3336,-195.4718 z" /></g><g
id="g22" id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:30.78089905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:30.78089905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path24" id="path24"
d="m 1013.0746,6022.3961 c 73.5242,16.6963 146.8281,-29.4129 163.7263,-102.9867 16.9013,-73.5707 -29.0033,-146.7473 -102.5275,-163.4423 -73.5273,-16.6918 -146.8312,29.4174 -163.7308,102.9881 -16.8982,73.5738 29.0033,146.7505 102.532,163.4409 z" /></g><path d="m 1013.0746,6022.3961 c 73.5242,16.6963 146.8281,-29.4129 163.7263,-102.9867 16.9013,-73.5707 -29.0033,-146.7473 -102.5275,-163.4423 -73.5273,-16.6918 -146.8312,29.4174 -163.7308,102.9881 -16.8982,73.5738 29.0033,146.7505 102.532,163.4409 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path26" id="path26"
d="m 72.040533,34.450779 -3.433866,0.01284 -0.21825,25.929869 5.082487,0.0488 -1.430371,-25.986244 z" /><g d="m 72.040533,34.450779 -3.433866,0.01284 -0.21825,25.929869 5.082487,0.0488 -1.430371,-25.986244 z" /><g
id="g28" id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path30" id="path30"
d="m 1096.8024,6045.6095 15.9899,-0.034 1.0191,-110.4911 -23.6699,-0.2094 6.6609,110.7345 z" /></g><path d="m 1096.8024,6045.6095 15.9899,-0.034 1.0191,-110.4911 -23.6699,-0.2094 6.6609,110.7345 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path32" id="path32"
d="m 66.275173,34.450779 3.434616,0.01284 0.212499,25.929869 -5.081736,0.04751 1.434621,-25.985473 z" /><g d="m 66.275173,34.450779 3.434616,0.01284 0.212499,25.929869 -5.081736,0.04751 1.434621,-25.985473 z" /><g
id="g34" id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path36" id="path36"
d="m 1123.6518,6045.6098 -15.9947,-0.034 -0.9893,-110.4911 23.6664,-0.2029 -6.6824,110.7283 z" /></g><path d="m 1123.6518,6045.6098 -15.9947,-0.034 -0.9893,-110.4911 23.6664,-0.2029 -6.6824,110.7283 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path38" id="path38"
d="m 66.486048,24.660222 c 0,1.684688 1.196246,3.050905 2.672367,3.050905 1.475746,0 2.672368,-1.366217 2.672368,-3.049749 0,-1.685074 -1.195497,-3.050777 -2.672368,-3.051933 -1.476121,0 -2.672367,1.365832 -2.672367,3.050777" /><g d="m 66.486048,24.660222 c 0,1.684688 1.196246,3.050905 2.672367,3.050905 1.475746,0 2.672368,-1.366217 2.672368,-3.049749 0,-1.685074 -1.195497,-3.050777 -2.672368,-3.051933 -1.476121,0 -2.672367,1.365832 -2.672367,3.050777" /><g
id="g40" id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path42" id="path42"
d="m 1173.5053,6087.183 c -8e-4,-7.1804 -5.8238,-12.9997 -13.0019,-12.9988 -7.1785,8e-4 -12.998,5.8229 -12.9986,12.9971 0,7.1802 5.8204,12.9994 13.0023,13.0031 7.1801,-6e-4 12.9994,-5.8212 12.9982,-13.0014 z" /></g><path d="m 1173.5053,6087.183 c -8e-4,-7.1804 -5.8238,-12.9997 -13.0019,-12.9988 -7.1785,8e-4 -12.998,5.8229 -12.9986,12.9971 0,7.1802 5.8204,12.9994 13.0023,13.0031 7.1801,-6e-4 12.9994,-5.8212 12.9982,-13.0014 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path44" id="path44"
d="m 71.829658,24.619899 c -6.25e-4,0.240909 0.01125,0.58853 0.0025,0.82045 -0.03575,0.97198 -0.242749,1.716663 -0.366749,2.612493 -0.224999,1.915837 -0.413874,3.504342 -0.297999,4.980482 0.106375,0.738906 0.522999,1.030538 0.869873,1.372253 l -4.215114,2.865601 0.633623,-12.630219 3.373491,-0.02055 z" /><g d="m 71.829658,24.619899 c -6.25e-4,0.240909 0.01125,0.58853 0.0025,0.82045 -0.03575,0.97198 -0.242749,1.716663 -0.366749,2.612493 -0.224999,1.915837 -0.413874,3.504342 -0.297999,4.980482 0.106375,0.738906 0.522999,1.030538 0.869873,1.372253 l -4.215114,2.865601 0.633623,-12.630219 3.373491,-0.02055 z" /><g
id="g46" id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path48" id="path48"
d="m -6476.0579,1031.9675 c 1.0925,0 2.6683,-0.048 3.7194,-0.012 4.4045,0.1551 7.7839,1.0624 11.8431,1.6053 8.6848,0.9836 15.8877,1.8119 22.5774,1.3045 3.35,-0.4652 4.6718,-2.2896 6.2229,-3.8095 l 12.9884,18.4538 -57.2553,-2.7734 -0.096,-14.7685 z" /></g><path d="m -6476.0579,1031.9675 c 1.0925,0 2.6683,-0.048 3.7194,-0.012 4.4045,0.1551 7.7839,1.0624 11.8431,1.6053 8.6848,0.9836 15.8877,1.8119 22.5774,1.3045 3.35,-0.4652 4.6718,-2.2896 6.2229,-3.8095 l 12.9884,18.4538 -57.2553,-2.7734 -0.096,-14.7685 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path50" id="path50"
d="m 66.486048,24.619899 c 7.5e-4,0.240909 -0.01125,0.58853 -0.0025,0.82045 0.0355,0.97198 0.242749,1.716663 0.366374,2.612493 0.225374,1.915837 0.414249,3.504342 0.298374,4.980482 -0.10625,0.738906 -0.522999,1.030538 -0.869873,1.372253 l 4.215114,2.865601 -0.633499,-12.630219 -3.373615,-0.02055 z" /><g d="m 66.486048,24.619899 c 7.5e-4,0.240909 -0.01125,0.58853 -0.0025,0.82045 0.0355,0.97198 0.242749,1.716663 0.366374,2.612493 0.225374,1.915837 0.414249,3.504342 0.298374,4.980482 -0.10625,0.738906 -0.522999,1.030538 -0.869873,1.372253 l 4.215114,2.865601 -0.633499,-12.630219 -3.373615,-0.02055 z" /><g
id="g52" id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path54" id="path54"
d="m -6476.0579,1055.3604 c 1.0925,0 2.6683,0.048 3.7194,0.013 4.4045,-0.1551 7.7839,-1.0627 11.8431,-1.6056 8.6848,-0.985 15.8877,-1.8133 22.5774,-1.3059 3.35,0.4669 4.6718,2.291 6.2229,3.8095 l 12.9884,-18.4538 -57.2553,2.7748 -0.096,14.7685 z" /></g><g d="m -6476.0579,1055.3604 c 1.0925,0 2.6683,0.048 3.7194,0.013 4.4045,-0.1551 7.7839,-1.0627 11.8431,-1.6056 8.6848,-0.985 15.8877,-1.8133 22.5774,-1.3059 3.35,0.4669 4.6718,2.291 6.2229,3.8095 l 12.9884,-18.4538 -57.2553,2.7748 -0.096,14.7685 z" /></g><g
id="g56" id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:30.34600067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:30.34600067;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path58" id="path58"
d="m 1073.7275,5865.2637 -30.1062,-14.4286 -30.1014,14.4363 -7.433,32.4408 20.8395,26.0096 33.4099,0 20.8321,-26.0158 -7.4409,-32.4374 z" /></g><path d="m 1073.7275,5865.2637 -30.1062,-14.4286 -30.1014,14.4363 -7.433,32.4408 20.8395,26.0096 33.4099,0 20.8321,-26.0158 -7.4409,-32.4374 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path60" id="path60"
d="m 98.919585,50.580588 -2.146869,-2.752723 -19.869322,15.99189 3.131117,4.112262 18.885074,-17.351429 z" /><g d="m 98.919585,50.580588 -2.146869,-2.752723 -19.869322,15.99189 3.131117,4.112262 18.885074,-17.351429 z" /><g
id="g62" id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path64" id="path64"
d="m 5577.0313,3012.37 15.9896,-0.035 1.0146,-110.4928 -23.6665,-0.2083 6.6623,110.7357 z" /></g><path d="m 5577.0313,3012.37 15.9896,-0.035 1.0146,-110.4928 -23.6665,-0.2083 6.6623,110.7357 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path66" id="path66"
d="M 95.325345,45.949654 97.459839,48.713549 77.859267,65.05152 74.654776,60.998971 95.325345,45.949654 z" /><g d="M 95.325345,45.949654 97.459839,48.713549 77.859267,65.05152 74.654776,60.998971 95.325345,45.949654 z" /><g
id="g68" id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path70" id="path70"
d="m 5603.881,3012.3717 -15.9925,-0.037 -0.9946,-110.4931 23.6681,-0.201 -6.681,110.7309 z" /></g><path d="m 5603.881,3012.3717 -15.9925,-0.037 -0.9946,-110.4931 23.6681,-0.201 -6.681,110.7309 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path72" id="path72"
d="m 102.9072,40.014784 c -1.28224,1.050442 -1.57562,2.862904 -0.65588,4.04921 0.921,1.185279 2.70638,1.295203 3.98874,0.244633 1.28238,-1.050571 1.57575,-2.862905 0.65475,-4.048184 -0.91975,-1.18592 -2.70561,-1.295202 -3.98761,-0.245659" /><g d="m 102.9072,40.014784 c -1.28224,1.050442 -1.57562,2.862904 -0.65588,4.04921 0.921,1.185279 2.70638,1.295203 3.98874,0.244633 1.28238,-1.050571 1.57575,-2.862905 0.65475,-4.048184 -0.91975,-1.18592 -2.70561,-1.295202 -3.98761,-0.245659" /><g
id="g74" id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path76" id="path76"
d="m 5852.363,3053.3992 c 0,-7.181 -5.8201,-12.9999 -13.0023,-13.0013 -7.1801,0 -13.0011,5.8235 -12.9999,13.0033 0,7.1788 5.8212,12.9986 13.0013,12.9949 7.1799,0 12.998,-5.8198 13.0009,-12.9969 z" /></g><path d="m 5852.363,3053.3992 c 0,-7.181 -5.8201,-12.9999 -13.0023,-13.0013 -7.1801,0 -13.0011,5.8235 -12.9999,13.0033 0,7.1788 5.8212,12.9986 13.0013,12.9949 7.1799,0 12.998,-5.8198 13.0009,-12.9969 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path78" id="path78"
d="m 106.26944,44.282045 c -0.18388,0.150375 -0.44,0.376001 -0.62288,0.514305 -0.76111,0.577358 -1.45736,0.87554 -2.21636,1.333856 -1.59837,1.013716 -2.92537,1.852785 -3.976241,2.8665 -0.496124,0.545383 -0.457749,1.061486 -0.501374,1.553704 l -4.808612,-1.598778 10.006227,-7.365423 2.11924,2.695836 z" /><g d="m 106.26944,44.282045 c -0.18388,0.150375 -0.44,0.376001 -0.62288,0.514305 -0.76111,0.577358 -1.45736,0.87554 -2.21636,1.333856 -1.59837,1.013716 -2.92537,1.852785 -3.976241,2.8665 -0.496124,0.545383 -0.457749,1.061486 -0.501374,1.553704 l -4.808612,-1.598778 10.006227,-7.365423 2.11924,2.695836 z" /><g
id="g80" id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path82" id="path82"
d="m -3249.2313,5243.3223 c 1.0933,0 2.664,-0.052 3.7219,-0.013 4.403,0.1539 7.7794,1.0602 11.8409,1.6067 8.6825,0.9833 15.8867,1.8108 22.5788,1.3017 3.3474,-0.4627 4.6661,-2.2856 6.2166,-3.8075 l 12.9912,18.4521 -57.2539,-2.7749 -0.095,-14.7648 z" /></g><path d="m -3249.2313,5243.3223 c 1.0933,0 2.664,-0.052 3.7219,-0.013 4.403,0.1539 7.7794,1.0602 11.8409,1.6067 8.6825,0.9833 15.8867,1.8108 22.5788,1.3017 3.3474,-0.4627 4.6661,-2.2856 6.2166,-3.8075 l 12.9912,18.4521 -57.2539,-2.7749 -0.095,-14.7648 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path84" id="path84"
d="m 102.93845,39.99 c -0.18388,0.151402 -0.455,0.357381 -0.62613,0.509939 -0.71749,0.634118 -1.15586,1.265025 -1.75999,1.923157 -1.317746,1.375206 -2.408993,2.51708 -3.604865,3.344079 -0.628248,0.37613 -1.109122,0.222416 -1.58637,0.156539 L 95.808968,51.09605 105.02582,42.713573 102.93845,39.99 z" /><g d="m 102.93845,39.99 c -0.18388,0.151402 -0.455,0.357381 -0.62613,0.509939 -0.71749,0.634118 -1.15586,1.265025 -1.75999,1.923157 -1.317746,1.375206 -2.408993,2.51708 -3.604865,3.344079 -0.628248,0.37613 -1.109122,0.222416 -1.58637,0.156539 L 95.808968,51.09605 105.02582,42.713573 102.93845,39.99 z" /><g
id="g86" id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path88" id="path88"
d="m -3249.2339,5266.7135 c 1.0976,0 2.668,0.05 3.7202,0.011 4.4071,-0.1545 7.7848,-1.0607 11.8446,-1.6044 8.6862,-0.9839 15.8862,-1.8108 22.578,-1.302 3.3491,0.4632 4.668,2.287 6.2194,3.8072 l 12.9861,-18.4518 -57.2505,2.7689 -0.098,14.771 z" /></g><path d="m -3249.2339,5266.7135 c 1.0976,0 2.668,0.05 3.7202,0.011 4.4071,-0.1545 7.7848,-1.0607 11.8446,-1.6044 8.6862,-0.9839 15.8862,-1.8108 22.578,-1.302 3.3491,0.4632 4.668,2.287 6.2194,3.8072 l 12.9861,-18.4518 -57.2505,2.7689 -0.098,14.771 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path90" id="path90"
d="m 103.34907,82.246154 0.7565,-3.441418 -24.558183,-5.988805 -1.176746,5.079492 24.978429,4.350731 z" /><g d="m 103.34907,82.246154 0.7565,-3.441418 -24.558183,-5.988805 -1.176746,5.079492 24.978429,4.350731 z" /><g
id="g92" id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path94" id="path94"
d="m -5847.3578,2171.5747 -15.9939,0.032 -1.0168,110.4913 23.6687,0.207 -6.658,-110.7301 z" /></g><path d="m -5847.3578,2171.5747 -15.9939,0.032 -1.0168,110.4913 23.6687,0.207 -6.658,-110.7301 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path96" id="path96"
d="m 104.63282,76.471804 -0.77237,3.437694 -24.654687,-5.556942 1.085622,-5.10068 24.341435,7.219928 z" /><g d="m 104.63282,76.471804 -0.77237,3.437694 -24.654687,-5.556942 1.085622,-5.10068 24.341435,7.219928 z" /><g
id="g98" id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path100" id="path100"
d="m -5874.2073,2171.5679 15.9931,0.04 0.9907,110.4919 -23.6673,0.203 6.6835,-110.7352 z" /></g><path d="m -5874.2073,2171.5679 15.9931,0.04 0.9907,110.4919 -23.6673,0.203 6.6835,-110.7352 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path102" id="path102"
d="m 113.87654,78.861881 c -1.59836,-0.376002 -3.16161,0.518672 -3.49011,1.997381 -0.32813,1.477553 0.70162,2.980148 2.30062,3.355122 1.59812,0.376002 3.16062,-0.519057 3.48987,-1.997766 0.32812,-1.477553 -0.70163,-2.979763 -2.30038,-3.354737" /><g d="m 113.87654,78.861881 c -1.59836,-0.376002 -3.16161,0.518672 -3.49011,1.997381 -0.32813,1.477553 0.70162,2.980148 2.30062,3.355122 1.59812,0.376002 3.16062,-0.519057 3.48987,-1.997766 0.32812,-1.477553 -0.70163,-2.979763 -2.30038,-3.354737" /><g
id="g104" id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path106" id="path106"
d="m -6133.9467,2130.5761 c 0,7.1785 5.8181,13 13.0008,12.9983 7.1756,0 12.9951,-5.8181 12.9934,-13 0.01,-7.177 -5.8169,-12.9952 -12.9988,-12.9988 -7.177,0 -12.9963,5.8218 -12.9954,13.0005 z" /></g><path d="m -6133.9467,2130.5761 c 0,7.1785 5.8181,13 13.0008,12.9983 7.1756,0 12.9951,-5.8181 12.9934,-13 0.01,-7.177 -5.8169,-12.9952 -12.9988,-12.9988 -7.177,0 -12.9963,5.8218 -12.9954,13.0005 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path108" id="path108"
d="m 112.72543,84.222731 c -0.22825,-0.05393 -0.56063,-0.120711 -0.77925,-0.179782 -0.9145,-0.251952 -1.57575,-0.625 -2.39738,-0.948608 -1.76886,-0.651968 -3.23399,-1.194782 -4.66048,-1.406283 -0.72462,-0.05907 -1.09312,0.293431 -1.49562,0.565672 l -1.78124,-4.859515 11.84483,3.443858 -0.73086,3.384658 z" /><g d="m 112.72543,84.222731 c -0.22825,-0.05393 -0.56063,-0.120711 -0.77925,-0.179782 -0.9145,-0.251952 -1.57575,-0.625 -2.39738,-0.948608 -1.76886,-0.651968 -3.23399,-1.194782 -4.66048,-1.406283 -0.72462,-0.05907 -1.09312,0.293431 -1.49562,0.565672 l -1.78124,-4.859515 11.84483,3.443858 -0.73086,3.384658 z" /><g
id="g110" id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path112" id="path112"
d="m 2265.6285,5497.4356 c 1.0922,0 2.6646,-0.046 3.7191,-0.012 4.4067,0.157 7.7848,1.0615 11.842,1.6055 8.6871,0.9856 15.8868,1.813 22.5785,1.3017 3.3494,-0.4609 4.6676,-2.2825 6.219,-3.8053 l 12.9892,18.4519 -57.2525,-2.7689 -0.095,-14.773 z" /></g><path d="m 2265.6285,5497.4356 c 1.0922,0 2.6646,-0.046 3.7191,-0.012 4.4067,0.157 7.7848,1.0615 11.842,1.6055 8.6871,0.9856 15.8868,1.813 22.5785,1.3017 3.3494,-0.4609 4.6676,-2.2825 6.219,-3.8053 l 12.9892,18.4519 -57.2525,-2.7689 -0.095,-14.773 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path114" id="path114"
d="m 113.91479,78.870998 c -0.22925,-0.05393 -0.55587,-0.142285 -0.778,-0.186074 -0.93086,-0.18081 -1.68386,-0.13869 -2.56111,-0.213556 -1.86837,-0.201741 -3.41749,-0.365857 -4.79237,-0.81069 -0.67811,-0.270187 -0.86136,-0.752388 -1.10836,-1.176931 l -3.65737,3.584088 12.12621,2.177548 0.771,-3.374385 z" /><g d="m 113.91479,78.870998 c -0.22925,-0.05393 -0.55587,-0.142285 -0.778,-0.186074 -0.93086,-0.18081 -1.68386,-0.13869 -2.56111,-0.213556 -1.86837,-0.201741 -3.41749,-0.365857 -4.79237,-0.81069 -0.67811,-0.270187 -0.86136,-0.752388 -1.10836,-1.176931 l -3.65737,3.584088 12.12621,2.177548 0.771,-3.374385 z" /><g
id="g116" id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path118" id="path118"
d="m 2265.6266,5520.8273 c 1.0955,0 2.6674,0.048 3.7204,0.015 4.4087,-0.1554 7.7848,-1.0642 11.8437,-1.6076 8.6865,-0.9822 15.8857,-1.8093 22.5766,-1.3005 3.3519,0.4629 4.6701,2.2867 6.2195,3.8092 l 12.9914,-18.4544 -57.255,2.7686 -0.097,14.7696 z" /></g><path d="m 2265.6266,5520.8273 c 1.0955,0 2.6674,0.048 3.7204,0.015 4.4087,-0.1554 7.7848,-1.0642 11.8437,-1.6076 8.6865,-0.9822 15.8857,-1.8093 22.5766,-1.3005 3.3519,0.4629 4.6701,2.2867 6.2195,3.8092 l 12.9914,-18.4544 -57.255,2.7686 -0.097,14.7696 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path120" id="path120"
d="M 82.060256,105.57792 85.151372,104.04 74.396776,80.580728 l -4.599487,2.22121 12.262967,22.775982 z" /><g d="M 82.060256,105.57792 85.151372,104.04 74.396776,80.580728 l -4.599487,2.22121 12.262967,22.775982 z" /><g
id="g122" id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path124" id="path124"
d="m -1704.3131,5602.1797 -15.9959,0.035 -1.0163,110.4899 23.6696,0.2089 -6.6574,-110.7337 z" /></g><path d="m -1704.3131,5602.1797 -15.9959,0.035 -1.0163,110.4899 23.6696,0.2089 -6.6574,-110.7337 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path126" id="path126"
d="m 87.255492,103.00832 -3.098367,1.52274 -11.14222,-23.266646 4.558863,-2.308276 9.681724,24.052182 z" /><g d="m 87.255492,103.00832 -3.098367,1.52274 -11.14222,-23.266646 4.558863,-2.308276 9.681724,24.052182 z" /><g
id="g128" id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path130" id="path130"
d="m -1731.1657,5602.1774 15.9936,0.038 0.9913,110.4894 -23.6685,0.2032 6.6836,-110.7309 z" /></g><path d="m -1731.1657,5602.1774 15.9936,0.038 0.9913,110.4894 -23.6685,0.2032 6.6836,-110.7309 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path132" id="path132"
d="m 91.200231,111.92345 c -0.712248,-1.518 -2.366619,-2.21581 -3.69674,-1.55832 -1.329872,0.65813 -1.831245,2.42179 -1.120122,3.93967 0.711248,1.51826 2.366619,2.21582 3.696115,1.55756 1.330496,-0.65698 1.83187,-2.42103 1.120747,-3.93891" /><g d="m 91.200231,111.92345 c -0.712248,-1.518 -2.366619,-2.21581 -3.69674,-1.55832 -1.329872,0.65813 -1.831245,2.42179 -1.120122,3.93967 0.711248,1.51826 2.366619,2.21582 3.696115,1.55756 1.330496,-0.65698 1.83187,-2.42103 1.120747,-3.93891" /><g
id="g134" id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path136" id="path136"
d="m -1806.2385,5560.6793 c 0,7.1805 5.8215,13.0009 13.0028,13.0031 7.1782,0 12.9977,-5.8221 12.9983,-13.0005 0,-7.1799 -5.8204,-13.0003 -13,-12.9986 -7.1804,0 -13.0005,5.8176 -13.0011,12.996 z" /></g><path d="m -1806.2385,5560.6793 c 0,7.1805 5.8215,13.0009 13.0028,13.0031 7.1782,0 12.9977,-5.8221 12.9983,-13.0005 0,-7.1799 -5.8204,-13.0003 -13,-12.9986 -7.1804,0 -13.0005,5.8176 -13.0011,12.996 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path138" id="path138"
d="m 86.402244,114.3405 c -0.10175,-0.21728 -0.258999,-0.5242 -0.348999,-0.73787 -0.379124,-0.8907 -0.506749,-1.65439 -0.772873,-2.51606 -0.606623,-1.82698 -1.107247,-3.34241 -1.83537,-4.62002 -0.407499,-0.61883 -0.905748,-0.69601 -1.363496,-0.84933 l 2.587618,-4.46028 4.763362,11.66119 -3.030242,1.52237 z" /><g d="m 86.402244,114.3405 c -0.10175,-0.21728 -0.258999,-0.5242 -0.348999,-0.73787 -0.379124,-0.8907 -0.506749,-1.65439 -0.772873,-2.51606 -0.606623,-1.82698 -1.107247,-3.34241 -1.83537,-4.62002 -0.407499,-0.61883 -0.905748,-0.69601 -1.363496,-0.84933 l 2.587618,-4.46028 4.763362,11.66119 -3.030242,1.52237 z" /><g
id="g140" id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path142" id="path142"
d="m 5915.2105,1602.9556 c 1.093,5e-4 2.6634,-0.051 3.7187,-0.013 4.4056,0.1519 7.7811,1.0601 11.8386,1.6055 8.6885,0.9839 15.8874,1.8114 22.5786,1.3023 3.3522,-0.4658 4.6717,-2.2873 6.222,-3.8084 l 12.9909,18.4516 -57.2525,-2.7717 -0.096,-14.7668 z" /></g><path d="m 5915.2105,1602.9556 c 1.093,5e-4 2.6634,-0.051 3.7187,-0.013 4.4056,0.1519 7.7811,1.0601 11.8386,1.6055 8.6885,0.9839 15.8874,1.8114 22.5786,1.3023 3.3522,-0.4658 4.6717,-2.2873 6.222,-3.8084 l 12.9909,18.4516 -57.2525,-2.7717 -0.096,-14.7668 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path144" id="path144"
d="m 91.216106,111.95915 c -0.101625,-0.2174 -0.238124,-0.53445 -0.343374,-0.74044 -0.442499,-0.86013 -0.943873,-1.43864 -1.433871,-2.19026 -1.011998,-1.62613 -1.852495,-2.97296 -2.371869,-4.35433 -0.216874,-0.71309 0.03575,-1.16049 0.205125,-1.6242 l -5.008487,-0.70218 5.904609,11.09655 3.047867,-1.48514 z" /><g d="m 91.216106,111.95915 c -0.101625,-0.2174 -0.238124,-0.53445 -0.343374,-0.74044 -0.442499,-0.86013 -0.943873,-1.43864 -1.433871,-2.19026 -1.011998,-1.62613 -1.852495,-2.97296 -2.371869,-4.35433 -0.216874,-0.71309 0.03575,-1.16049 0.205125,-1.6242 l -5.008487,-0.70218 5.904609,11.09655 3.047867,-1.48514 z" /><g
id="g146" id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path148" id="path148"
d="m 5915.2102,1626.3454 c 1.093,5e-4 2.6634,0.049 3.719,0.015 4.4068,-0.1576 7.7814,-1.0642 11.8418,-1.6073 8.6876,-0.9845 15.8853,-1.8102 22.5771,-1.3051 3.3508,0.4632 4.6675,2.2868 6.2209,3.8126 l 12.9861,-18.4566 -57.2525,2.7734 -0.092,14.7677 z" /></g><path d="m 5915.2102,1626.3454 c 1.093,5e-4 2.6634,0.049 3.719,0.015 4.4068,-0.1576 7.7814,-1.0642 11.8418,-1.6073 8.6876,-0.9845 15.8853,-1.8102 22.5771,-1.3051 3.3508,0.4632 4.6675,2.2868 6.2209,3.8126 l 12.9861,-18.4566 -57.2525,2.7734 -0.092,14.7677 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path150" id="path150"
d="m 51.046089,102.96363 3.097242,1.52339 11.148595,-23.264855 -4.558738,-2.309303 -9.687099,24.050768 z" /><g d="m 51.046089,102.96363 3.097242,1.52339 11.148595,-23.264855 -4.558738,-2.309303 -9.687099,24.050768 z" /><g
id="g152" id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path154" id="path154"
d="m 3732.2325,4696.5302 -15.9925,0.033 -1.0145,110.4942 23.669,0.2069 -6.662,-110.7343 z" /></g><path d="m 3732.2325,4696.5302 -15.9925,0.033 -1.0145,110.4942 23.669,0.2069 -6.662,-110.7343 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path156" id="path156"
d="M 56.2402,105.53387 53.149459,103.9948 63.90968,80.538479 68.508542,82.761615 56.2402,105.53387 z" /><g d="M 56.2402,105.53387 53.149459,103.9948 63.90968,80.538479 68.508542,82.761615 56.2402,105.53387 z" /><g
id="g158" id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path160" id="path160"
d="m 3705.3831,4696.5288 15.9973,0.037 0.9887,110.4928 -23.6687,0.2009 6.6827,-110.7306 z" /></g><path d="m 3705.3831,4696.5288 15.9973,0.037 0.9887,110.4928 -23.6687,0.2009 6.6827,-110.7306 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path162" id="path162"
d="m 51.915337,114.26076 c 0.712123,-1.51788 0.210374,-3.2827 -1.118997,-3.93967 -1.329496,-0.65814 -2.984492,0.0385 -3.697115,1.55652 -0.711123,1.51788 -0.210125,3.28154 1.119372,3.94006 1.330121,0.65813 2.984492,-0.0398 3.69674,-1.55691" /><g d="m 51.915337,114.26076 c 0.712123,-1.51788 0.210374,-3.2827 -1.118997,-3.93967 -1.329496,-0.65814 -2.984492,0.0385 -3.697115,1.55652 -0.711123,1.51788 -0.210125,3.28154 1.119372,3.94006 1.330121,0.65813 2.984492,-0.0398 3.69674,-1.55691" /><g
id="g164" id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path166" id="path166"
d="m 3871.7606,4654.3567 c 8e-4,7.181 5.8243,13.003 13.0011,13.0008 7.1782,5e-4 12.9991,-5.8187 12.9997,-13.0006 0,-7.1784 -5.8195,-12.9982 -12.9994,-12.9982 -7.1819,-6e-4 -12.9974,5.8215 -13.0014,12.998 z" /></g><path d="m 3871.7606,4654.3567 c 8e-4,7.181 5.8243,13.003 13.0011,13.0008 7.1782,5e-4 12.9991,-5.8187 12.9997,-13.0006 0,-7.1784 -5.8195,-12.9982 -12.9994,-12.9982 -7.1819,-6e-4 -12.9974,5.8215 -13.0014,12.998 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path168" id="path168"
d="m 47.08435,111.91511 c 0.10175,-0.21805 0.237374,-0.53549 0.343374,-0.74161 0.442874,-0.85973 0.944247,-1.43812 1.433996,-2.18987 1.011872,-1.62639 1.85237,-2.97219 2.371869,-4.35471 0.216874,-0.71309 -0.03588,-1.16049 -0.204125,-1.62305 l 5.007362,-0.70334 -5.904109,11.09656 -3.048367,-1.48398 z" /><g d="m 47.08435,111.91511 c 0.10175,-0.21805 0.237374,-0.53549 0.343374,-0.74161 0.442874,-0.85973 0.944247,-1.43812 1.433996,-2.18987 1.011872,-1.62639 1.85237,-2.97219 2.371869,-4.35471 0.216874,-0.71309 -0.03588,-1.16049 -0.204125,-1.62305 l 5.007362,-0.70334 -5.904109,11.09656 -3.048367,-1.48398 z" /><g
id="g170" id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path172" id="path172"
d="m -4951.7391,3507.378 c -1.0975,0 -2.6668,0.053 -3.7224,0.017 -4.4065,-0.1571 -7.7837,-1.0644 -11.8432,-1.6058 -8.6862,-0.9848 -15.8811,-1.8114 -22.5771,-1.304 -3.3491,0.4626 -4.6666,2.2847 -6.2161,3.8075 l -12.992,-18.4507 57.2536,2.7686 0.097,14.7677 z" /></g><path d="m -4951.7391,3507.378 c -1.0975,0 -2.6668,0.053 -3.7224,0.017 -4.4065,-0.1571 -7.7837,-1.0644 -11.8432,-1.6058 -8.6862,-0.9848 -15.8811,-1.8114 -22.5771,-1.304 -3.3491,0.4626 -4.6666,2.2847 -6.2161,3.8075 l -12.992,-18.4507 57.2536,2.7686 0.097,14.7677 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path174" id="path174"
d="m 51.897212,114.29685 c 0.10275,-0.21742 0.258999,-0.52575 0.350124,-0.73788 0.378374,-0.89223 0.506624,-1.65593 0.772373,-2.5176 0.606998,-1.82697 1.107622,-3.34125 1.83587,-4.62001 0.407749,-0.61885 0.905248,-0.69487 1.362996,-0.84781 l -2.587618,-4.46092 -4.763612,11.66043 3.029867,1.52379 z" /><g d="m 51.897212,114.29685 c 0.10275,-0.21742 0.258999,-0.52575 0.350124,-0.73788 0.378374,-0.89223 0.506624,-1.65593 0.772373,-2.5176 0.606998,-1.82697 1.107622,-3.34125 1.83587,-4.62001 0.407749,-0.61885 0.905248,-0.69487 1.362996,-0.84781 l -2.587618,-4.46092 -4.763612,11.66043 3.029867,1.52379 z" /><g
id="g176" id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path178" id="path178"
d="m -4951.7379,3483.9904 c -1.0962,0 -2.6697,-0.048 -3.7205,-0.015 -4.4084,0.1573 -7.7868,1.0636 -11.8437,1.607 -8.6876,0.9856 -15.8839,1.8108 -22.5782,1.3033 -3.3517,-0.4643 -4.6684,-2.2869 -6.2195,-3.8094 l -12.989,18.4538 57.2514,-2.7692 0.1,-14.7702 z" /></g><path d="m -4951.7379,3483.9904 c -1.0962,0 -2.6697,-0.048 -3.7205,-0.015 -4.4084,0.1573 -7.7868,1.0636 -11.8437,1.607 -8.6876,0.9856 -15.8839,1.8108 -22.5782,1.3033 -3.3517,-0.4643 -4.6684,-2.2869 -6.2195,-3.8094 l -12.989,18.4538 57.2514,-2.7692 0.1,-14.7702 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path180" id="path180"
d="m 33.681885,76.408495 0.771618,3.437694 24.65644,-5.550521 -1.084998,-5.101579 -24.34306,7.214406 z" /><g d="m 33.681885,76.408495 0.771618,3.437694 24.65644,-5.550521 -1.084998,-5.101579 -24.34306,7.214406 z" /><g
id="g182" id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path184" id="path184"
d="m 6368.633,136.4414 -15.9914,0.0349 -1.0179,110.4945 23.6696,0.2061 -6.6603,-110.7355 z" /></g><path d="m 6368.633,136.4414 -15.9914,0.0349 -1.0179,110.4945 23.6696,0.2061 -6.6603,-110.7355 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path186" id="path186"
d="m 34.964132,82.183101 -0.755748,-3.441289 24.560059,-5.98264 1.175997,5.079491 -24.980308,4.344438 z" /><g d="m 34.964132,82.183101 -0.755748,-3.441289 24.560059,-5.98264 1.175997,5.079491 -24.980308,4.344438 z" /><g
id="g188" id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path190" id="path190"
d="m 6341.7858,136.44 15.9911,0.0369 0.9918,110.4913 -23.6678,0.2033 6.6849,-110.7315 z" /></g><path d="m 6341.7858,136.44 15.9911,0.0369 0.9918,110.4913 -23.6678,0.2033 6.6849,-110.7315 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path192" id="path192"
d="m 25.626907,84.150305 c 1.598996,-0.374975 2.628743,-1.876542 2.300244,-3.355123 -0.328499,-1.47858 -1.890745,-2.373383 -3.488741,-1.998408 -1.599116,0.373819 -2.629493,1.876413 -2.301364,3.355122 0.328499,1.478581 1.890735,2.372998 3.489861,1.998409" /><g d="m 25.626907,84.150305 c 1.598996,-0.374975 2.628743,-1.876542 2.300244,-3.355123 -0.328499,-1.47858 -1.890745,-2.373383 -3.488741,-1.998408 -1.599116,0.373819 -2.629493,1.876413 -2.301364,3.355122 0.328499,1.478581 1.890735,2.372998 3.489861,1.998409" /><g
id="g194" id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path196" id="path196"
d="m 6624.6812,93.8699 c 0,7.1801 5.8189,12.9977 12.9999,12.9968 7.1805,6e-4 13.0009,-5.8207 12.9983,-12.9966 0,-7.1795 -5.8178,-13.0025 -12.9991,-12.9999 -7.1805,-6e-4 -13.0006,5.8209 -12.9991,12.9997 z" /></g><path d="m 6624.6812,93.8699 c 0,7.1801 5.8189,12.9977 12.9999,12.9968 7.1805,6e-4 13.0009,-5.8207 12.9983,-12.9966 0,-7.1795 -5.8178,-13.0025 -12.9991,-12.9999 -7.1805,-6e-4 -13.0006,5.8209 -12.9991,12.9997 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path198" id="path198"
d="m 24.39978,78.806534 c 0.22863,-0.05265 0.555249,-0.1419 0.778508,-0.184919 0.929748,-0.18158 1.682746,-0.139332 2.559993,-0.214327 1.868365,-0.20097 3.418241,-0.365214 4.793357,-0.809662 0.677128,-0.270444 0.861128,-0.752774 1.108377,-1.177188 l 3.65636,3.5855 -12.125587,2.17498 -0.771008,-3.374384 z" /><g d="m 24.39978,78.806534 c 0.22863,-0.05265 0.555249,-0.1419 0.778508,-0.184919 0.929748,-0.18158 1.682746,-0.139332 2.559993,-0.214327 1.868365,-0.20097 3.418241,-0.365214 4.793357,-0.809662 0.677128,-0.270444 0.861128,-0.752774 1.108377,-1.177188 l 3.65636,3.5855 -12.125587,2.17498 -0.771008,-3.374384 z" /><g
id="g200" id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path202" id="path202"
d="m -100.5077,5985.5958 c -1.0914,0 -2.6643,0.049 -3.7197,0.011 -4.4061,-0.1513 -7.7822,-1.0601 -11.8411,-1.603 -8.686,-0.985 -15.8899,-1.8127 -22.5805,-1.3053 -3.3472,0.464 -4.6684,2.2887 -6.2178,3.8114 l -12.987,-18.4558 57.2485,2.7726 0.0976,14.7696 z" /></g><path d="m -100.5077,5985.5958 c -1.0914,0 -2.6643,0.049 -3.7197,0.011 -4.4061,-0.1513 -7.7822,-1.0601 -11.8411,-1.603 -8.686,-0.985 -15.8899,-1.8127 -22.5805,-1.3053 -3.3472,0.464 -4.6684,2.2887 -6.2178,3.8114 l -12.987,-18.4558 57.2485,2.7726 0.0976,14.7696 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path204" id="path204"
d="m 25.588537,84.158652 c 0.229249,-0.05394 0.560618,-0.119427 0.779988,-0.179782 0.913747,-0.251182 1.574996,-0.624359 2.396623,-0.947967 1.768496,-0.651967 3.233622,-1.194653 4.660488,-1.406154 0.724628,-0.05907 1.093877,0.29343 1.495616,0.565287 l 1.780875,-4.85913 -11.843468,3.443858 0.729878,3.383888 z" /><g d="m 25.588537,84.158652 c 0.229249,-0.05394 0.560618,-0.119427 0.779988,-0.179782 0.913747,-0.251182 1.574996,-0.624359 2.396623,-0.947967 1.768496,-0.651967 3.233622,-1.194653 4.660488,-1.406154 0.724628,-0.05907 1.093877,0.29343 1.495616,0.565287 l 1.780875,-4.85913 -11.843468,3.443858 0.729878,3.383888 z" /><g
id="g206" id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path208" id="path208"
d="m -100.5077,5962.2049 c -1.0956,0 -2.6652,-0.052 -3.7219,-0.014 -4.4028,0.1551 -7.7792,1.0599 -11.8381,1.6036 -8.687,0.9862 -15.8862,1.8125 -22.5785,1.3028 -3.3494,-0.4606 -4.6721,-2.2844 -6.2206,-3.8052 l -12.9884,18.4524 57.2491,-2.772 0.0984,-14.7674 z" /></g><path d="m -100.5077,5962.2049 c -1.0956,0 -2.6652,-0.052 -3.7219,-0.014 -4.4028,0.1551 -7.7792,1.0599 -11.8381,1.6036 -8.687,0.9862 -15.8862,1.8125 -22.5785,1.3028 -3.3494,-0.4606 -4.6721,-2.2844 -6.2206,-3.8052 l -12.9884,18.4524 57.2491,-2.772 0.0984,-14.7674 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path210" id="path210"
d="M 43.009986,45.898287 40.874742,48.661155 60.471689,65.004263 63.67693,60.953126 43.009986,45.898287 z" /><g d="M 43.009986,45.898287 40.874742,48.661155 60.471689,65.004263 63.67693,60.953126 43.009986,45.898287 z" /><g
id="g212" id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path214" id="path214"
d="m -4219.3791,4644.5956 15.993,-0.032 1.0131,-110.4936 -23.6625,-0.2061 6.6564,110.7318 z" /></g><path d="m -4219.3791,4644.5956 15.993,-0.032 1.0131,-110.4936 -23.6625,-0.2061 6.6564,110.7318 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path216" id="path216"
d="M 39.414246,50.52858 41.56249,47.775856 61.427311,63.772112 58.29532,67.883219 39.414246,50.52858 z" /><g d="M 39.414246,50.52858 41.56249,47.775856 61.427311,63.772112 58.29532,67.883219 39.414246,50.52858 z" /><g
id="g218" id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.41159999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path220" id="path220"
d="m -4192.5257,4644.6018 -15.9973,-0.04 -0.9896,-110.4882 23.665,-0.2044 -6.6781,110.7329 z" /></g><path d="m -4192.5257,4644.6018 -15.9973,-0.04 -0.9896,-110.4882 23.665,-0.2044 -6.6781,110.7329 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path222" id="path222"
d="m 32.095139,44.254692 c 1.282377,1.050185 3.068122,0.941417 3.98799,-0.243862 0.920497,-1.18515 0.627128,-2.998768 -0.654119,-4.04921 -1.282246,-1.050571 -3.067751,-0.941417 -3.988619,0.243861 -0.920247,1.185536 -0.627248,2.998384 0.654748,4.049211" /><g d="m 32.095139,44.254692 c 1.282377,1.050185 3.068122,0.941417 3.98799,-0.243862 0.920497,-1.18515 0.627128,-2.998768 -0.654119,-4.04921 -1.282246,-1.050571 -3.067751,-0.941417 -3.988619,0.243861 -0.920247,1.185536 -0.627248,2.998384 0.654748,4.049211" /><g
id="g224" id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.2744;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path226" id="path226"
d="m -4379.2058,4686.834 c -3e-4,-7.1787 -5.8215,-12.9999 -12.9986,-12.9979 -7.179,-6e-4 -13.0014,5.8226 -13.0031,12.9988 0,7.1802 5.8215,13 13.0009,13.0005 7.1793,0 13.0022,-5.8192 13.0008,-13.0014 z" /></g><path d="m -4379.2058,4686.834 c -3e-4,-7.1787 -5.8215,-12.9999 -12.9986,-12.9979 -7.179,-6e-4 -13.0014,5.8226 -13.0031,12.9988 0,7.1802 5.8215,13 13.0009,13.0005 7.1793,0 13.0022,-5.8192 13.0008,-13.0014 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path228" id="path228"
d="m 35.39676,39.937863 c 0.18387,0.150375 0.454989,0.35751 0.626499,0.508527 0.717498,0.634503 1.155487,1.266052 1.758495,1.923542 1.319242,1.375976 2.40949,2.518236 3.605361,3.345234 0.628249,0.375617 1.108997,0.222416 1.586371,0.156539 l -0.447874,5.171951 -9.215846,-8.383248 2.086994,-2.722545 z" /><g d="m 35.39676,39.937863 c 0.18387,0.150375 0.454989,0.35751 0.626499,0.508527 0.717498,0.634503 1.155487,1.266052 1.758495,1.923542 1.319242,1.375976 2.40949,2.518236 3.605361,3.345234 0.628249,0.375617 1.108997,0.222416 1.586371,0.156539 l -0.447874,5.171951 -9.215846,-8.383248 2.086994,-2.722545 z" /><g
id="g230" id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path232" id="path232"
d="m 4985.5952,3965.326 c -1.0933,0 -2.6668,0.051 -3.7182,0.016 -4.4047,-0.1539 -7.7865,-1.065 -11.8409,-1.607 -8.6896,-0.985 -15.8882,-1.8124 -22.5799,-1.3033 -3.3489,0.4609 -4.6664,2.2841 -6.2192,3.8072 l -12.9867,-18.4533 57.2485,2.7743 0.096,14.7662 z" /></g><path d="m 4985.5952,3965.326 c -1.0933,0 -2.6668,0.051 -3.7182,0.016 -4.4047,-0.1539 -7.7865,-1.065 -11.8409,-1.607 -8.6896,-0.985 -15.8882,-1.8124 -22.5799,-1.3033 -3.3489,0.4609 -4.6664,2.2841 -6.2192,3.8072 l -12.9867,-18.4533 57.2485,2.7743 0.096,14.7662 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path234" id="path234"
d="m 32.065019,44.22888 c 0.18387,0.150375 0.440739,0.376002 0.622869,0.514434 0.761128,0.577615 1.457746,0.875412 2.216374,1.33437 1.597996,1.014229 2.924992,1.852913 3.97636,2.866629 0.495999,0.545382 0.457374,1.061871 0.501374,1.55396 l 4.808612,-1.598649 -10.005594,-7.366579 -2.119995,2.695835 z" /><g d="m 32.065019,44.22888 c 0.18387,0.150375 0.440739,0.376002 0.622869,0.514434 0.761128,0.577615 1.457746,0.875412 2.216374,1.33437 1.597996,1.014229 2.924992,1.852913 3.97636,2.866629 0.495999,0.545382 0.457374,1.061871 0.501374,1.55396 l 4.808612,-1.598649 -10.005594,-7.366579 -2.119995,2.695835 z" /><g
id="g236" id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill:none;stroke:#ffffff;stroke-width:0.26840001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="path238" id="path238"
d="m 4985.5975,3941.9365 c -1.0933,3e-4 -2.6654,-0.049 -3.7205,-0.014 -4.4053,0.154 -7.7836,1.0656 -11.8429,1.6047 -8.6839,0.9848 -15.887,1.8114 -22.5788,1.3028 -3.3485,-0.4637 -4.6672,-2.2867 -6.2183,-3.8063 l -12.9901,18.4504 57.2505,-2.7686 0.1001,-14.7688 z" /></g><path d="m 4985.5975,3941.9365 c -1.0933,3e-4 -2.6654,-0.049 -3.7205,-0.014 -4.4053,0.154 -7.7836,1.0656 -11.8429,1.6047 -8.6839,0.9848 -15.887,1.8114 -22.5788,1.3028 -3.3485,-0.4637 -4.6672,-2.2867 -6.2183,-3.8063 l -12.9901,18.4504 57.2505,-2.7686 0.1001,-14.7688 z" /></g><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path240" id="path240"
d="m 73.354779,57.337705 c 0.0535,1.289039 1.085247,2.317393 2.352994,2.317393 0.519498,0 0.998497,-0.171435 1.387621,-0.463067 l 0.611248,0.299209 -1.251121,2.65731 -5.482236,-2.716253 1.244747,-2.657696 1.136747,0.563104 z" /><path d="m 73.354779,57.337705 c 0.0535,1.289039 1.085247,2.317393 2.352994,2.317393 0.519498,0 0.998497,-0.171435 1.387621,-0.463067 l 0.611248,0.299209 -1.251121,2.65731 -5.482236,-2.716253 1.244747,-2.657696 1.136747,0.563104 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path242" id="path242"
d="m 82.303005,65.916787 c -0.947873,0.846389 -1.086747,2.317778 -0.297374,3.335089 0.323874,0.417223 0.753373,0.694987 1.218246,0.825971 l 0.153375,0.677779 -2.802742,0.651583 -1.350997,-6.096802 2.799118,-0.657361 0.280374,1.263741 z" /><path d="m 82.303005,65.916787 c -0.947873,0.846389 -1.086747,2.317778 -0.297374,3.335089 0.323874,0.417223 0.753373,0.694987 1.218246,0.825971 l 0.153375,0.677779 -2.802742,0.651583 -1.350997,-6.096802 2.799118,-0.657361 0.280374,1.263741 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path244" id="path244"
d="m 81.362632,78.447226 c -1.234246,-0.233589 -2.440618,0.571194 -2.722742,1.840842 -0.115875,0.519827 -0.0595,1.038885 0.131124,1.49322 l -0.420248,0.545639 -2.243994,-1.844437 3.798489,-4.885841 2.244994,1.837889 -0.787623,1.012688 z" /><path d="m 81.362632,78.447226 c -1.234246,-0.233589 -2.440618,0.571194 -2.722742,1.840842 -0.115875,0.519827 -0.0595,1.038885 0.131124,1.49322 l -0.420248,0.545639 -2.243994,-1.844437 3.798489,-4.885841 2.244994,1.837889 -0.787623,1.012688 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path246" id="path246"
d="m 71.240035,85.50047 c -0.591624,-1.137637 -1.95687,-1.6043 -3.097867,-1.039656 -0.467749,0.231149 -0.827373,0.599831 -1.055122,1.035932 l -0.677123,0 0.005,-2.951768 6.087483,0 0,2.94997 -1.261871,-0.001 z" /><path d="m 71.240035,85.50047 c -0.591624,-1.137637 -1.95687,-1.6043 -3.097867,-1.039656 -0.467749,0.231149 -0.827373,0.599831 -1.055122,1.035932 l -0.677123,0 0.005,-2.951768 6.087483,0 0,2.94997 -1.261871,-0.001 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path248" id="path248"
d="m 59.572316,81.726711 c 0.496124,-1.185664 7.5e-4,-2.572556 -1.141247,-3.137457 -0.467748,-0.231534 -0.971872,-0.290477 -1.445621,-0.200586 l -0.423874,-0.542685 2.248619,-1.836862 3.792365,4.891234 -2.244244,1.840072 -0.785998,-1.013716 z" /><path d="m 59.572316,81.726711 c 0.496124,-1.185664 7.5e-4,-2.572556 -1.141247,-3.137457 -0.467748,-0.231534 -0.971872,-0.290477 -1.445621,-0.200586 l -0.423874,-0.542685 2.248619,-1.836862 3.792365,4.891234 -2.244244,1.840072 -0.785998,-1.013716 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path250" id="path250"
d="m 55.117078,70.006576 c 1.210622,-0.34043 1.957245,-1.602373 1.675621,-2.87215 -0.11525,-0.519827 -0.384874,-0.961707 -0.748748,-1.286727 l 0.148124,-0.67855 2.800243,0.6607 -1.358122,6.09616 -2.799242,-0.655306 0.282124,-1.264127 z" /><path d="m 55.117078,70.006576 c 1.210622,-0.34043 1.957245,-1.602373 1.675621,-2.87215 -0.11525,-0.519827 -0.384874,-0.961707 -0.748748,-1.286727 l 0.148124,-0.67855 2.800243,0.6607 -1.358122,6.09616 -2.799242,-0.655306 0.282124,-1.264127 z" /><path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path252" id="path252"
d="m 61.258562,59.140664 c 1.013747,0.760094 2.440368,0.572992 3.230491,-0.445089 0.323499,-0.416453 0.492499,-0.908671 0.512999,-1.403715 l 0.608498,-0.304217 1.241872,2.661933 -5.484986,2.709705 -1.246621,-2.657568 1.137747,-0.561049 z" /></svg> d="m 61.258562,59.140664 c 1.013747,0.760094 2.440368,0.572992 3.230491,-0.445089 0.323499,-0.416453 0.492499,-0.908671 0.512999,-1.403715 l 0.608498,-0.304217 1.241872,2.661933 -5.484986,2.709705 -1.246621,-2.657568 1.137747,-0.561049 z" /></svg>

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,150 +1,151 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>数据管理平台</title> <title>数据管理平台</title>
<base href='/'></base> <base href='/'></base>
<meta charset="UTF8" /> <meta charset="UTF8" />
<link rel="stylesheet" href="libs/bootstrap/dist/css/bootstrap.css" /> <link rel="stylesheet" href="libs/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="libs/patternfly/dist/css/patternfly.css" /> <link rel="stylesheet" href="libs/patternfly/dist/css/patternfly.css" />
<link rel="stylesheet" href="libs/patternfly/dist/css/patternfly-additions.css" /> <link rel="stylesheet" href="libs/patternfly/dist/css/patternfly-additions.css" />
<!--<link rel="stylesheet" type="text/css" href="style.css" /> <!--<link rel="stylesheet" type="text/css" href="style.css" />
<!-- bower:css --> <!-- bower:css -->
<link rel="stylesheet" href="libs/nvd3/build/nv.d3.css" /> <link rel="stylesheet" href="libs/nvd3/build/nv.d3.css" />
<link rel="stylesheet" href="libs/codemirror/lib/codemirror.css" /> <link rel="stylesheet" href="libs/codemirror/lib/codemirror.css" />
<link rel="stylesheet" href="libs/toastr/toastr.css" /> <link rel="stylesheet" href="libs/toastr/toastr.css" />
<link rel="stylesheet" href="libs/hawtio-ui/dist/OpenSans.css" /> <link rel="stylesheet" href="libs/hawtio-ui/dist/OpenSans.css" />
<link rel="stylesheet" href="libs/hawtio-ui/dist/DroidSansMono.css" /> <link rel="stylesheet" href="libs/hawtio-ui/dist/DroidSansMono.css" />
<link rel="stylesheet" href="libs/hawtio-ui/dist/ui.dynatree.css" /> <link rel="stylesheet" href="libs/hawtio-ui/dist/ui.dynatree.css" />
<link rel="stylesheet" href="libs/hawtio-ui/dist/dynatree-icons.css" /> <link rel="stylesheet" href="libs/hawtio-ui/dist/dynatree-icons.css" />
<link rel="stylesheet" href="libs/hawtio-ui/dist/hawtio-ui.css" /> <link rel="stylesheet" href="libs/hawtio-ui/dist/hawtio-ui.css" />
<link rel="stylesheet" href="libs/hawtio-forms/dist/hawtio-forms.css" /> <link rel="stylesheet" href="libs/hawtio-forms/dist/hawtio-forms.css" />
<link rel="stylesheet" href="libs/hawtio-forms/dist/bootstrap-combobox.css" /> <link rel="stylesheet" href="libs/hawtio-forms/dist/bootstrap-combobox.css" />
<link rel="stylesheet" href="libs/kubernetes-container-terminal/dist/container-terminal.css" /> <link rel="stylesheet" href="libs/kubernetes-container-terminal/dist/container-terminal.css" />
<!-- endbower --> <!-- endbower -->
<link rel="stylesheet" type="text/css" href="libs/angular-tree-control/css/tree-control-attribute.css"> <link rel="stylesheet" type="text/css" href="libs/angular-tree-control/css/tree-control-attribute.css">
<link rel="stylesheet" href="dist/hawtio-kubernetes.css" /> <link rel="stylesheet" href="dist/hawtio-kubernetes.css" />
<link rel="stylesheet" type="text/css" href="new/sj_style.css">
<!-- bower:js -->
<script src="libs/jquery/dist/jquery.js"></script> <!-- bower:js -->
<script src="libs/angular/angular.js"></script> <script src="libs/jquery/dist/jquery.js"></script>
<script src="libs/d3/d3.js"></script> <script src="libs/angular/angular.js"></script>
<script src="libs/angular-nvd3/dist/angular-nvd3.js"></script> <script src="libs/d3/d3.js"></script>
<script src="libs/angular-resource/angular-resource.js"></script> <script src="libs/angular-nvd3/dist/angular-nvd3.js"></script>
<script src="libs/codemirror/lib/codemirror.js"></script> <script src="libs/angular-resource/angular-resource.js"></script>
<script src="libs/angular-ui-codemirror/ui-codemirror.js"></script> <script src="libs/codemirror/lib/codemirror.js"></script>
<script src="libs/angular-ui-validate/dist/validate.js"></script> <script src="libs/angular-ui-codemirror/ui-codemirror.js"></script>
<script src="libs/angularjs-scroll-glue/src/scrollglue.js"></script> <script src="libs/angular-ui-validate/dist/validate.js"></script>
<script src="libs/angular-sanitize/angular-sanitize.js"></script> <script src="libs/angularjs-scroll-glue/src/scrollglue.js"></script>
<script src="libs/js-logger/src/logger.js"></script> <script src="libs/angular-sanitize/angular-sanitize.js"></script>
<script src="libs/hawtio-core/dist/hawtio-core.js"></script> <script src="libs/js-logger/src/logger.js"></script>
<script src="libs/lodash/lodash.js"></script> <script src="libs/hawtio-core/dist/hawtio-core.js"></script>
<script src="libs/angular-route/angular-route.js"></script> <script src="libs/lodash/lodash.js"></script>
<script src="libs/urijs/src/URI.js"></script> <script src="libs/angular-route/angular-route.js"></script>
<script src="libs/hawtio-core-navigation/dist/hawtio-core-navigation.js"></script> <script src="libs/urijs/src/URI.js"></script>
<script src="libs/human-date/humandate.js"></script> <script src="libs/hawtio-core-navigation/dist/hawtio-core-navigation.js"></script>
<script src="libs/humanize-duration/humanize-duration.js"></script> <script src="libs/human-date/humandate.js"></script>
<script src="libs/hawtio-utilities/dist/angular-file-upload.js"></script> <script src="libs/humanize-duration/humanize-duration.js"></script>
<script src="libs/hawtio-utilities/dist/hawtio-utilities.js"></script> <script src="libs/hawtio-utilities/dist/angular-file-upload.js"></script>
<script src="libs/graphlib/dist/graphlib.core.js"></script> <script src="libs/hawtio-utilities/dist/hawtio-utilities.js"></script>
<script src="libs/dagre/dist/dagre.core.js"></script> <script src="libs/graphlib/dist/graphlib.core.js"></script>
<script src="libs/dagre/dist/dagre.core.min.js"></script> <script src="libs/dagre/dist/dagre.core.js"></script>
<script src="libs/zeroclipboard/dist/ZeroClipboard.js"></script> <script src="libs/dagre/dist/dagre.core.min.js"></script>
<script src="libs/toastr/toastr.js"></script> <script src="libs/zeroclipboard/dist/ZeroClipboard.js"></script>
<script src="libs/hawtio-ui/dist/jquery-ui.custom.js"></script> <script src="libs/toastr/toastr.js"></script>
<script src="libs/hawtio-ui/dist/ui-bootstrap.js"></script> <script src="libs/hawtio-ui/dist/jquery-ui.custom.js"></script>
<script src="libs/hawtio-ui/dist/ui-bootstrap-tpls.js"></script> <script src="libs/hawtio-ui/dist/ui-bootstrap.js"></script>
<script src="libs/hawtio-ui/dist/transition.js"></script> <script src="libs/hawtio-ui/dist/ui-bootstrap-tpls.js"></script>
<script src="libs/hawtio-ui/dist/dialog.js"></script> <script src="libs/hawtio-ui/dist/transition.js"></script>
<script src="libs/hawtio-ui/dist/modal.js"></script> <script src="libs/hawtio-ui/dist/dialog.js"></script>
<script src="libs/hawtio-ui/dist/jquery.jsPlumb-custom.js"></script> <script src="libs/hawtio-ui/dist/modal.js"></script>
<script src="libs/hawtio-ui/dist/jquery.dynatree.js"></script> <script src="libs/hawtio-ui/dist/jquery.jsPlumb-custom.js"></script>
<script src="libs/hawtio-ui/dist/marked.js"></script> <script src="libs/hawtio-ui/dist/jquery.dynatree.js"></script>
<script src="libs/hawtio-ui/dist/d3.js"></script> <script src="libs/hawtio-ui/dist/marked.js"></script>
<script src="libs/hawtio-ui/dist/tabbable.js"></script> <script src="libs/hawtio-ui/dist/d3.js"></script>
<script src="libs/hawtio-ui/dist/hawtio-ui.js"></script> <script src="libs/hawtio-ui/dist/tabbable.js"></script>
<script src="libs/hawtio-forms/dist/jsdiff.js"></script> <script src="libs/hawtio-ui/dist/hawtio-ui.js"></script>
<script src="libs/hawtio-forms/dist/hawtio-forms.js"></script> <script src="libs/hawtio-forms/dist/jsdiff.js"></script>
<script src="libs/hawtio-forms/dist/bootstrap-combobox.js"></script> <script src="libs/hawtio-forms/dist/hawtio-forms.js"></script>
<script src="libs/hawtio-template-cache/dist/hawtio-template-cache.js"></script> <script src="libs/hawtio-forms/dist/bootstrap-combobox.js"></script>
<script src="libs/keycloak/dist/keycloak.js"></script> <script src="libs/hawtio-template-cache/dist/hawtio-template-cache.js"></script>
<script src="libs/ng-idle/angular-idle.js"></script> <script src="libs/keycloak/dist/keycloak.js"></script>
<script src="libs/hawtio-oauth/dist/hawtio-oauth.js"></script> <script src="libs/ng-idle/angular-idle.js"></script>
<script src="libs/term.js/src/term.js"></script> <script src="libs/hawtio-oauth/dist/hawtio-oauth.js"></script>
<script src="libs/kubernetes-container-terminal/dist/container-terminal.js"></script> <script src="libs/term.js/src/term.js"></script>
<script src="libs/hawtio-kubernetes-api/dist/smokesignals.unminified.js"></script> <script src="libs/kubernetes-container-terminal/dist/container-terminal.js"></script>
<script src="libs/hawtio-kubernetes-api/dist/hawtio-kubernetes-api.js"></script> <script src="libs/hawtio-kubernetes-api/dist/smokesignals.unminified.js"></script>
<script src="libs/js-yaml/dist/js-yaml.js"></script> <script src="libs/hawtio-kubernetes-api/dist/hawtio-kubernetes-api.js"></script>
<!-- endbower --> <script src="libs/js-yaml/dist/js-yaml.js"></script>
<!-- endbower -->
<script type="text/javascript" src="libs/codemirror/addon/edit/closetag.js"></script>
<script type="text/javascript" src="libs/codemirror/addon/edit/continuelist.js"></script> <script type="text/javascript" src="libs/codemirror/addon/edit/closetag.js"></script>
<script type="text/javascript" src="libs/codemirror/addon/edit/matchbrackets.js"></script> <script type="text/javascript" src="libs/codemirror/addon/edit/continuelist.js"></script>
<script type="text/javascript" src="libs/codemirror/addon/fold/foldcode.js"></script> <script type="text/javascript" src="libs/codemirror/addon/edit/matchbrackets.js"></script>
<script type="text/javascript" src="libs/codemirror/addon/fold/brace-fold.js"></script> <script type="text/javascript" src="libs/codemirror/addon/fold/foldcode.js"></script>
<script type="text/javascript" src="libs/codemirror/addon/fold/xml-fold.js"></script> <script type="text/javascript" src="libs/codemirror/addon/fold/brace-fold.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/javascript/javascript.js"></script> <script type="text/javascript" src="libs/codemirror/addon/fold/xml-fold.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/xml/xml.js"></script> <script type="text/javascript" src="libs/codemirror/mode/javascript/javascript.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/css/css.js"></script> <script type="text/javascript" src="libs/codemirror/mode/xml/xml.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/htmlmixed/htmlmixed.js"></script> <script type="text/javascript" src="libs/codemirror/mode/css/css.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/markdown/markdown.js"></script> <script type="text/javascript" src="libs/codemirror/mode/htmlmixed/htmlmixed.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/diff/diff.js"></script> <script type="text/javascript" src="libs/codemirror/mode/markdown/markdown.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/properties/properties.js"></script> <script type="text/javascript" src="libs/codemirror/mode/diff/diff.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/clike/clike.js"></script> <script type="text/javascript" src="libs/codemirror/mode/properties/properties.js"></script>
<script type="text/javascript" src="libs/codemirror/mode/yaml/yaml.js"></script> <script type="text/javascript" src="libs/codemirror/mode/clike/clike.js"></script>
<!-- link for js when using the tree as --> <script type="text/javascript" src="libs/codemirror/mode/yaml/yaml.js"></script>
<script type="text/javascript" src="libs/angular-tree-control/angular-tree-control.js"></script> <!-- link for js when using the tree as -->
<script type="text/javascript" src="resumable.js"></script> <script type="text/javascript" src="libs/angular-tree-control/angular-tree-control.js"></script>
<script type="text/javascript" src="resumable.js"></script>
<script src="libs/bootstrap/dist/js/bootstrap.js"></script>
<script src="libs/patternfly/dist/js/patternfly.js"></script> <script src="libs/bootstrap/dist/js/bootstrap.js"></script>
<script src="libs/hawtio-extension-service/dist/hawtio-extension-service.js"></script> <script src="libs/patternfly/dist/js/patternfly.js"></script>
<script src="libs/hawtio-preferences/dist/hawtio-preferences.js"></script> <script src="libs/hawtio-extension-service/dist/hawtio-extension-service.js"></script>
<script src="libs/hawtio-preferences/dist/hawtio-preferences.js"></script>
<!-- NOTE we need to make sure this is loaded much later than d3.js! -->
<script src="libs/nvd3/build/nv.d3.js"></script> <!-- NOTE we need to make sure this is loaded much later than d3.js! -->
<script src="libs/nvd3/build/nv.d3.js"></script>
<style>
.navbar-brand > img { <style>
height: 20px; .navbar-brand > img {
margin-top: -5px; height: 20px;
margin-bottom: -5px; margin-top: -5px;
} margin-bottom: -5px;
}
body {
/* overwrite a top-padding from site-base.css in hawtio-ui */ body {
padding-top: inherit; /* overwrite a top-padding from site-base.css in hawtio-ui */
} padding-top: inherit;
.breadcrumb { }
/* overwrite the bottom padding from pf's breadcrumb class */ .breadcrumb {
margin-bottom: 0; /* overwrite the bottom padding from pf's breadcrumb class */
} margin-bottom: 0;
.wiki-icon-view { }
border-radius: 0; .wiki-icon-view {
border: none; border-radius: 0;
} border: none;
.kubernetes-view .row.filter-header { }
margin-top: 1em; .kubernetes-view .row.filter-header {
} margin-top: 1em;
</style> }
</style>
</head>
</head>
<body style="padding-top: 75px;">
<nav class="navbar navbar-fixed-top navbar-pf" role="navigation"> <body >
<a href="/" class="log fl"><img src="/" class="log-img"></a> <nav class="navbar navbar-fixed-top navbar-pf sj_header " role="navigation" >
<ul class="nav navbar-nav navbar-primary" hawtio-main-nav></ul> <a href="/" class="log fl sj_logo" ><img src="new/images/logo.png" class="log-img" ></a>
</nav> <ul class="nav navbar-nav navbar-primary sj_topnav" hawtio-main-nav></ul>
<platform-sub-tabs-outlet></platform-sub-tabs-outlet> </nav>
<div id="main" class="container-fluid container-pf-nav-pf-vertical container-pf-nav-pf-vertical-with-secondary content-margin" ng-controller="HawtioNav.ViewController" hawtio-main-outlet> <platform-sub-tabs-outlet></platform-sub-tabs-outlet>
<div class="row" ng-class="getClass()"> <div id="main" class="container-fluid container-pf-nav-pf-vertical container-pf-nav-pf-vertical-with-secondary content-margin" ng-controller="HawtioNav.ViewController" hawtio-main-outlet >
<hawtio-breadcrumbs-outlet></hawtio-breadcrumbs-outlet> <div class="row" ng-class="getClass()" >
<div ng-include src="viewPartial"></div> <hawtio-breadcrumbs-outlet></hawtio-breadcrumbs-outlet>
</div> <div ng-include src="viewPartial"></div>
</div> </div>
<script src="dist/hawtio-kubernetes.js"></script> </div>
</body> <script src="dist/hawtio-kubernetes.js"></script>
</html> </body>
</html>

Binary file not shown.

View File

@ -1,7 +1,7 @@
window.OPENSHIFT_CONFIG = { window.OPENSHIFT_CONFIG = {
auth: { auth: {
oauth_authorize_uri: "{{ .Env.OAUTH_AUTHORIZE_URI }}", oauth_authorize_uri: "{{ .Env.OAUTH_AUTHORIZE_URI }}",
oauth_client_id: "{{ .Env.OAUTH_CLIENT_ID }}", oauth_client_id: "{{ .Env.OAUTH_CLIENT_ID }}",
logout_uri: "", logout_uri: "",
} }
}; };

View File

@ -1,42 +1,42 @@
{ {
"name": "hawtio-kubernetes", "name": "hawtio-kubernetes",
"version": "2.0.0", "version": "2.0.0",
"devDependencies": { "devDependencies": {
"bower": "^1.3.12", "bower": "^1.3.12",
"del": "^2.2.0", "del": "^2.2.0",
"event-stream": "^3.1.7", "event-stream": "^3.1.7",
"gulp": "^3.8.10", "gulp": "^3.8.10",
"gulp-angular-templatecache": "^1.5.0", "gulp-angular-templatecache": "^1.5.0",
"gulp-concat": "^2.4.2", "gulp-concat": "^2.4.2",
"gulp-concat-filenames": "^1.0.0", "gulp-concat-filenames": "^1.0.0",
"gulp-filter": "^3.0.1", "gulp-filter": "^3.0.1",
"gulp-less": "^3.0.5", "gulp-less": "^3.0.5",
"gulp-load-plugins": "^0.8.0", "gulp-load-plugins": "^0.8.0",
"gulp-ng-annotate": "^1.1.0", "gulp-ng-annotate": "^1.1.0",
"gulp-notify": "^2.1.0", "gulp-notify": "^2.1.0",
"gulp-replace": "^0.5.4", "gulp-replace": "^0.5.4",
"gulp-sourcemaps": "^1.5.1", "gulp-sourcemaps": "^1.5.1",
"gulp-typescript": "^2.4.2", "gulp-typescript": "^2.4.2",
"gulp-watch": "^3.0.0", "gulp-watch": "^3.0.0",
"hawtio-node-backend": "^2.0.5", "hawtio-node-backend": "^2.0.5",
"stringify-object": "^2.0.0", "stringify-object": "^2.0.0",
"through2": "^0.6.3", "through2": "^0.6.3",
"underscore.string": "^2.4.0", "underscore.string": "^2.4.0",
"urijs": "^1.17.0", "urijs": "^1.17.0",
"url-join": "^0.0.1", "url-join": "^0.0.1",
"which": "^1.0.8", "which": "^1.0.8",
"wiredep": "^2.2.2", "wiredep": "^2.2.2",
"yargs": "^3.32.0" "yargs": "^3.32.0"
}, },
"dependencies": { "dependencies": {
"async": "^2.0.0-rc.6", "async": "^2.0.0-rc.6",
"connect-multiparty": "^2.0.0", "connect-multiparty": "^2.0.0",
"hawtio-node-backend": "^2.1.0", "hawtio-node-backend": "^2.1.0",
"k8s": "^0.2.7", "k8s": "^0.2.7",
"node-crontab": "0.0.8", "node-crontab": "0.0.8",
"oracledb": "^1.9.3", "oracledb": "^1.9.3",
"xml2js": "^0.4.16", "xml2js": "^0.4.16",
"xmldom": "^0.1.22", "xmldom": "^0.1.22",
"xpath.js": "^1.0.6" "xpath.js": "^1.0.6"
} }
} }

View File

@ -1,51 +1,51 @@
<div ng-controller="Kubernetes.BuildConfigController"> <div ng-controller="Kubernetes.BuildConfigController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" ng-show="model.tools.length"> <div class="col-md-12" ng-show="model.tools.length">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter tools..."></hawtio-filter> placeholder="Filter tools..."></hawtio-filter>
</span> </span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="entity.tools.length" class="align-center"> <div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p> <p class="alert alert-info">There are no tools currently available.</p>
</div> </div>
<div ng-show="entity.tools.length"> <div ng-show="entity.tools.length">
<div ng-hide="entity.tools.length" class="align-center"> <div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p> <p class="alert alert-info">There are no tools currently available.</p>
</div> </div>
<div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index"> <div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index">
<div class="row" <div class="row"
title="{{env.description}}"> title="{{env.description}}">
<div class="col-md-9"> <div class="col-md-9">
<a href="{{env.url}}"> <a href="{{env.url}}">
<h3> <h3>
<i class="{{env.iconClass}}"></i> <i class="{{env.iconClass}}"></i>
{{env.label}} {{env.label}}
</h3> </h3>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,87 +1,87 @@
<div class="inline-block environment-row" ng-controller="Developer.EnvironmentPanelController"> <div class="inline-block environment-row" ng-controller="Developer.EnvironmentPanelController">
<div class="panel-group"> <div class="panel-group">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h2 class="panel-title inline-block"> <h2 class="panel-title inline-block">
<a href="{{env.url}}" title="namespace: {{env.namespace}}"> <a href="{{env.url}}" title="namespace: {{env.namespace}}">
<!-- <i class="{{env.iconClass}}"></i>&nbsp; --> <!-- <i class="{{env.iconClass}}"></i>&nbsp; -->
{{env.label}} {{env.label}}
</a> </a>
</h2> </h2>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="environment-deploy-block" <div class="environment-deploy-block"
ng-repeat="(project, versions) in envVersions[env.namespace] | orderBy:'project' track by $index"> ng-repeat="(project, versions) in envVersions[env.namespace] | orderBy:'project' track by $index">
<div ng-repeat="(version, versionInfo) in versions.versions | orderBy:'version' track by $index"> <div ng-repeat="(version, versionInfo) in versions.versions | orderBy:'version' track by $index">
<div ng-repeat="(rcname, rc) in versionInfo.replicationControllers"> <div ng-repeat="(rcname, rc) in versionInfo.replicationControllers">
<div class="environment-deploy-version-and-pods"> <div class="environment-deploy-version-and-pods">
<a href="{{rc.$viewLink}}" ng-show="rc.$viewLink" <a href="{{rc.$viewLink}}" ng-show="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}"> title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i> <i class="fa fa-cubes"></i>
{{rc.$name}} {{rc.$name}}
: {{version}} : {{version}}
</a> </a>
<span ng-hide="rc.$viewLink" <span ng-hide="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}"> title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i> <i class="fa fa-cubes"></i>
{{rc.$name}} {{rc.$name}}
: {{version}} : {{version}}
</span> </span>
<span class="pull-right" ng-show="rc.$serviceLink.href"> <span class="pull-right" ng-show="rc.$serviceLink.href">
&nbsp; &nbsp;
&nbsp; &nbsp;
&nbsp; &nbsp;
<a target="test-service" href="{{rc.$serviceLink.href}}" title="Open this service in a new tab"> <a target="test-service" href="{{rc.$serviceLink.href}}" title="Open this service in a new tab">
<i class="fa fa-external-link"></i> <i class="fa fa-external-link"></i>
</a> </a>
</span> </span>
&nbsp; &nbsp;
&nbsp; &nbsp;
&nbsp; &nbsp;
<span class="pull-right"> <span class="pull-right">
<a ng-show="rc.$podCounters.podsLink" href="{{rc.$podCounters.podsLink}}" title="View pods"> <a ng-show="rc.$podCounters.podsLink" href="{{rc.$podCounters.podsLink}}" title="View pods">
<span ng-show="rc.$podCounters.ready" <span ng-show="rc.$podCounters.ready"
class="badge badge-success">{{rc.$podCounters.ready}}</span> class="badge badge-success">{{rc.$podCounters.ready}}</span>
<span ng-show="rc.$podCounters.valid" <span ng-show="rc.$podCounters.valid"
class="badge badge-info">{{rc.$podCounters.valid}}</span> class="badge badge-info">{{rc.$podCounters.valid}}</span>
<span ng-show="rc.$podCounters.waiting" class="badge">{{rc.$podCounters.waiting}}</span> <span ng-show="rc.$podCounters.waiting" class="badge">{{rc.$podCounters.waiting}}</span>
<span ng-show="rc.$podCounters.error" <span ng-show="rc.$podCounters.error"
class="badge badge-warning">{{rc.$podCounters.error}}</span> class="badge badge-warning">{{rc.$podCounters.error}}</span>
</a> </a>
</span> </span>
</div> </div>
<div class="environment-deploy-build-info"> <div class="environment-deploy-build-info">
<a href="{{rc.$buildUrl}}" target="builds" ng-show="rc.$buildUrl && rc.$buildId" class="=" <a href="{{rc.$buildUrl}}" target="builds" ng-show="rc.$buildUrl && rc.$buildId" class="="
title="View the build which created this Replication Controller"> title="View the build which created this Replication Controller">
<i class="fa fa-tasks"></i> <i class="fa fa-tasks"></i>
Build #{{rc.$buildId}} Build #{{rc.$buildId}}
</a> </a>
&nbsp; &nbsp;
&nbsp; &nbsp;
&nbsp; &nbsp;
<a href="{{rc.$gitUrl}}" target="git" ng-show="rc.$gitUrl" class="pull-right" <a href="{{rc.$gitUrl}}" target="git" ng-show="rc.$gitUrl" class="pull-right"
title="{{rc.$gitCommit}} title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}} {{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}} {{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}"> {{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i> <i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}} Commit {{rc.$gitCommit | limitTo:7}}
</a> </a>
<span ng-hide="rc.$gitUrl || !rc.$gitCommit" class="pull-right" <span ng-hide="rc.$gitUrl || !rc.$gitCommit" class="pull-right"
title="{{rc.$gitCommit}} title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}} {{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}} {{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}"> {{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i> <i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}} Commit {{rc.$gitCommit | limitTo:7}}
</span> </span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,100 +1,100 @@
<div class="project-dashboard" ng-controller="Developer.ProjectController" hawtio-card-bg> <div class="project-dashboard" ng-controller="Developer.ProjectController" hawtio-card-bg>
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
<div hawtio-tabs></div> <div hawtio-tabs></div>
<!-- <!--
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" ng-show="model.environments.length"> <div class="col-md-12" ng-show="model.environments.length">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter environments..."></hawtio-filter> placeholder="Filter environments..."></hawtio-filter>
</span> </span>
</div> </div>
</div> </div>
--> -->
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="align-center"> <div class="align-center">
<div class="spinner spinner-lg"></div> <div class="spinner spinner-lg"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched" style="float: none; position: static;"> <div ng-show="model.fetched" style="float: none; position: static;">
<!-- <!--
<div class="row page-header-row"> <div class="row page-header-row">
<div class="col-md-12"> <div class="col-md-12">
<h1 class="inline-block">{{id}}</h1> <h1 class="inline-block">{{id}}</h1>
</div> </div>
</div> </div>
--> -->
<!-- <!--
<div class="pull-right"> <div class="pull-right">
<a href="{{entity.$build.url}}" class="btn btn-default" target="browse"> <a href="{{entity.$build.url}}" class="btn btn-default" target="browse">
<i class="{{entity.$build.iconClass}}"></i> <i class="{{entity.$build.iconClass}}"></i>
{{entity.$build.label}} {{entity.$build.label}}
</a> </a>
</div> </div>
--> -->
<div class="row row-cards-pf" title="{{env.description}}"> <div class="row row-cards-pf" title="{{env.description}}">
<div class="col-md-12 environment-rows"> <div class="col-md-12 environment-rows">
<div class="card-pf"> <div class="card-pf">
<div class="card-pf-heading"> <div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Environments Overview</h2> <h2 class="card-pf-title inline-block">Environments Overview</h2>
</div> </div>
<div class="card-pf-body"> <div class="card-pf-body">
<div ng-hide="entity.environments.length"> <div ng-hide="entity.environments.length">
<div class="row"> <div class="row">
<div class="col-md-12 align-center"> <div class="col-md-12 align-center">
<h2>No Environment Available</h2> <h2>No Environment Available</h2>
<p>Environment is a logical place where deployments happen which maps to a kubernetes / openshift namespace. You will see environments here after you add a build.</p> <p>Environment is a logical place where deployments happen which maps to a kubernetes / openshift namespace. You will see environments here after you add a build.</p>
<a class="btn btn-primary" ng-href="{{settingsLink}}"><i class="fa fa-plus"></i> New Build</a> <a class="btn btn-primary" ng-href="{{settingsLink}}"><i class="fa fa-plus"></i> New Build</a>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="entity.environments.length"> <div ng-show="entity.environments.length">
<div ng-repeat="env in entity.environments | filter:filterTemplates track by $index" <div ng-repeat="env in entity.environments | filter:filterTemplates track by $index"
class="inline-block environment-block" ng-include="'plugins/developer/html/environmentPanel.html'"> class="inline-block environment-block" ng-include="'plugins/developer/html/environmentPanel.html'">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row row-cards-pf"> <div class="row row-cards-pf">
<div class="col-md-12"> <div class="col-md-12">
<div class="card-pf pipeline"> <div class="card-pf pipeline">
<div class="card-pf-heading no-border"> <div class="card-pf-heading no-border">
<h2 class="card-pf-title inline-block">Active Pipelines</h4> <h2 class="card-pf-title inline-block">Active Pipelines</h4>
<a ng-href="{{$projectLink}}/jenkinsJob/{{jobId}}/pipelines">View All Pipelines >></a> <a ng-href="{{$projectLink}}/jenkinsJob/{{jobId}}/pipelines">View All Pipelines >></a>
</div> </div>
<div class="card-pf-body no-top-margin"> <div class="card-pf-body no-top-margin">
<div class="full-card-width" ng-controller="Developer.PipelinesController" ng-include="'plugins/kubernetes/html/pendingPipelines.html'"></div> <div class="full-card-width" ng-controller="Developer.PipelinesController" ng-include="'plugins/kubernetes/html/pendingPipelines.html'"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row row-cards-pf"> <div class="row row-cards-pf">
<div class="col-md-12"> <div class="col-md-12">
<div class="card-pf"> <div class="card-pf">
<div class="card-pf-heading"> <div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Commits</h2> <h2 class="card-pf-title inline-block">Commits</h2>
<a ng-href="{{$projectLink}}/wiki/history//">View All Commits >></a> <a ng-href="{{$projectLink}}/wiki/history//">View All Commits >></a>
</div> </div>
<div class="card-pf-body"> <div class="card-pf-body">
<div ng-include="'plugins/wiki/html/projectCommitsPanel.html'"></div> <div ng-include="'plugins/wiki/html/projectCommitsPanel.html'"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,38 +1,38 @@
<div ng-controller="Developer.HomeController"> <div ng-controller="Developer.HomeController">
<div class="jumbotron"> <div class="jumbotron">
<h1>Perspectives</h1> <h1>Perspectives</h1>
<p> <p>
Please choose the perspective you would like to use: Please choose the perspective you would like to use:
</p> </p>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<p class="text-center"> <p class="text-center">
<a class="btn btn-lg btn-primary" href="/workspaces" role="button" <a class="btn btn-lg btn-primary" href="/workspaces" role="button"
title="Create or work on Projects"> title="Create or work on Projects">
<i class="fa fa-tasks"></i> <i class="fa fa-tasks"></i>
&nbspDevelop » &nbspDevelop »
</a> </a>
</p> </p>
<p class="text-center"> <p class="text-center">
Work on projects and source code Work on projects and source code
</p> </p>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<p class="text-center"> <p class="text-center">
<a class="btn btn-lg btn-primary" href="/namespaces" role="button" <a class="btn btn-lg btn-primary" href="/namespaces" role="button"
title="Look around the various Namespaces at running Pods and Services"> title="Look around the various Namespaces at running Pods and Services">
<i class="fa fa-cubes"></i> <i class="fa fa-cubes"></i>
&nbsp;Operate » &nbsp;Operate »
</a> </a>
</p> </p>
<p class="text-center"> <p class="text-center">
Manage and run Pods and Services Manage and run Pods and Services
</p> </p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,10 +1,10 @@
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">{{operation}}?</h3> <h3 class="modal-title">{{operation}}?</h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
Are you sure you wish to {{operation}}? Are you sure you wish to {{operation}}?
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary" ng-click="ok()">{{operation}}</button> <button class="btn btn-primary" ng-click="ok()">{{operation}}</button>
<button class="btn btn-warning" ng-click="cancel()">Cancel</button> <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
</div> </div>

View File

@ -1,79 +1,79 @@
<div class="row" ng-controller="Developer.JenkinsJobController"> <div class="row" ng-controller="Developer.JenkinsJobController">
<script type="text/ng-template" id="jenkinsBuildIdTemplate.html"> <script type="text/ng-template" id="jenkinsBuildIdTemplate.html">
<div class="ngCellText" title="{{row.entity.fullDisplayName}} {{row.entity.result}}"> <div class="ngCellText" title="{{row.entity.fullDisplayName}} {{row.entity.result}}">
<a href="{{row.entity.$logsLink}}" title="View the build logs"> <a href="{{row.entity.$logsLink}}" title="View the build logs">
<i class="{{row.entity.$iconClass}}"></i>&nbsp;&nbsp;{{row.entity.displayName}} <i class="{{row.entity.$iconClass}}"></i>&nbsp;&nbsp;{{row.entity.displayName}}
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsBuildButtonsTemplate.html"> <script type="text/ng-template" id="jenkinsBuildButtonsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a class="btn btn-default" href="{{row.entity.$pipelineLink}}" ng-show="row.entity.$pipelineLink" target="View the pipeline for this build"> <a class="btn btn-default" href="{{row.entity.$pipelineLink}}" ng-show="row.entity.$pipelineLink" target="View the pipeline for this build">
<i class="fa fa-tasks"></i> Pipeline <i class="fa fa-tasks"></i> Pipeline
</a> </a>
&nbsp;&nbsp; &nbsp;&nbsp;
<a class="btn btn-default" href="{{row.entity.$logsLink}}" ng-show="row.entity.$logsLink" title="View the build logs"> <a class="btn btn-default" href="{{row.entity.$logsLink}}" ng-show="row.entity.$logsLink" title="View the build logs">
<i class="fa fa-tasks"></i> Logs <i class="fa fa-tasks"></i> Logs
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsBuildTimestampTemplate.html"> <script type="text/ng-template" id="jenkinsBuildTimestampTemplate.html">
<div class="ngCellText" title="Build started at: {{row.entity.$timestamp}}"> <div class="ngCellText" title="Build started at: {{row.entity.$timestamp}}">
{{row.entity.$timestamp.relative()}} {{row.entity.$timestamp.relative()}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsBuildDurationTemplate.html"> <script type="text/ng-template" id="jenkinsBuildDurationTemplate.html">
<div class="ngCellText" title="Build took {{row.entity.$duration}} milliseconds"> <div class="ngCellText" title="Build took {{row.entity.$duration}} milliseconds">
{{row.entity.$duration.duration()}} {{row.entity.$duration.duration()}}
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="job.builds.length" <hawtio-filter ng-show="job.builds.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter builds..."></hawtio-filter> placeholder="Filter builds..."></hawtio-filter>
</span> </span>
<button ng-show="fetched" <button ng-show="fetched"
title="Delete this build history" title="Delete this build history"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="tableConfig.selectedItems.length == 0" ng-disabled="tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(tableConfig.selectedItems)"> ng-click="deletePrompt(tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<a class="btn btn-primary pull-right" ng-click="triggerBuild()" <a class="btn btn-primary pull-right" ng-click="triggerBuild()"
title="Trigger this build"> title="Trigger this build">
<i class="fa fa-play-circle-o"></i> Trigger</a> <i class="fa fa-play-circle-o"></i> Trigger</a>
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="job.builds.length" class="align-center"> <div ng-hide="job.builds.length" class="align-center">
<p class="alert alert-info">There are no builds in this job.</p> <p class="alert alert-info">There are no builds in this job.</p>
</div> </div>
<div ng-show="job.builds.length"> <div ng-show="job.builds.length">
<table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table> <table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,97 +1,97 @@
<div class="row" ng-controller="Developer.JenkinsJobsController"> <div class="row" ng-controller="Developer.JenkinsJobsController">
<script type="text/ng-template" id="jenkinsJobNameTemplate.html"> <script type="text/ng-template" id="jenkinsJobNameTemplate.html">
<div class="ngCellText" title="{{row.entity.fullDisplayName}} {{row.entity.result}}"> <div class="ngCellText" title="{{row.entity.fullDisplayName}} {{row.entity.result}}">
<a href="{{row.entity.$buildsLink}}"> <a href="{{row.entity.$buildsLink}}">
<i class="{{row.entity.$iconClass}}"></i>&nbsp;&nbsp;{{row.entity.displayName}} <i class="{{row.entity.$iconClass}}"></i>&nbsp;&nbsp;{{row.entity.displayName}}
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsJobButtonsTemplate.html"> <script type="text/ng-template" id="jenkinsJobButtonsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a class="btn btn-default" href="{{row.entity.$pipelinesLink}}" ng-show="row.entity.$pipelinesLink" title="View the pipelines for this build"> <a class="btn btn-default" href="{{row.entity.$pipelinesLink}}" ng-show="row.entity.$pipelinesLink" title="View the pipelines for this build">
<i class="fa fa-tasks"></i> Pipelines <i class="fa fa-tasks"></i> Pipelines
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsBuildTimestampTemplate.html"> <script type="text/ng-template" id="jenkinsBuildTimestampTemplate.html">
<div class="ngCellText" title="Build started at: {{row.entity.$timestamp}}"> <div class="ngCellText" title="Build started at: {{row.entity.$timestamp}}">
{{row.entity.$timestamp.relative()}} {{row.entity.$timestamp.relative()}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsBuildDurationTemplate.html"> <script type="text/ng-template" id="jenkinsBuildDurationTemplate.html">
<div class="ngCellText" title="Build took {{row.entity.$duration}} milliseconds"> <div class="ngCellText" title="Build took {{row.entity.$duration}} milliseconds">
{{row.entity.$duration.duration()}} {{row.entity.$duration.duration()}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsLastSuccessTemplate.html"> <script type="text/ng-template" id="jenkinsLastSuccessTemplate.html">
<div class="ngCellText" ng-init="success=row.entity.lastSuccessfulBuild"> <div class="ngCellText" ng-init="success=row.entity.lastSuccessfulBuild">
<span title="Build took {{success.$duration.duration()}} milliseconds"> <span title="Build took {{success.$duration.duration()}} milliseconds">
<span ng-show="success"> <span ng-show="success">
{{success.$timestamp.relative()}} {{success.$timestamp.relative()}}
</span> </span>
<span ng-show="success.$buildLink"> <span ng-show="success.$buildLink">
- -
<a href="{{success.$buildLink}}" target="build" title="View the builds"> <a href="{{success.$buildLink}}" target="build" title="View the builds">
{{success.displayName}} {{success.displayName}}
</a> </a>
</span> </span>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="jenkinsLastFailureTemplate.html"> <script type="text/ng-template" id="jenkinsLastFailureTemplate.html">
<div class="ngCellText" ng-init="fail=row.entity.lastFailedBuild"> <div class="ngCellText" ng-init="fail=row.entity.lastFailedBuild">
<span title="Build took {{fail.$duration.duration()}} milliseconds"> <span title="Build took {{fail.$duration.duration()}} milliseconds">
<span ng-show="fail"> <span ng-show="fail">
{{fail.$timestamp.relative()}} {{fail.$timestamp.relative()}}
</span> </span>
<span ng-show="fail.$buildLink"> <span ng-show="fail.$buildLink">
- -
<a href="{{fail.$buildLink}}" target="build" title="View the builds"> <a href="{{fail.$buildLink}}" target="build" title="View the builds">
{{fail.displayName}} {{fail.displayName}}
</a> </a>
</span> </span>
</span> </span>
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="jenkins.jobs.length" <hawtio-filter ng-show="jenkins.jobs.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter jobs..."></hawtio-filter> placeholder="Filter jobs..."></hawtio-filter>
</span> </span>
<a class="btn btn-primary pull-right" ng-click="triggerBuild()" <a class="btn btn-primary pull-right" ng-click="triggerBuild()"
title="Trigger this build"> title="Trigger this build">
<i class="fa fa-play-circle-o"></i> Trigger</a> <i class="fa fa-play-circle-o"></i> Trigger</a>
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="jenkins.jobs.length" class="align-center"> <div ng-hide="jenkins.jobs.length" class="align-center">
<p class="alert alert-info">There are no jobs in this jenkins.</p> <p class="alert alert-info">There are no jobs in this jenkins.</p>
</div> </div>
<div ng-show="jenkins.jobs.length"> <div ng-show="jenkins.jobs.length">
<table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table> <table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,39 +1,39 @@
<div class="row" ng-controller="Developer.JenkinsLogController"> <div class="row" ng-controller="Developer.JenkinsLogController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-model="log.filterText" <hawtio-filter ng-model="log.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter logs..."></hawtio-filter> placeholder="Filter logs..."></hawtio-filter>
</span> </span>
<a class="btn btn-default pull-right" target="jenkins" href="{{$viewJenkinsLogLink}}" ng-show="$viewJenkinsLogLink" <a class="btn btn-default pull-right" target="jenkins" href="{{$viewJenkinsLogLink}}" ng-show="$viewJenkinsLogLink"
title="View this log inside Jenkins"> title="View this log inside Jenkins">
<i class="fa fa-external-link"></i> Log in Jenkins</a> <i class="fa fa-external-link"></i> Log in Jenkins</a>
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" target="jenkins" href="{{$viewJenkinsBuildLink}}" ng-show="$viewJenkinsBuildLink" <a class="btn btn-default pull-right" target="jenkins" href="{{$viewJenkinsBuildLink}}" ng-show="$viewJenkinsBuildLink"
title="View this build inside Jenkins"> title="View this build inside Jenkins">
<i class="fa fa-external-link"></i> Build in Jenkins</a> <i class="fa fa-external-link"></i> Build in Jenkins</a>
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="log-window" viewport-height scroll-glue> <div class="log-window" viewport-height scroll-glue>
<div class="log-window-inner" > <div class="log-window-inner" >
<p ng-repeat="log in log.logs | filter:log.filterText track by $index" ng-bind-html="log | asTrustedHtml"></p> <p ng-repeat="log in log.logs | filter:log.filterText track by $index" ng-bind-html="log | asTrustedHtml"></p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,27 +1,27 @@
<div class="row" ng-controller="Developer.JenkinsMetricsController"> <div class="row" ng-controller="Developer.JenkinsMetricsController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="metrics.builds.length" class="align-center"> <div ng-hide="metrics.builds.length" class="align-center">
<p class="alert alert-info">There are no completed builds in this job.</p> <p class="alert alert-info">There are no completed builds in this job.</p>
</div> </div>
<div ng-show="metrics.builds.length"> <div ng-show="metrics.builds.length">
<nvd3 options="options" data="data" api="api"></nvd3> <nvd3 options="options" data="data" api="api"></nvd3>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
<div class="log-panel" ng-controller="Developer.JenkinsLogController" scroll-glue> <div class="log-panel" ng-controller="Developer.JenkinsLogController" scroll-glue>
<div class="log-panel-inner" style="height: 25px;"> <div class="log-panel-inner" style="height: 25px;">
<p ng-repeat="log in log.logs track by $index" ng-bind-html="log | asTrustedHtml"></p> <p ng-repeat="log in log.logs track by $index" ng-bind-html="log | asTrustedHtml"></p>
</div> </div>
</div> </div>

View File

@ -1,40 +1,40 @@
<div class="row" ng-controller="Developer.PipelineController"> <div class="row" ng-controller="Developer.PipelineController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="model.stages.length" <hawtio-filter ng-show="model.stages.length"
ng-model="model.filterText" ng-model="model.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter pipeline..."></hawtio-filter> placeholder="Filter pipeline..."></hawtio-filter>
</span> </span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.stages.length" class="align-center"> <div ng-hide="model.stages.length" class="align-center">
<p class="alert alert-info">There are no pipeline stages in this build.</p> <p class="alert alert-info">There are no pipeline stages in this build.</p>
</div> </div>
<div ng-show="model.stages.length"> <div ng-show="model.stages.length">
<h2>Pipeline for {{jobId}}</h2> <h2>Pipeline for {{jobId}}</h2>
<div pipeline-view></div> <div pipeline-view></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,77 +1,77 @@
<div class="panel-group"> <div class="panel-group">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h2 class="panel-title"> <h2 class="panel-title">
<a data-toggle="collapse" data-parent=".panel-group" href="#build-{{build.id}}"> <a data-toggle="collapse" data-parent=".panel-group" href="#build-{{build.id}}">
Build {{build.displayName}} Build {{build.displayName}}
</a> </a>
<span class="pull-right" title="This build started at {{build.$timestamp}}"> <span class="pull-right" title="This build started at {{build.$timestamp}}">
started {{build.$timestamp.relative()}} started {{build.$timestamp.relative()}}
</span> </span>
</h2> </h2>
</div> </div>
<div id="build-{{build.id}}" class="panel-collapse collapse in"> <div id="build-{{build.id}}" class="panel-collapse collapse in">
<div class="panel-body"> <div class="panel-body">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<!-- <!--
<div class="pipeline-build inline-block" <div class="pipeline-build inline-block"
title="{{build.description || 'Pipeline build number ' + build.displayName}}"> title="{{build.description || 'Pipeline build number ' + build.displayName}}">
<div class="buildName"> <div class="buildName">
<a href="{{build.$viewLink}}" title="View the build details"> <a href="{{build.$viewLink}}" title="View the build details">
{{build.displayName}} {{build.displayName}}
</a> </a>
<span class="buildParameters pull-right" ng-show="$parameterText"> <span class="buildParameters pull-right" ng-show="$parameterText">
<i class="fa fa-ellipsis-v" title="build parameters: {{build.$parameterText}}"></i> <i class="fa fa-ellipsis-v" title="build parameters: {{build.$parameterText}}"></i>
</span> </span>
</div> </div>
<div class="buildDuration text-center"> <div class="buildDuration text-center">
<a href="{{build.$logLink}}" title="This build started at {{build.$timestamp}}"> <a href="{{build.$logLink}}" title="This build started at {{build.$timestamp}}">
started {{build.$timestamp.relative()}} started {{build.$timestamp.relative()}}
</a> </a>
</div> </div>
</div> </div>
--> -->
<div ng-repeat="stage in build.stages | filter:model.filterText track by $index" class="inline-block"> <div ng-repeat="stage in build.stages | filter:model.filterText track by $index" class="inline-block">
<div class="pipeline-arrow inline-block" ng-show="$index"> <div class="pipeline-arrow inline-block" ng-show="$index">
<i class="fa fa-angle-double-right"></i> <i class="fa fa-angle-double-right"></i>
</div> </div>
<div class="pipeline-deploy {{stage.$backgroundClass}} inline-block"> <div class="pipeline-deploy {{stage.$backgroundClass}} inline-block">
<div class="text-center stageName" title="{{stage.status}}"><i class="{{stage.$iconClass}}"></i> <div class="text-center stageName" title="{{stage.status}}"><i class="{{stage.$iconClass}}"></i>
<a href="{{stage.$viewLink}}" title="This stage started at {{stage.$startTime}}" target="jenkins"> <a href="{{stage.$viewLink}}" title="This stage started at {{stage.$startTime}}" target="jenkins">
{{stage.stageName}} {{stage.stageName}}
</a> </a>
</div> </div>
<div class="text-center stageStartTime" title="Stage started at {{stage.$startTime}}"> <div class="text-center stageStartTime" title="Stage started at {{stage.$startTime}}">
<a href="{{stage.$logLink}}" title="View the logs of this stage"> <a href="{{stage.$logLink}}" title="View the logs of this stage">
{{stage.duration.duration()}} {{stage.duration.duration()}}
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row" ng-show="hideLogs && !build.building"> <div class="row" ng-show="hideLogs && !build.building">
<div class="col-md-12"> <div class="col-md-12">
<a href="{{build.$logLink}}" class="pull-right">View Full Log</a> <a href="{{build.$logLink}}" class="pull-right">View Full Log</a>
</div> </div>
</div> </div>
<div class="row" ng-hide="hideLogs && !build.building"> <div class="row" ng-hide="hideLogs && !build.building">
<div class="col-md-12"> <div class="col-md-12">
<h4 class="inline-block">Logs</h4> <h4 class="inline-block">Logs</h4>
<a href="{{build.$logLink}}" class="pull-right">View Full Log</a> <a href="{{build.$logLink}}" class="pull-right">View Full Log</a>
<div style="height: 250px;" ng-include="'plugins/developer/html/logPanel.html'"></div> <div style="height: 250px;" ng-include="'plugins/developer/html/logPanel.html'"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,44 +1,44 @@
<div class="row" ng-controller="Developer.PipelinesController"> <div class="row" ng-controller="Developer.PipelinesController">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
<div hawtio-tabs></div> <div hawtio-tabs></div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-4"> <div class="col-md-4">
<span> <span>
<hawtio-filter ng-show="model.job.builds.length" <hawtio-filter ng-show="model.job.builds.length"
ng-model="model.filterText" ng-model="model.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter pipelines..."></hawtio-filter> placeholder="Filter pipelines..."></hawtio-filter>
</span> </span>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<form class="form-inline"> <form class="form-inline">
<div class="checkbox" title="Only show build pipelines which are pending"> <div class="checkbox" title="Only show build pipelines which are pending">
<label> <label>
<input type="checkbox" ng-model="model.pendingOnly"> &nbsp;Only pending builds <input type="checkbox" ng-model="model.pendingOnly"> &nbsp;Only pending builds
</label> </label>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<div class="row" ng-init="hideLogs = true"> <div class="row" ng-init="hideLogs = true">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.job.builds.length" class="align-center"> <div ng-hide="model.job.builds.length" class="align-center">
<p class="alert alert-info">There are no pipelines for this job.</p> <p class="alert alert-info">There are no pipelines for this job.</p>
</div> </div>
<div ng-show="model.job.builds.length"> <div ng-show="model.job.builds.length">
<div ng-repeat="build in model.job.builds | filter:model.filterText track by $index"> <div ng-repeat="build in model.job.builds | filter:model.filterText track by $index">
<div pipeline-view></div> <div pipeline-view></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,36 +1,36 @@
<div ng-controller="Kubernetes.BuildConfigController"> <div ng-controller="Kubernetes.BuildConfigController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/buildConfigs"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/buildConfigs"><i class="fa fa-list"></i></a>
<div class="pull-right" ng-repeat="view in entity.$fabric8Views | orderBy:'label'"> <div class="pull-right" ng-repeat="view in entity.$fabric8Views | orderBy:'label'">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
<span class="pull-right" ng-show="view.url" >&nbsp;</span> <span class="pull-right" ng-show="view.url" >&nbsp;</span>
</div> </div>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Trigger this build" title="Trigger this build"
ng-disabled="!entity.$triggerUrl" ng-disabled="!entity.$triggerUrl"
ng-click="triggerBuild(entity)"><i class="fa fa-play-circle-o"></i> Trigger</button> ng-click="triggerBuild(entity)"><i class="fa fa-play-circle-o"></i> Trigger</button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div hawtio-object="entity" config="config"></div> <div hawtio-object="entity" config="config"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,13 +1,13 @@
<ul class="project-selector" ng-controller="Developer.ProjectSelector" ng-show='projectId'> <ul class="project-selector" ng-controller="Developer.ProjectSelector" ng-show='projectId'>
<li class="dropdown"> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<strong ng-bind="projectId"></strong> <strong ng-bind="projectId"></strong>
<b class="caret"></b> <b class="caret"></b>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li ng-repeat='project in projects'> <li ng-repeat='project in projects'>
<a ng-href="{{project.$viewLink}}">{{project.$name}}</a> <a ng-href="{{project.$viewLink}}">{{project.$name}}</a>
</li> </li>
</ul> </ul>
</li> </li>
</ul> </ul>

View File

@ -1,126 +1,126 @@
<div class="row" ng-controller="Developer.ProjectsController"> <div class="row" ng-controller="Developer.ProjectsController">
<script type="text/ng-template" id="buildConfigLinkTemplate.html"> <script type="text/ng-template" id="buildConfigLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View details for this build configuration" <a title="View details for this build configuration"
href="{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}"> href="{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}">
<!-- <!--
<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
--> -->
{{row.entity.metadata.name}}</a> {{row.entity.metadata.name}}</a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigViewsTemplate.html"> <script type="text/ng-template" id="buildConfigViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8Views track by $index"> <span ng-repeat="view in row.entity.$fabric8Views track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigCodeViewsTemplate.html"> <script type="text/ng-template" id="buildConfigCodeViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8CodeViews track by $index"> <span ng-repeat="view in row.entity.$fabric8CodeViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigBuildViewsTemplate.html"> <script type="text/ng-template" id="buildConfigBuildViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8BuildViews track by $index"> <span ng-repeat="view in row.entity.$fabric8BuildViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigEnvironmentViewsTemplate.html"> <script type="text/ng-template" id="buildConfigEnvironmentViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8EnvironmentViews track by $index"> <span ng-repeat="view in row.entity.$fabric8EnvironmentViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigTeamViewsTemplate.html"> <script type="text/ng-template" id="buildConfigTeamViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8TeamViews track by $index"> <span ng-repeat="view in row.entity.$fabric8TeamViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="model.buildconfigs.length" <hawtio-filter ng-show="model.buildconfigs.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter apps..."></hawtio-filter> placeholder="Filter apps..."></hawtio-filter>
</span> </span>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="fetched" <button ng-show="fetched"
title="Delete the selected build configuration" title="Delete the selected build configuration"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="tableConfig.selectedItems.length == 0" ng-disabled="tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(tableConfig.selectedItems)"> ng-click="deletePrompt(tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<button ng-show="model.fetched" <button ng-show="model.fetched"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(id || tableConfig.selectedItems)" ng-click="deletePrompt(id || tableConfig.selectedItems)"
title="Delete the selected apps"> title="Delete the selected apps">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" href="{{baseUri}}/workspaces/{{namespace}}/forge/createProject" <a class="btn btn-primary pull-right" href="{{baseUri}}/workspaces/{{namespace}}/forge/createProject"
title="Create a new app in this project"> title="Create a new app in this project">
<i class="fa fa-plus"></i> Create App</a> <i class="fa fa-plus"></i> Create App</a>
</a> </a>
<!-- <!--
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn btn-default pull-right" <button class="btn btn-default pull-right"
title="Trigger the given build" title="Trigger the given build"
ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl" ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl"
ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button> ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button>
--> -->
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.buildconfigs.length" class="align-center"> <div ng-hide="model.buildconfigs.length" class="align-center">
<p class="alert alert-info">There are no projects in this workspace.</p> <p class="alert alert-info">There are no projects in this workspace.</p>
</div> </div>
<div ng-show="model.buildconfigs.length"> <div ng-show="model.buildconfigs.length">
<table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table> <table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,51 +1,51 @@
<div ng-controller="Kubernetes.BuildConfigController"> <div ng-controller="Kubernetes.BuildConfigController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" ng-show="model.tools.length"> <div class="col-md-12" ng-show="model.tools.length">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter tools..."></hawtio-filter> placeholder="Filter tools..."></hawtio-filter>
</span> </span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="entity.tools.length" class="align-center"> <div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p> <p class="alert alert-info">There are no tools currently available.</p>
</div> </div>
<div ng-show="entity.tools.length"> <div ng-show="entity.tools.length">
<div ng-hide="entity.tools.length" class="align-center"> <div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p> <p class="alert alert-info">There are no tools currently available.</p>
</div> </div>
<div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index"> <div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index">
<div class="row" <div class="row"
title="{{env.description}}"> title="{{env.description}}">
<div class="col-md-9"> <div class="col-md-9">
<a href="{{env.url}}"> <a href="{{env.url}}">
<h3> <h3>
<i class="{{env.iconClass}}"></i> <i class="{{env.iconClass}}"></i>
{{env.label}} {{env.label}}
</h3> </h3>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,46 +1,46 @@
<div ng-controller="Developer.WorkspaceController"> <div ng-controller="Developer.WorkspaceController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/workspaces"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/workspaces"><i class="fa fa-list"></i></a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$configLink" <a class="btn btn-default pull-right" ng-show="entity.$configLink"
title="View the workspace configuration" title="View the workspace configuration"
href="{{entity.$configLink}}"> href="{{entity.$configLink}}">
Configuration Configuration
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$podLink" <a class="btn btn-default pull-right" ng-show="entity.$podLink"
title="View the workspace pod" title="View the workspace pod"
href="{{entity.$podLink}}"> href="{{entity.$podLink}}">
Pod Pod
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" ng-show="entity.$logsLink" <a class="btn btn-primary pull-right" ng-show="entity.$logsLink"
title="View the workspace logs" title="View the workspace logs"
href="{{entity.$logsLink}}"> href="{{entity.$logsLink}}">
View Log View Log
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div hawtio-object="entity" config="config"></div> <div hawtio-object="entity" config="config"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,46 +1,47 @@
<div ng-controller="Developer.WorkspacesController" hawtio-card-bg> <div ng-controller="Developer.WorkspacesController" hawtio-card-bg style="margin-top:100px;">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
<div hawtio-tabs></div> <div hawtio-tabs></div>
<div class="container-content"> <div class="container-content">
<div class="container-fluid"> <div class="container-fluid">
<div class="row nav-content"> <div class="row nav-content">
<ul class="nav nav-tabs" ng-show="navbarItems.length"> <ul class="nav nav-tabs" ng-show="navbarItems.length">
<li role="presentation" ng-repeat="item in navbarItems" class="{{item.class}}"><a href="#" ng-click="selectBatchItem(item)">{{item.label}}</a></li> <li role="presentation" ng-repeat="item in navbarItems" class="{{item.class}}"><a href="#" ng-click="selectBatchItem(item)">{{item.label}}</a></li>
</ul> </ul>
</div> </div>
<div ng-hide="model.data.length" class="align-center"> <div ng-hide="model.data.length" class="align-center">
<p class="alert alert-info">当前没有可以查看的数据.</p> <p class="alert alert-info">当前没有可以查看的数据.</p>
</div> </div>
<div ng-show="model.data.length"> <div ng-show="model.data.length">
<table class="table table-striped table-bordered" hawtio-simple-table="tableConfig"></table> <table class="table table-striped table-bordered sj_content_table" hawtio-simple-table="tableConfig"></table>
<div class="row"> <div class="row clear">
<div class="col-xs-6 col-sm-2"> <div class=" fl">
<button ng-show="true" class="btn btn-danger pull-right" ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-click="deletePrompt(id || tableConfig.selectedItems)"> <input type="checkbox" class="fl mr5 " style="margin-top: 8px;" />
<i class="fa fa-remove"></i> 删除数据 <label class="fl mr5 " style="margin-top: 5px; font-style:nomal;">全选</label>
</button> <a class="sj_btn_grey pull-left mr5" title="启动oracle服务" href="/kubernetes/replicationControllers" ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-click="createOracleService(id || tableConfig.selectedItems)">启动oracle服务</a>
<span class="pull-right">&nbsp;</span> <a class="sj_btn_grey pull-left mr5" title="迁移数据" href="/kubernetes/replicationControllers" ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-click="createOracleService(id || tableConfig.selectedItems)">迁移数据</a>
<button ng-show="id" class="btn btn-primary pull-right" ng-click="id = undefined"><i class="fa fa-list"></i></button> <a class="sj_btn_grey pull-left mr5" title="删除数据" href="/kubernetes/replicationControllers" ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-click="createOracleService(id || tableConfig.selectedItems)">删除数据</a>
<span class="pull-right">&nbsp;</span> </div>
<a class="btn btn-default pull-right" title="启动oracle服务" href="/kubernetes/replicationControllers" ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-click="createOracleService(id || tableConfig.selectedItems)"><i class="fa fa-plus"></i> 启动服务</a> <ul class="fr sj_table_bottom">
<span class="pull-right">&nbsp;</span> <li class="mr5">当前显示1~7行共7行。</li>
</div> <li class="mr5">每页显示
<div class="col-md-6 col-md-offset-9"> <select ng-options="value for value in pageSizeChoses" ng-change="selectAction()" ng-model="options.currentTableSize"></select>
每页显示&nbsp </li>
<select ng-options="value for value in pageSizeChoses" ng-change="selectAction()" ng-model="options.currentTableSize"></select> <li class="mr5">当前页码</li>
&nbsp&nbsp当前页码 <li>
<div class="hawtio-pager clearfix"> <div class="hawtio-pager clearfix">
<label>{{options.currentPageNum}} / {{options.getPageSizeNum()}}</label> <label>{{options.currentPageNum}} / {{options.getPageSizeNum()}}</label>
<div class=btn-group> <div class=btn-group>
<button class="btn" ng-disabled="isEmptyOrFirst()" ng-click="first()"><i class="fa fa-fast-backward"></i></button> <button class="btn sj_btn_grey" ng-disabled="isEmptyOrFirst()" ng-click="first()"><i class="fa fa-fast-backward"></i></button>
<button class="btn" ng-disabled="isEmptyOrFirst()" ng-click="previous()"><i class="fa fa-step-backward"></i></button> <button class="btn sj_btn_grey" ng-disabled="isEmptyOrFirst()" ng-click="previous()"><i class="fa fa-step-backward"></i></button>
<button class="btn" ng-disabled="isEmptyOrLast()" ng-click="next()"><i class="fa fa-step-forward"></i></button> <button class="btn sj_btn_grey " ng-disabled="isEmptyOrLast()" ng-click="next()"><i class="fa fa-step-forward"></i></button>
<button class="btn" ng-disabled="isEmptyOrLast()" ng-click="last()"><i class="fa fa-fast-forward"></i></button> <button class="btn sj_btn_grey" ng-disabled="isEmptyOrLast()" ng-click="last()"><i class="fa fa-fast-forward"></i></button>
</div> </div>
</div> </div>
</div> </li>
</div> </ul>
</div> </div>
</div> </div>
</div> </div>
<div class="prettify"></div> </div>
</div> <div class="prettify"></div>
</div>

View File

@ -1,66 +1,66 @@
.environment-row a { .environment-row a {
color: black; color: black;
} }
.environment-row { .environment-row {
.panel { .panel {
min-width: 255px; min-width: 255px;
min-height: 160px; min-height: 160px;
} }
.panel-group { .panel-group {
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
} }
.panel-title > a:before { .panel-title > a:before {
display: none; display: none;
} }
} }
.environment-rows { .environment-rows {
/* /*
background-color: rgb(238, 238, 238); background-color: rgb(238, 238, 238);
*/ */
padding-top: 5px; padding-top: 5px;
vertical-align: top; vertical-align: top;
} }
.environment-name-block { .environment-name-block {
width: 200px; width: 200px;
} }
.environment-name-block, .environment-deploy-block { .environment-name-block, .environment-deploy-block {
background: white; background: white;
-moz-border-radius: 10px; -moz-border-radius: 10px;
border-radius: 10px; border-radius: 10px;
padding-top: 10px; padding-top: 10px;
padding-bottom: 10px; padding-bottom: 10px;
padding-left: 20px; padding-left: 20px;
padding-right: 20px; padding-right: 20px;
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
margin-left: 20px; margin-left: 20px;
margin-right: 20px; margin-right: 20px;
} }
.environment-name-block { .environment-name-block {
padding-top: 0px; padding-top: 0px;
} }
.environment-block { .environment-block {
vertical-align: top; vertical-align: top;
} }
.environment-deploy-block { .environment-deploy-block {
border:1px dashed; border:1px dashed;
border-color: silver; border-color: silver;
} }
.environment-deploy-version-and-pods { .environment-deploy-version-and-pods {
padding-bottom: 5px; padding-bottom: 5px;
} }

View File

@ -1,50 +1,50 @@
.project-dashboard { .project-dashboard {
.page-header-row { .page-header-row {
background: white; background: white;
margin-left: -20px; margin-left: -20px;
margin-right: -20px; margin-right: -20px;
margin-top: -20px; margin-top: -20px;
border-bottom: 1px solid #d1d1d1; border-bottom: 1px solid #d1d1d1;
margin-bottom: 13px; margin-bottom: 13px;
padding-bottom: 7px; padding-bottom: 7px;
} }
.card-pf-title { .card-pf-title {
margin-right: 1em; margin-right: 1em;
} }
.no-border { .no-border {
border: none; border: none;
margin-bottom: 0; margin-bottom: 0;
} }
.no-top-margin { .no-top-margin {
margin-top: 0; margin-top: 0;
} }
.full-card-width { .full-card-width {
margin-left: -20px; margin-left: -20px;
margin-right: -20px; margin-right: -20px;
} }
.card-pf.pipeline { .card-pf.pipeline {
.panel-group { .panel-group {
border-width: 0; border-width: 0;
.panel { .panel {
box-shadow: none; box-shadow: none;
} }
.panel.panel-default { .panel.panel-default {
border-width: 0; border-width: 0;
border-top-width: 1px; border-top-width: 1px;
.log-panel { .log-panel {
border: 1px solid #d4d4d4; border: 1px solid #d4d4d4;
} }
} }
} }
} }
} }

View File

@ -1,8 +1,8 @@
.filter-header { .filter-header {
.btn, form { .btn, form {
margin-top: 1.05em; margin-top: 1.05em;
margin-bottom: 1em; margin-bottom: 1em;
} }
} }

View File

@ -1,25 +1,25 @@
.log-window { .log-window {
border-top: 1px solid #d4d4d4; border-top: 1px solid #d4d4d4;
overflow: auto; overflow: auto;
} }
.log-window-inner * { .log-window-inner * {
font-family: "DroidSansMonoRegular", monospace; font-family: "DroidSansMonoRegular", monospace;
line-height: 13px; line-height: 13px;
} }
.log-panel { .log-panel {
position: static; position: static;
height: 100%; height: 100%;
width: 100%; width: 100%;
overflow: auto; overflow: auto;
border: none; border: none;
padding: 3px; padding: 3px;
} }
.log-panel-inner * { .log-panel-inner * {
font-family: "DroidSansMonoRegular", monospace; font-family: "DroidSansMonoRegular", monospace;
line-height: 13px; line-height: 13px;
} }

View File

@ -1,14 +1,14 @@
.project-selector { .project-selector {
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
list-style-type: none; list-style-type: none;
a, a:hover { a, a:hover {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
font-size: 13px; font-size: 13px;
line-height: 21px; line-height: 21px;
} }
} }

View File

@ -1,101 +1,101 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
module Developer{ module Developer{
var log = Logger.get('developer-navigation'); var log = Logger.get('developer-navigation');
export function createCurrentSubNavBar($scope, $location, $routeParams){ export function createCurrentSubNavBar($scope, $location, $routeParams){
return activateCurrent([ return activateCurrent([
{ {
href: "#", href: "#",
label: "数据查看", label: "数据查看",
title: "查看所有数据", title: "查看所有数据",
items: [{ items: [{
href: UrlHelpers.join(context,"Overview/data-type/all"), href: UrlHelpers.join(context,"Overview/data-type/all"),
label: "全部", label: "全部",
title: "全部数据" title: "全部数据"
}, },
{ {
href: UrlHelpers.join(context,"Overview/data-type/financial"), href: UrlHelpers.join(context,"Overview/data-type/financial"),
label: "财政", label: "财政",
title: "财政数据" title: "财政数据"
}, },
{ {
href: UrlHelpers.join(context,"Overview/data-type/social-security"), href: UrlHelpers.join(context,"Overview/data-type/social-security"),
label: "社保", label: "社保",
title: "社保数据" title: "社保数据"
}] }]
}, },
{ {
href: UrlHelpers.join(context, "task"), href: UrlHelpers.join(context, "task"),
label: "任务", label: "任务",
title: "数据汇总任务", title: "数据汇总任务",
} }
]); ]);
} }
function activateCurrent(navBarItems) { function activateCurrent(navBarItems) {
navBarItems = _.compact(navBarItems); navBarItems = _.compact(navBarItems);
var injector = HawtioCore.injector; var injector = HawtioCore.injector;
var $location = injector ? injector.get<ng.ILocationService>("$location") : null; var $location = injector ? injector.get<ng.ILocationService>("$location") : null;
if ($location) { if ($location) {
var path = normalizeHref(trimQuery($location.path())); var path = normalizeHref(trimQuery($location.path()));
var found = false; var found = false;
function makeActive(item) { function makeActive(item) {
item.active = true; item.active = true;
found = true; found = true;
} }
function getHref(item) { function getHref(item) {
var href = item.href; var href = item.href;
var trimHref = trimQuery(href); var trimHref = trimQuery(href);
return normalizeHref(trimHref); return normalizeHref(trimHref);
} }
angular.forEach(navBarItems, (item) => { angular.forEach(navBarItems, (item) => {
if (!found && item) { if (!found && item) {
if (angular.isFunction(item.isActive)) { if (angular.isFunction(item.isActive)) {
if (item.isActive(item, path)) { if (item.isActive(item, path)) {
makeActive(item); makeActive(item);
} }
} else { } else {
var trimHref = getHref(item); var trimHref = getHref(item);
if (!trimHref) { if (!trimHref) {
return; return;
} }
if (trimHref === path) { if (trimHref === path) {
makeActive(item); makeActive(item);
} }
} }
} }
}); });
// Maybe it's a sub-item of a tab, let's fall back to that maybe // Maybe it's a sub-item of a tab, let's fall back to that maybe
if (!found) { if (!found) {
angular.forEach(navBarItems, (item) => { angular.forEach(navBarItems, (item) => {
if (!found) { if (!found) {
if (!angular.isFunction(item.isActive)) { if (!angular.isFunction(item.isActive)) {
var trimHref = getHref(item); var trimHref = getHref(item);
if (!trimHref) { if (!trimHref) {
return; return;
} }
if (_.startsWith(path, trimHref)) { if (_.startsWith(path, trimHref)) {
makeActive(item); makeActive(item);
} }
} }
} }
}); });
} }
// still not found, let's log it // still not found, let's log it
if (!found) { if (!found) {
log.debug("No navigation tab found for path:", path); log.debug("No navigation tab found for path:", path);
} }
} }
return navBarItems; return navBarItems;
} }
function trimQuery(text) { function trimQuery(text) {
if (text) { if (text) {
var idx = text.indexOf("?"); var idx = text.indexOf("?");
if (idx >= 0) { if (idx >= 0) {
return text.substring(0, idx); return text.substring(0, idx);
} }
} }
return text; return text;
} }
} }

View File

@ -1,141 +1,141 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="developerPlugin.ts"/> /// <reference path="developerPlugin.ts"/>
module Developer{ module Developer{
export class OptionsParams{ export class OptionsParams{
public pagerSizeOption = [20,50,100]; public pagerSizeOption = [20,50,100];
public dataType =null; public dataType =null;
public currentTableSize =20; public currentTableSize =20;
public dataBatch =null; public dataBatch =null;
public labels={}; public labels={};
public currentPageNum=1; public currentPageNum=1;
public totalSize=null; public totalSize=null;
public priorTableSize = 20; public priorTableSize = 20;
public createParamData(){ public createParamData(){
var extendValue =["cityName", "districtName", "dataVersion", "systemName", "dataYear"]; var extendValue =["cityName", "districtName", "dataVersion", "systemName", "dataYear"];
var result={ var result={
currentPageNum: this.currentPageNum, currentPageNum: this.currentPageNum,
dataType: this.dataType, dataType: this.dataType,
submittedBatch: this.dataBatch, submittedBatch: this.dataBatch,
limit: this.currentTableSize, limit: this.currentTableSize,
priorTableSize: this.priorTableSize priorTableSize: this.priorTableSize
} }
angular.forEach(this.labels,(value, key) =>{ angular.forEach(this.labels,(value, key) =>{
if(extendValue.indexOf(key)) if(extendValue.indexOf(key))
result[key] = value; result[key] = value;
}); });
return result; return result;
} }
public getPageSizeNum(){ public getPageSizeNum(){
var num = Math.ceil(this.totalSize/this.currentTableSize); var num = Math.ceil(this.totalSize/this.currentTableSize);
if(num < this.currentPageNum) if(num < this.currentPageNum)
num = this.currentPageNum; num = this.currentPageNum;
return num; return num;
} }
} }
function createKey(regionalismCode, systemId, version){ function createKey(regionalismCode, systemId, version){
return regionalismCode + "-" + systemId + "-" + version; return regionalismCode + "-" + systemId + "-" + version;
} }
function populateKey(item){ function populateKey(item){
var result = item; var result = item;
result["_key"] = createKey(item.regionalismCode, item.systemCode, item.dataVersion); result["_key"] = createKey(item.regionalismCode, item.systemCode, item.dataVersion);
return result; return result;
} }
function populateKeys(items:Array<any>){ function populateKeys(items:Array<any>){
var result =[]; var result =[];
angular.forEach(items, (item) =>{ angular.forEach(items, (item) =>{
result.push(populateKey(item)); result.push(populateKey(item));
}); });
} }
function createName(cityName, districtName){ function createName(cityName, districtName){
return cityName + "-" + districtName; return cityName + "-" + districtName;
} }
function populateName(item){ function populateName(item){
var result = item; var result = item;
result["name"] = createName(item.cityName, item.districtName); result["name"] = createName(item.cityName, item.districtName);
return result; return result;
} }
function populateNames(items:Array<any>){ function populateNames(items:Array<any>){
var result = []; var result = [];
angular.forEach(items, (item) =>{ angular.forEach(items, (item) =>{
result.push(populateName(item)); result.push(populateName(item));
}); });
} }
function createParamData(options: OptionsParams){ function createParamData(options: OptionsParams){
return options.createParamData(); return options.createParamData();
} }
export class DataModelService{ export class DataModelService{
public data = []; public data = [];
public paramOptions = null; public paramOptions = null;
constructor(){ constructor(){
this.initParamOptions(); this.initParamOptions();
//this.updateModel(); //this.updateModel();
this.maybeFormat(); this.maybeFormat();
} }
//更新数据模型 //更新数据模型
protected getDataModel(paramOptions){ protected getDataModel(paramOptions){
var result ; var result ;
$.ajax({ $.ajax({
async: false, async: false,
type : "POST", type : "POST",
url : "/java/console/api/data.json", url : "/java/console/api/data.json",
dataType : 'json', dataType : 'json',
data: createParamData(paramOptions), data: createParamData(paramOptions),
success : function(data) { success : function(data) {
console.log(paramOptions); console.log(paramOptions);
result = data.data; result = data.data;
paramOptions.totalSize=data.length; paramOptions.totalSize=data.length;
} }
}); });
return result; return result;
} }
public initParamOptions(){ public initParamOptions(){
this.paramOptions = new OptionsParams(); this.paramOptions = new OptionsParams();
} }
public updateModel(){ public updateModel(){
this.data = this.getDataModel(this.paramOptions); this.data = this.getDataModel(this.paramOptions);
this.maybeFormat(); this.maybeFormat();
} }
//格式数据模型中的每个单条记录 //格式数据模型中的每个单条记录
public maybeFormat(){ public maybeFormat(){
populateKeys(this.data); populateKeys(this.data);
populateNames(this.data); populateNames(this.data);
} }
//更新用户选择参数 //更新用户选择参数
public updateParamOption(option:string, value:any){ public updateParamOption(option:string, value:any){
this.paramOptions[option] = value; this.paramOptions[option] = value;
} }
//根据key获取用户选择参数 //根据key获取用户选择参数
public getParamOption(key:string){ public getParamOption(key:string){
return this.paramOptions[key]; return this.paramOptions[key];
} }
} }
//创建数据模型服务 //创建数据模型服务
_module.factory("DataModel", ['$rootScope', '$http', '$location', '$resource', ($rootScope, $http, $location, $resource) => { _module.factory("DataModel", ['$rootScope', '$http', '$location', '$resource', ($rootScope, $http, $location, $resource) => {
var $scope = new DataModelService(); var $scope = new DataModelService();
return $scope; return $scope;
}]); }]);
} }

View File

@ -1,247 +1,247 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
module Developer { module Developer {
export function enrichWorkspaces(projects) { export function enrichWorkspaces(projects) {
angular.forEach(projects, (project) => { angular.forEach(projects, (project) => {
enrichWorkspace(project); enrichWorkspace(project);
}); });
return projects; return projects;
} }
export function enrichWorkspace(build) { export function enrichWorkspace(build) {
if (build) { if (build) {
var name = Kubernetes.getName(build); var name = Kubernetes.getName(build);
build.$name = name; build.$name = name;
build.$sortOrder = 0 - build.number; build.$sortOrder = 0 - build.number;
var nameArray = name.split("-"); var nameArray = name.split("-");
var nameArrayLength = nameArray.length; var nameArrayLength = nameArray.length;
build.$shortName = (nameArrayLength > 4) ? nameArray.slice(0, nameArrayLength - 4).join("-") : name.substring(0, 30); build.$shortName = (nameArrayLength > 4) ? nameArray.slice(0, nameArrayLength - 4).join("-") : name.substring(0, 30);
var labels = Kubernetes.getLabels(build); var labels = Kubernetes.getLabels(build);
build.$creationDate = asDate(Kubernetes.getCreationTimestamp(build)); build.$creationDate = asDate(Kubernetes.getCreationTimestamp(build));
build.$labelsText = Kubernetes.labelsToString(labels); build.$labelsText = Kubernetes.labelsToString(labels);
if (name) { if (name) {
build.$projectsLink = UrlHelpers.join("workspaces", name); build.$projectsLink = UrlHelpers.join("workspaces", name);
build.$runtimeLink = UrlHelpers.join("kubernetes/namespace/", name, "/apps"); build.$runtimeLink = UrlHelpers.join("kubernetes/namespace/", name, "/apps");
build.$viewLink = build.$projectsLink; build.$viewLink = build.$projectsLink;
} }
} }
return build; return build;
} }
export function asDate(value) { export function asDate(value) {
return value ? new Date(value) : null; return value ? new Date(value) : null;
} }
export function enrichJenkinsJobs(jobsData, projectId, jobName) { export function enrichJenkinsJobs(jobsData, projectId, jobName) {
if (jobsData) { if (jobsData) {
angular.forEach(jobsData.jobs, (job) => { angular.forEach(jobsData.jobs, (job) => {
enrichJenkinsJob(job, projectId, jobName); enrichJenkinsJob(job, projectId, jobName);
}); });
} }
return jobsData; return jobsData;
} }
export function enrichJenkinsJob(job, projectId, jobName) { export function enrichJenkinsJob(job, projectId, jobName) {
if (job) { if (job) {
jobName = jobName || job.name || projectId; jobName = jobName || job.name || projectId;
job.$jobId = jobName; job.$jobId = jobName;
job.$project = projectId || jobName; job.$project = projectId || jobName;
var lastBuild = job.lastBuild; var lastBuild = job.lastBuild;
var lastBuildResult = lastBuild ? lastBuild.result : "NOT_STARTED"; var lastBuildResult = lastBuild ? lastBuild.result : "NOT_STARTED";
var $iconClass = createBuildStatusIconClass(lastBuildResult); var $iconClass = createBuildStatusIconClass(lastBuildResult);
job.$lastBuildNumber = enrichJenkinsBuild(job, lastBuild); job.$lastBuildNumber = enrichJenkinsBuild(job, lastBuild);
job.$lastSuccessfulBuildNumber = enrichJenkinsBuild(job, job.lastSuccessfulBuild); job.$lastSuccessfulBuildNumber = enrichJenkinsBuild(job, job.lastSuccessfulBuild);
job.$lastFailedlBuildNumber = enrichJenkinsBuild(job, job.lastFailedlBuild); job.$lastFailedlBuildNumber = enrichJenkinsBuild(job, job.lastFailedlBuild);
if (lastBuild) { if (lastBuild) {
job.$duration = lastBuild.duration; job.$duration = lastBuild.duration;
job.$timestamp = asDate(lastBuild.timestamp); job.$timestamp = asDate(lastBuild.timestamp);
} }
var jobUrl = (job || {}).url; var jobUrl = (job || {}).url;
if (!jobUrl || !jobUrl.startsWith("http")) { if (!jobUrl || !jobUrl.startsWith("http")) {
var jenkinsUrl = jenkinsLink(); var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) { if (jenkinsUrl) {
jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName) jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName)
} }
} }
if (jobUrl) { if (jobUrl) {
job.$jobLink = jobUrl; job.$jobLink = jobUrl;
var workspaceName = Kubernetes.currentKubernetesNamespace(); var workspaceName = Kubernetes.currentKubernetesNamespace();
job.$pipelinesLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName, "pipelines"); job.$pipelinesLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName, "pipelines");
job.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName); job.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName);
} }
job.$iconClass = $iconClass; job.$iconClass = $iconClass;
angular.forEach(job.builds, (build) => { angular.forEach(job.builds, (build) => {
enrichJenkinsBuild(job, build); enrichJenkinsBuild(job, build);
}); });
} }
return job; return job;
} }
export function createBuildStatusIconClass(result) { export function createBuildStatusIconClass(result) {
var $iconClass = "fa fa-spinner fa-spin"; var $iconClass = "fa fa-spinner fa-spin";
if (result) { if (result) {
if (result === "FAILURE" || result === "FAILED") { if (result === "FAILURE" || result === "FAILED") {
// TODO not available yet // TODO not available yet
$iconClass = "fa fa-exclamation-circle red"; $iconClass = "fa fa-exclamation-circle red";
} else if (result === "ABORTED" || result === "INTERUPTED") { } else if (result === "ABORTED" || result === "INTERUPTED") {
$iconClass = "fa fa-circle grey"; $iconClass = "fa fa-circle grey";
} else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") { } else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") {
$iconClass = "fa fa-check-circle green"; $iconClass = "fa fa-check-circle green";
} else if (result === "NOT_STARTED") { } else if (result === "NOT_STARTED") {
$iconClass = "fa fa-circle-thin grey"; $iconClass = "fa fa-circle-thin grey";
} }
} }
return $iconClass; return $iconClass;
} }
export function createBuildStatusBackgroundClass(result) { export function createBuildStatusBackgroundClass(result) {
var $iconClass = "build-pending"; var $iconClass = "build-pending";
if (result) { if (result) {
if (result === "FAILURE" || result === "FAILED") { if (result === "FAILURE" || result === "FAILED") {
$iconClass = "build-fail"; $iconClass = "build-fail";
} else if (result === "ABORTED" || result === "INTERUPTED") { } else if (result === "ABORTED" || result === "INTERUPTED") {
$iconClass = "build-aborted"; $iconClass = "build-aborted";
} else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") { } else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") {
$iconClass = "build-success"; $iconClass = "build-success";
} else if (result === "NOT_STARTED") { } else if (result === "NOT_STARTED") {
$iconClass = "build-not-started"; $iconClass = "build-not-started";
} }
} }
return $iconClass; return $iconClass;
} }
export function enrichJenkinsBuild(job, build) { export function enrichJenkinsBuild(job, build) {
var number = null; var number = null;
if (build) { if (build) {
build.$duration = build.duration; build.$duration = build.duration;
build.$timestamp = asDate(build.timestamp); build.$timestamp = asDate(build.timestamp);
var projectId = job.$project; var projectId = job.$project;
var jobName = job.$jobId || projectId; var jobName = job.$jobId || projectId;
var buildId = build.id; var buildId = build.id;
number = build.number; number = build.number;
var workspaceName = Kubernetes.currentKubernetesNamespace(); var workspaceName = Kubernetes.currentKubernetesNamespace();
var $iconClass = createBuildStatusIconClass(build.result); var $iconClass = createBuildStatusIconClass(build.result);
var jobUrl = (job || {}).url; var jobUrl = (job || {}).url;
if (!jobUrl || !jobUrl.startsWith("http")) { if (!jobUrl || !jobUrl.startsWith("http")) {
var jenkinsUrl = jenkinsLink(); var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) { if (jenkinsUrl) {
jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName) jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName)
} }
} }
if (jobUrl) { if (jobUrl) {
build.$jobLink = jobUrl; build.$jobLink = jobUrl;
if (buildId) { if (buildId) {
//build.$logsLink = UrlHelpers.join(build.$buildLink, "console"); //build.$logsLink = UrlHelpers.join(build.$buildLink, "console");
build.$logsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId); build.$logsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId);
build.$pipelineLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "pipeline", buildId); build.$pipelineLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "pipeline", buildId);
build.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName); build.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName);
//build.$buildLink = UrlHelpers.join(jobUrl, build.id); //build.$buildLink = UrlHelpers.join(jobUrl, build.id);
build.$buildLink = build.$logsLink; build.$buildLink = build.$logsLink;
} }
} }
build.$iconClass = $iconClass; build.$iconClass = $iconClass;
} }
return number; return number;
} }
export function jenkinsLink() { export function jenkinsLink() {
var ServiceRegistry = Kubernetes.inject<any>("ServiceRegistry"); var ServiceRegistry = Kubernetes.inject<any>("ServiceRegistry");
if (ServiceRegistry) { if (ServiceRegistry) {
return ServiceRegistry.serviceLink(jenkinsServiceName); return ServiceRegistry.serviceLink(jenkinsServiceName);
} }
return null; return null;
} }
export function forgeReadyLink() { export function forgeReadyLink() {
var ServiceRegistry = Kubernetes.inject<any>("ServiceRegistry"); var ServiceRegistry = Kubernetes.inject<any>("ServiceRegistry");
if (ServiceRegistry) { if (ServiceRegistry) {
return ServiceRegistry.serviceReadyLink(Kubernetes.fabric8ForgeServiceName); return ServiceRegistry.serviceReadyLink(Kubernetes.fabric8ForgeServiceName);
} }
return null; return null;
} }
export function enrichJenkinsPipelineJob(job, projectId, jobId) { export function enrichJenkinsPipelineJob(job, projectId, jobId) {
if (job) { if (job) {
job.$project = projectId; job.$project = projectId;
job.$jobId = jobId; job.$jobId = jobId;
angular.forEach(job.builds, (build) => { angular.forEach(job.builds, (build) => {
enrichJenkinsStages(build, projectId, jobId); enrichJenkinsStages(build, projectId, jobId);
}); });
} }
} }
export function enrichJenkinsStages(build, projectId, jobName) { export function enrichJenkinsStages(build, projectId, jobName) {
if (build) { if (build) {
build.$project = projectId; build.$project = projectId;
build.$jobId = jobName; build.$jobId = jobName;
build.$timestamp = asDate(build.timeInMillis); build.$timestamp = asDate(build.timeInMillis);
build.$iconClass = createBuildStatusIconClass(build.result || "NOT_STARTED"); build.$iconClass = createBuildStatusIconClass(build.result || "NOT_STARTED");
var workspaceName = Kubernetes.currentKubernetesNamespace(); var workspaceName = Kubernetes.currentKubernetesNamespace();
var parameters = build.parameters; var parameters = build.parameters;
var $parameterCount = 0; var $parameterCount = 0;
var $parameterText = "No parameters"; var $parameterText = "No parameters";
if (parameters) { if (parameters) {
$parameterCount = _.keys(parameters).length || 0; $parameterCount = _.keys(parameters).length || 0;
$parameterText = Kubernetes.labelsToString(parameters, " "); $parameterText = Kubernetes.labelsToString(parameters, " ");
} }
build.$parameterCount = $parameterCount; build.$parameterCount = $parameterCount;
build.$parameterText = $parameterText; build.$parameterText = $parameterText;
var jenkinsUrl = jenkinsLink(); var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) { if (jenkinsUrl) {
var url = build.url; var url = build.url;
if (url) { if (url) {
/* /*
build.$viewLink = UrlHelpers.join(jenkinsUrl, url); build.$viewLink = UrlHelpers.join(jenkinsUrl, url);
build.$logLink = UrlHelpers.join(build.$viewLink, "log"); build.$logLink = UrlHelpers.join(build.$viewLink, "log");
*/ */
} }
} }
build.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", build.id); build.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", build.id);
build.$viewLink = build.$logLink; build.$viewLink = build.$logLink;
angular.forEach(build.stages, (stage) => { angular.forEach(build.stages, (stage) => {
enrichJenkinsStage(stage, build); enrichJenkinsStage(stage, build);
}); });
} }
return build; return build;
} }
export function enrichJenkinsStage(stage, build = null) { export function enrichJenkinsStage(stage, build = null) {
if (stage) { if (stage) {
if (build) { if (build) {
stage.$buildId = build.id; stage.$buildId = build.id;
stage.$project = build.$project; stage.$project = build.$project;
} }
var projectId = build.$project; var projectId = build.$project;
var jobName = build.$jobId || projectId; var jobName = build.$jobId || projectId;
var buildId = build.id; var buildId = build.id;
var workspaceName = Kubernetes.currentKubernetesNamespace(); var workspaceName = Kubernetes.currentKubernetesNamespace();
stage.$backgroundClass = createBuildStatusBackgroundClass(stage.status); stage.$backgroundClass = createBuildStatusBackgroundClass(stage.status);
stage.$iconClass = createBuildStatusIconClass(stage.status); stage.$iconClass = createBuildStatusIconClass(stage.status);
stage.$startTime = asDate(stage.startTime); stage.$startTime = asDate(stage.startTime);
if (!stage.duration) { if (!stage.duration) {
stage.duration = 0; stage.duration = 0;
} }
var jenkinsUrl = jenkinsLink(); var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) { if (jenkinsUrl) {
var url = stage.url; var url = stage.url;
if (url) { if (url) {
stage.$viewLink = UrlHelpers.join(jenkinsUrl, url); stage.$viewLink = UrlHelpers.join(jenkinsUrl, url);
stage.$logLink = UrlHelpers.join(stage.$viewLink, "log"); stage.$logLink = UrlHelpers.join(stage.$viewLink, "log");
if (projectId && buildId) { if (projectId && buildId) {
stage.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId); stage.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId);
} }
} }
} }
} }
} }
} }

View File

@ -1,294 +1,294 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
module Developer { module Developer {
export var context = '/workspaces'; export var context = '/workspaces';
export var hash = '#' + context; export var hash = '#' + context;
export var pluginName = 'Developer'; export var pluginName = 'Developer';
export var pluginPath = 'plugins/developer/'; export var pluginPath = 'plugins/developer/';
export var templatePath = pluginPath + 'html/'; export var templatePath = pluginPath + 'html/';
export var log:Logging.Logger = Logger.get(pluginName); export var log:Logging.Logger = Logger.get(pluginName);
export var jenkinsServiceName = "jenkins"; export var jenkinsServiceName = "jenkins";
export var jenkinsServiceNameAndPort = jenkinsServiceName + ":http"; export var jenkinsServiceNameAndPort = jenkinsServiceName + ":http";
export var jenkinsHttpConfig = { export var jenkinsHttpConfig = {
headers: { headers: {
Accept: "application/json, text/x-json, text/plain" Accept: "application/json, text/x-json, text/plain"
} }
}; };
/** /**
* Returns true if the value hasn't changed from the last cached JSON version of this object * Returns true if the value hasn't changed from the last cached JSON version of this object
*/ */
export function hasObjectChanged(value, state) { export function hasObjectChanged(value, state) {
var json = angular.toJson(value || ""); var json = angular.toJson(value || "");
var oldJson = state.json; var oldJson = state.json;
state.json = json; state.json = json;
return !oldJson || json !== oldJson; return !oldJson || json !== oldJson;
} }
export function projectForScope($scope) { export function projectForScope($scope) {
if ($scope) { if ($scope) {
return $scope.buildConfig || $scope.entity || ($scope.model || {}).project; return $scope.buildConfig || $scope.entity || ($scope.model || {}).project;
} }
return null; return null;
} }
/** /**
* Lets load the project versions for the given namespace * Lets load the project versions for the given namespace
*/ */
export function loadProjectVersions($scope, $element, project, env, ns, answer, caches) { export function loadProjectVersions($scope, $element, project, env, ns, answer, caches) {
var projectAnnotation = "project"; var projectAnnotation = "project";
var versionAnnotation = "version"; var versionAnnotation = "version";
var projectNamespace = project.$namespace; var projectNamespace = project.$namespace;
var projectName = project.$name; var projectName = project.$name;
var cache = caches[ns]; var cache = caches[ns];
if (!cache) { if (!cache) {
cache = {}; cache = {};
caches[ns] = cache; caches[ns] = cache;
} }
var status = { var status = {
rcs: [], rcs: [],
pods: [], pods: [],
routes: [], routes: [],
services: [] services: []
}; };
var imageStreamTags = []; var imageStreamTags = [];
function updateModel() { function updateModel() {
var projectInfos = {}; var projectInfos = {};
var model = $scope.model || {}; var model = $scope.model || {};
angular.forEach(status.rcs, (item) => { angular.forEach(status.rcs, (item) => {
var metadata = item.metadata || {}; var metadata = item.metadata || {};
var name = metadata.name; var name = metadata.name;
var labels = metadata.labels || {}; var labels = metadata.labels || {};
var annotations = metadata.annotations || {}; var annotations = metadata.annotations || {};
var spec = item.spec || {}; var spec = item.spec || {};
var selector = spec.selector; var selector = spec.selector;
var project = labels[projectAnnotation]; var project = labels[projectAnnotation];
var version = labels[versionAnnotation]; var version = labels[versionAnnotation];
// lets try the S2I defaults... // lets try the S2I defaults...
if (!project) { if (!project) {
project = labels["app"]; project = labels["app"];
} }
if (!version) { if (!version) {
version = annotations["openshift.io/deployment-config.latest-version"] version = annotations["openshift.io/deployment-config.latest-version"]
} }
if (project && version && project === projectName) { if (project && version && project === projectName) {
var projects = projectInfos[project]; var projects = projectInfos[project];
if (!projects) { if (!projects) {
projects = { projects = {
project: project, project: project,
versions: {} versions: {}
}; };
projectInfos[project] = projects; projectInfos[project] = projects;
} }
var versionInfo = projects.versions[version]; var versionInfo = projects.versions[version];
if (!versionInfo) { if (!versionInfo) {
versionInfo = { versionInfo = {
replicationControllers: {} replicationControllers: {}
}; };
projects.versions[version] = versionInfo; projects.versions[version] = versionInfo;
} }
if (name) { if (name) {
versionInfo.replicationControllers[name] = item; versionInfo.replicationControllers[name] = item;
item.$name = name; item.$name = name;
if (projectNamespace && projectName) { if (projectNamespace && projectName) {
item.$viewLink = UrlHelpers.join("/workspaces/", projectNamespace, "projects", projectName, "namespace", ns, "replicationControllers", name); item.$viewLink = UrlHelpers.join("/workspaces/", projectNamespace, "projects", projectName, "namespace", ns, "replicationControllers", name);
} else { } else {
log.warn("Missing project data! " + projectNamespace + " name " + projectName); log.warn("Missing project data! " + projectNamespace + " name " + projectName);
} }
item.$services = []; item.$services = [];
var rcLink = null; var rcLink = null;
status.services.forEach((service) => { status.services.forEach((service) => {
var repSelector = Kubernetes.getSelector(item); var repSelector = Kubernetes.getSelector(item);
var serviceSelector = Kubernetes.getSelector(service); var serviceSelector = Kubernetes.getSelector(service);
if (serviceSelector && repSelector && if (serviceSelector && repSelector &&
Kubernetes.selectorMatches(serviceSelector, repSelector) && Kubernetes.selectorMatches(serviceSelector, repSelector) &&
Kubernetes.getNamespace(service) === Kubernetes.getNamespace(item)) { Kubernetes.getNamespace(service) === Kubernetes.getNamespace(item)) {
status.routes.forEach((route) => { status.routes.forEach((route) => {
var serviceName = Kubernetes.getName(service); var serviceName = Kubernetes.getName(service);
if (serviceName === Kubernetes.getName(route)) { if (serviceName === Kubernetes.getName(route)) {
service["$route"] = route; service["$route"] = route;
service["$host"] = Core.pathGet(route, ["spec", "host"]); service["$host"] = Core.pathGet(route, ["spec", "host"]);
item.$services.push(service); item.$services.push(service);
if (!rcLink) { if (!rcLink) {
var url = Kubernetes.serviceLinkUrl(service, true); var url = Kubernetes.serviceLinkUrl(service, true);
if (url) { if (url) {
// TODO find icon etc? // TODO find icon etc?
rcLink = { rcLink = {
name: serviceName, name: serviceName,
href: url href: url
}; };
} }
} }
} }
}); });
} }
}); });
item["$serviceLink"] = rcLink; item["$serviceLink"] = rcLink;
} }
item.$buildId = annotations["fabric8.io/build-id"] || item.$buildId; item.$buildId = annotations["fabric8.io/build-id"] || item.$buildId;
item.$buildUrl = annotations["fabric8.io/build-url"] || item.$buildUrl; item.$buildUrl = annotations["fabric8.io/build-url"] || item.$buildUrl;
item.$gitCommit = annotations["fabric8.io/git-commit"] || item.$gitCommit; item.$gitCommit = annotations["fabric8.io/git-commit"] || item.$gitCommit;
item.$gitUrl = annotations["fabric8.io/git-url"] || item.$gitUrl; item.$gitUrl = annotations["fabric8.io/git-url"] || item.$gitUrl;
item.$gitBranch = annotations["fabric8.io/git-branch"] || item.$gitBranch; item.$gitBranch = annotations["fabric8.io/git-branch"] || item.$gitBranch;
if (!item.$gitCommit) { if (!item.$gitCommit) {
var image = getImage(item); var image = getImage(item);
if (image) { if (image) {
if (!$scope.$isWatchImages) { if (!$scope.$isWatchImages) {
$scope.$isWatchImages = true; $scope.$isWatchImages = true;
Kubernetes.watch($scope, $element, "images", null, (data) => { Kubernetes.watch($scope, $element, "images", null, (data) => {
imageStreamTags = data; imageStreamTags = data;
checkForMissingMetadata(); checkForMissingMetadata();
}); });
} else { } else {
checkForMissingMetadata(); checkForMissingMetadata();
} }
} }
function getImage(item) { function getImage(item) {
var image = ""; var image = "";
// lets see if we can find the commit id from a S2I image name // lets see if we can find the commit id from a S2I image name
// TODO needs this issue fixed to find it via an OpenShift annotation: // TODO needs this issue fixed to find it via an OpenShift annotation:
// https://github.com/openshift/origin/issues/6241 // https://github.com/openshift/origin/issues/6241
var containers = Core.pathGet(item, ["spec", "template", "spec", "containers"]); var containers = Core.pathGet(item, ["spec", "template", "spec", "containers"]);
if (containers && containers.length) { if (containers && containers.length) {
var container = containers[0]; var container = containers[0];
if (container) { if (container) {
image = container.image; image = container.image;
} }
} }
return image; return image;
} }
function checkForMissingMetadata() { function checkForMissingMetadata() {
angular.forEach(projects.versions, (vi) => { angular.forEach(projects.versions, (vi) => {
angular.forEach(vi.replicationControllers, (item, name) => { angular.forEach(vi.replicationControllers, (item, name) => {
if (!item.$gitCommit) { if (!item.$gitCommit) {
var image = getImage(item); var image = getImage(item);
if (image) { if (image) {
angular.forEach(imageStreamTags, (imageStreamTag) => { angular.forEach(imageStreamTags, (imageStreamTag) => {
var imageName = imageStreamTag.dockerImageReference; var imageName = imageStreamTag.dockerImageReference;
if (imageName && imageName === image) { if (imageName && imageName === image) {
var foundISTag = imageStreamTag; var foundISTag = imageStreamTag;
var manifestJSON = imageStreamTag.dockerImageManifest; var manifestJSON = imageStreamTag.dockerImageManifest;
if (manifestJSON) { if (manifestJSON) {
var manifest = angular.fromJson(manifestJSON) || {}; var manifest = angular.fromJson(manifestJSON) || {};
var history = manifest.history; var history = manifest.history;
if (history && history.length) { if (history && history.length) {
var v1 = history[0].v1Compatibility; var v1 = history[0].v1Compatibility;
if (v1) { if (v1) {
var data = angular.fromJson(v1); var data = angular.fromJson(v1);
var env = Core.pathGet(data, ["config", "Env"]); var env = Core.pathGet(data, ["config", "Env"]);
angular.forEach(env, (envExp) => { angular.forEach(env, (envExp) => {
if (envExp) { if (envExp) {
var values = envExp.split("="); var values = envExp.split("=");
if (values.length === 2 && values[0] == "OPENSHIFT_BUILD_NAME") { if (values.length === 2 && values[0] == "OPENSHIFT_BUILD_NAME") {
var buildName = values[1]; var buildName = values[1];
if (buildName) { if (buildName) {
item.$buildId = buildName; item.$buildId = buildName;
item.$buildUrl = Developer.projectWorkspaceLink(ns, projectName, "buildLogs/" + buildName); item.$buildUrl = Developer.projectWorkspaceLink(ns, projectName, "buildLogs/" + buildName);
} }
} }
} }
}); });
var labels = Core.pathGet(data, ["config", "Labels"]); var labels = Core.pathGet(data, ["config", "Labels"]);
if (labels) { if (labels) {
item.$gitCommit = labels["io.openshift.build.commit.id"] || item.$gitCommit; item.$gitCommit = labels["io.openshift.build.commit.id"] || item.$gitCommit;
item.$gitCommitAuthor = labels["io.openshift.build.commit.author"] || item.$gitCommitAuthor; item.$gitCommitAuthor = labels["io.openshift.build.commit.author"] || item.$gitCommitAuthor;
item.$gitCommitDate = labels["io.openshift.build.commit.date"] || item.$gitCommitDate; item.$gitCommitDate = labels["io.openshift.build.commit.date"] || item.$gitCommitDate;
item.$gitCommitMessage = labels["io.openshift.build.commit.message"] || item.$gitCommitMessage; item.$gitCommitMessage = labels["io.openshift.build.commit.message"] || item.$gitCommitMessage;
item.$gitBranch = labels["io.openshift.build.commit.ref"] || item.$gitBranch; item.$gitBranch = labels["io.openshift.build.commit.ref"] || item.$gitBranch;
if (!item.$gitUrl && item.$gitCommit) { if (!item.$gitUrl && item.$gitCommit) {
item.$gitUrl = Developer.projectWorkspaceLink(ns, projectName, "wiki/commitDetail///" + item.$gitCommit); item.$gitUrl = Developer.projectWorkspaceLink(ns, projectName, "wiki/commitDetail///" + item.$gitCommit);
} }
} }
} }
} }
} }
} }
}); });
} }
} }
}); });
}); });
} }
} }
if (selector) { if (selector) {
var selectorText = Kubernetes.labelsToString(selector, ","); var selectorText = Kubernetes.labelsToString(selector, ",");
var podLinkUrl = UrlHelpers.join(projectLink(projectName), "namespace", ns, "pods"); var podLinkUrl = UrlHelpers.join(projectLink(projectName), "namespace", ns, "pods");
item.pods = []; item.pods = [];
item.$podCounters = Kubernetes.createPodCounters(selector, status.pods, item.pods, selectorText, podLinkUrl); item.$podCounters = Kubernetes.createPodCounters(selector, status.pods, item.pods, selectorText, podLinkUrl);
} }
} }
}); });
// lets check for a project name if we have lots of RCs with no pods, lets remove them! // lets check for a project name if we have lots of RCs with no pods, lets remove them!
angular.forEach(projectInfos, (project, projectName) => { angular.forEach(projectInfos, (project, projectName) => {
var rcsNoPods = []; var rcsNoPods = [];
var rcsWithPods = []; var rcsWithPods = [];
angular.forEach(project.versions, (versionInfo) => { angular.forEach(project.versions, (versionInfo) => {
var rcs = versionInfo.replicationControllers; var rcs = versionInfo.replicationControllers;
angular.forEach(rcs, (item, name) => { angular.forEach(rcs, (item, name) => {
var count = Kubernetes.podCounterTotal(item.$podCounters); var count = Kubernetes.podCounterTotal(item.$podCounters);
if (count) { if (count) {
rcsWithPods.push(name); rcsWithPods.push(name);
} else { } else {
rcsNoPods.push(() => { rcsNoPods.push(() => {
delete rcs[name]; delete rcs[name];
}); });
} }
}); });
}); });
if (rcsWithPods.length) { if (rcsWithPods.length) {
// lets remove all the empty RCs // lets remove all the empty RCs
angular.forEach(rcsNoPods, (fn) => { angular.forEach(rcsNoPods, (fn) => {
fn(); fn();
}); });
} }
}); });
if (hasObjectChanged(projectInfos, cache)) { if (hasObjectChanged(projectInfos, cache)) {
log.debug("project versions has changed!"); log.debug("project versions has changed!");
answer[ns] = projectInfos; answer[ns] = projectInfos;
} }
} }
Kubernetes.watch($scope, $element, "replicationcontrollers", ns, (data) => { Kubernetes.watch($scope, $element, "replicationcontrollers", ns, (data) => {
if (data) { if (data) {
status.rcs = data; status.rcs = data;
updateModel(); updateModel();
} }
}); });
Kubernetes.watch($scope, $element, "services", ns, (data) => { Kubernetes.watch($scope, $element, "services", ns, (data) => {
if (data) { if (data) {
status.services = data; status.services = data;
updateModel(); updateModel();
} }
}); });
Kubernetes.watch($scope, $element, "routes", ns, (data) => { Kubernetes.watch($scope, $element, "routes", ns, (data) => {
if (data) { if (data) {
status.routes = data; status.routes = data;
updateModel(); updateModel();
} }
}); });
Kubernetes.watch($scope, $element, "pods", ns, (data) => { Kubernetes.watch($scope, $element, "pods", ns, (data) => {
if (data) { if (data) {
status.pods = data; status.pods = data;
updateModel(); updateModel();
} }
}); });
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +1,49 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
module Developer { module Developer {
export var _module = angular.module(pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'nvd3']); export var _module = angular.module(pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'nvd3']);
export var controller = PluginHelpers.createControllerFunction(_module, pluginName); export var controller = PluginHelpers.createControllerFunction(_module, pluginName);
export var route = PluginHelpers.createRoutingFunction(templatePath); export var route = PluginHelpers.createRoutingFunction(templatePath);
_module.config(['$routeProvider', ($routeProvider:ng.route.IRouteProvider) => { _module.config(['$routeProvider', ($routeProvider:ng.route.IRouteProvider) => {
$routeProvider.when(context, route('workspaces.html', false)) $routeProvider.when(context, route('workspaces.html', false))
.when("/data-manager", route('workspaces.html', false)) .when("/data-manager", route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/data-type/all'), route('workspaces.html', false)) .when(UrlHelpers.join(context, 'Overview/data-type/all'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/data-type/financial'), route('workspaces.html', false)) .when(UrlHelpers.join(context, 'Overview/data-type/financial'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/data-type/social-security'), route('workspaces.html', false)) .when(UrlHelpers.join(context, 'Overview/data-type/social-security'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'task'), route('apps.html', false)) .when(UrlHelpers.join(context, 'task'), route('apps.html', false))
.otherwise(context); .otherwise(context);
}]); }]);
_module.run(['viewRegistry', 'ServiceRegistry', 'HawtioNav', 'KubernetesModel', '$templateCache', (viewRegistry, ServiceRegistry, HawtioNav, KubernetesModel, $templateCache) => { _module.run(['viewRegistry', 'ServiceRegistry', 'HawtioNav', 'KubernetesModel', '$templateCache', (viewRegistry, ServiceRegistry, HawtioNav, KubernetesModel, $templateCache) => {
log.debug("Running"); log.debug("Running");
viewRegistry['workspaces'] = Kubernetes.templatePath + 'layoutKubernetes.html'; viewRegistry['workspaces'] = Kubernetes.templatePath + 'layoutKubernetes.html';
viewRegistry['namespaces'] = Kubernetes.templatePath + 'layoutKubernetes.html'; viewRegistry['namespaces'] = Kubernetes.templatePath + 'layoutKubernetes.html';
var builder = HawtioNav.builder(); var builder = HawtioNav.builder();
var dmanagerTab = builder.id('dmanager') var dmanagerTab = builder.id('dmanager')
.rank(200) .rank(200)
.href(() => context) .href(() => context)
.title(() => '数据管理') .title(() => '数据管理')
//.isValid(() => !Core.isRemoteConnection()) //.isValid(() => !Core.isRemoteConnection())
.build(); .build();
HawtioNav.add(dmanagerTab); HawtioNav.add(dmanagerTab);
}]); }]);
_module.filter('asTrustedHtml', ['$sce', function ($sce) { _module.filter('asTrustedHtml', ['$sce', function ($sce) {
return function (text) { return function (text) {
return $sce.trustAsHtml(text); return $sce.trustAsHtml(text);
}; };
}]); }]);
hawtioPluginLoader.addModule(pluginName); hawtioPluginLoader.addModule(pluginName);
// for scroll-glue directive // for scroll-glue directive
hawtioPluginLoader.addModule('luegg.directives'); hawtioPluginLoader.addModule('luegg.directives');
} }

View File

@ -1,22 +1,22 @@
/// <reference path="developerPlugin.ts"/> /// <reference path="developerPlugin.ts"/>
module Developer { module Developer {
_module.controller('Developer.EnvironmentPanelController', ($scope, $element, $location, $routeParams, KubernetesModel:Kubernetes.KubernetesModelService, $http, $timeout, KubernetesState, KubernetesApiURL) => { _module.controller('Developer.EnvironmentPanelController', ($scope, $element, $location, $routeParams, KubernetesModel:Kubernetes.KubernetesModelService, $http, $timeout, KubernetesState, KubernetesApiURL) => {
$scope.envVersions = {}; $scope.envVersions = {};
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.env = $scope.$eval('env'); $scope.env = $scope.$eval('env');
$scope.buildConfig = $scope.$eval('entity'); $scope.buildConfig = $scope.$eval('entity');
$scope.open = true; $scope.open = true;
$scope.toggle = () => $scope.open = !$scope.open; $scope.toggle = () => $scope.open = !$scope.open;
var caches = {}; var caches = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
loadProjectVersions($scope, $element, $scope.buildConfig, $scope.env, $scope.env.namespace, $scope.envVersions, caches); loadProjectVersions($scope, $element, $scope.buildConfig, $scope.env, $scope.env.namespace, $scope.envVersions, caches);
}); });
} }

View File

@ -1,17 +1,17 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var HomeController = controller("HomeController", export var HomeController = controller("HomeController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => {
$scope.namespace = Kubernetes.currentKubernetesNamespace(); $scope.namespace = Kubernetes.currentKubernetesNamespace();
}]); }]);
} }

View File

@ -1,94 +1,94 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var JenkinsJobController = controller("JenkinsJobController", export var JenkinsJobController = controller("JenkinsJobController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"]; $scope.jobId = $routeParams["job"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id); $scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId); $scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateData(); updateData();
}); });
$scope.$on('$routeUpdate', ($event) => { $scope.$on('$routeUpdate', ($event) => {
updateData(); updateData();
}); });
$scope.tableConfig = { $scope.tableConfig = {
data: 'job.builds', data: 'job.builds',
showSelectionCheckbox: true, showSelectionCheckbox: true,
enableRowClickSelection: false, enableRowClickSelection: false,
multiSelect: true, multiSelect: true,
selectedItems: [], selectedItems: [],
filterOptions: { filterOptions: {
filterText: $location.search()["q"] || '' filterText: $location.search()["q"] || ''
}, },
columnDefs: [ columnDefs: [
{ {
field: '$sortOrder', field: '$sortOrder',
displayName: 'Name', displayName: 'Name',
cellTemplate: $templateCache.get("jenkinsBuildIdTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildIdTemplate.html")
}, },
{ {
field: '$buildLink', field: '$buildLink',
displayName: 'Views', displayName: 'Views',
cellTemplate: $templateCache.get("jenkinsBuildButtonsTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildButtonsTemplate.html")
}, },
{ {
field: '$duration', field: '$duration',
displayName: 'Duration', displayName: 'Duration',
cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html")
}, },
{ {
field: '$timestamp', field: '$timestamp',
displayName: 'Time Started', displayName: 'Time Started',
cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html")
} }
] ]
}; };
updateData(); updateData();
function updateData() { function updateData() {
if ($scope.jobId) { if ($scope.jobId) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, "api/json?depth=1")); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, "api/json?depth=1"));
if (url && (!$scope.job || Kubernetes.keepPollingModel)) { if (url && (!$scope.job || Kubernetes.keepPollingModel)) {
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
enrichJenkinsJob(data, $scope.id, $scope.jobId); enrichJenkinsJob(data, $scope.id, $scope.jobId);
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.job = data; $scope.job = data;
} }
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
}); });
} }
} else { } else {
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
} }
} }
}]); }]);
} }

View File

@ -1,101 +1,101 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var JenkinsJobsController = controller("JenkinsJobsController", export var JenkinsJobsController = controller("JenkinsJobsController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.jenkins = null; $scope.jenkins = null;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = createProjectBreadcrumbs(); $scope.breadcrumbConfig = createProjectBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars(); $scope.subTabConfig = Developer.createWorkspaceSubNavBars();
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateData(); updateData();
}); });
$scope.$on('$routeUpdate', ($event) => { $scope.$on('$routeUpdate', ($event) => {
updateData(); updateData();
}); });
$scope.tableConfig = { $scope.tableConfig = {
data: 'jenkins.jobs', data: 'jenkins.jobs',
showSelectionCheckbox: true, showSelectionCheckbox: true,
enableRowClickSelection: false, enableRowClickSelection: false,
multiSelect: true, multiSelect: true,
selectedItems: [], selectedItems: [],
filterOptions: { filterOptions: {
filterText: $location.search()["q"] || '' filterText: $location.search()["q"] || ''
}, },
columnDefs: [ columnDefs: [
{ {
field: 'name', field: 'name',
displayName: 'Name', displayName: 'Name',
cellTemplate: $templateCache.get("jenkinsJobNameTemplate.html") cellTemplate: $templateCache.get("jenkinsJobNameTemplate.html")
}, },
{ {
field: '$buildLink', field: '$buildLink',
displayName: 'Views', displayName: 'Views',
cellTemplate: $templateCache.get("jenkinsJobButtonsTemplate.html") cellTemplate: $templateCache.get("jenkinsJobButtonsTemplate.html")
}, },
{ {
field: '$lastSuccessfulBuildNumber', field: '$lastSuccessfulBuildNumber',
displayName: 'Last Success', displayName: 'Last Success',
cellTemplate: $templateCache.get("jenkinsLastSuccessTemplate.html") cellTemplate: $templateCache.get("jenkinsLastSuccessTemplate.html")
}, },
{ {
field: '$lastFailedlBuildNumber', field: '$lastFailedlBuildNumber',
displayName: 'Last Failure', displayName: 'Last Failure',
cellTemplate: $templateCache.get("jenkinsLastFailureTemplate.html") cellTemplate: $templateCache.get("jenkinsLastFailureTemplate.html")
}, },
{ {
field: '$duration', field: '$duration',
displayName: 'Last Duration', displayName: 'Last Duration',
cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html")
}, },
{ {
field: '$timestamp', field: '$timestamp',
displayName: 'Time Started', displayName: 'Time Started',
cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html") cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html")
} }
] ]
}; };
updateData(); updateData();
function updateData() { function updateData() {
// TODO only need depth 2 to be able to fetch the lastBuild // TODO only need depth 2 to be able to fetch the lastBuild
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, "api/json?depth=2"); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, "api/json?depth=2");
log.info(""); log.info("");
if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) { if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) {
$http.get(url, jenkinsHttpConfig). $http.get(url, jenkinsHttpConfig).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
enrichJenkinsJobs(data, $scope.id, $scope.id); enrichJenkinsJobs(data, $scope.id, $scope.id);
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.jenkins = data; $scope.jenkins = data;
} }
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
}); });
} }
} }
}]); }]);
} }

View File

@ -1,350 +1,350 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesInterfaces.ts"/> /// <reference path="../../kubernetes/ts/kubernetesInterfaces.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesModel.ts"/> /// <reference path="../../kubernetes/ts/kubernetesModel.ts"/>
/// <reference path="developerPlugin.ts"/> /// <reference path="developerPlugin.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export function clickApprove(element, url) { export function clickApprove(element, url) {
var $scope: any = angular.element(element).scope(); var $scope: any = angular.element(element).scope();
if ($scope) { if ($scope) {
$scope.approve(url, element.text); $scope.approve(url, element.text);
} }
} }
export var JenkinsLogController = _module.controller("Developer.JenkinsLogController", ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, export var JenkinsLogController = _module.controller("Developer.JenkinsLogController", ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, $modal, KubernetesApiURL, ServiceRegistry, $element) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, $modal, KubernetesApiURL, ServiceRegistry, $element) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.selectedBuild = $scope.$eval('build') || $scope.$eval('selectedBuild'); $scope.selectedBuild = $scope.$eval('build') || $scope.$eval('selectedBuild');
$scope.id = $scope.$eval('build.id') || $routeParams["id"]; $scope.id = $scope.$eval('build.id') || $routeParams["id"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
$element.on('$destroy', () => { $element.on('$destroy', () => {
$scope.$destroy(); $scope.$destroy();
}); });
$scope.log = { $scope.log = {
html: "", html: "",
start: 0, start: 0,
firstIdx: null firstIdx: null
}; };
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateJenkinsLink(); updateJenkinsLink();
Core.$apply($scope); Core.$apply($scope);
}); });
$scope.$on('jenkinsSelectedBuild', (event, build) => { $scope.$on('jenkinsSelectedBuild', (event, build) => {
log.info("==== jenkins build selected! " + build.id + " " + build.$jobId); log.info("==== jenkins build selected! " + build.id + " " + build.$jobId);
$scope.selectedBuild = build; $scope.selectedBuild = build;
}); });
$scope.$watch('selectedBuild', (selectedBuild) => { $scope.$watch('selectedBuild', (selectedBuild) => {
log.info("Selected build updated: ", selectedBuild); log.info("Selected build updated: ", selectedBuild);
$scope.fetch(); $scope.fetch();
}); });
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = createJenkinsBreadcrumbs($scope.id, getJobId(), getBuildId()); $scope.breadcrumbConfig = createJenkinsBreadcrumbs($scope.id, getJobId(), getBuildId());
$scope.subTabConfig = createJenkinsSubNavBars($scope.id, getJobId(), getBuildId(), { $scope.subTabConfig = createJenkinsSubNavBars($scope.id, getJobId(), getBuildId(), {
label: "Log", label: "Log",
title: "Views the logs of this build" title: "Views the logs of this build"
}); });
function getJobId() { function getJobId() {
// lets allow the parent scope to be used too for when this is used as a panel // lets allow the parent scope to be used too for when this is used as a panel
return $routeParams["job"] || ($scope.selectedBuild || {}).$jobId; return $routeParams["job"] || ($scope.selectedBuild || {}).$jobId;
} }
$scope.getJobId = getJobId; $scope.getJobId = getJobId;
function getBuildId() { function getBuildId() {
// lets allow the parent scope to be used too for when this is used as a panel // lets allow the parent scope to be used too for when this is used as a panel
return $routeParams["build"] || ($scope.selectedBuild || {}).id; return $routeParams["build"] || ($scope.selectedBuild || {}).id;
} }
$scope.getBuildId = getBuildId; $scope.getBuildId = getBuildId;
function updateJenkinsLink() { function updateJenkinsLink() {
var jenkinsUrl = jenkinsLink(); var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) { if (jenkinsUrl) {
$scope.$viewJenkinsBuildLink = UrlHelpers.join(jenkinsUrl, "job", getJobId(), getBuildId()); $scope.$viewJenkinsBuildLink = UrlHelpers.join(jenkinsUrl, "job", getJobId(), getBuildId());
$scope.$viewJenkinsLogLink = UrlHelpers.join($scope.$viewJenkinsBuildLink, "console"); $scope.$viewJenkinsLogLink = UrlHelpers.join($scope.$viewJenkinsBuildLink, "console");
} }
} }
var querySize = 50000; var querySize = 50000;
$scope.approve = (url, operation) => { $scope.approve = (url, operation) => {
var modal = $modal.open({ var modal = $modal.open({
templateUrl: UrlHelpers.join(templatePath, 'jenkinsApproveModal.html'), templateUrl: UrlHelpers.join(templatePath, 'jenkinsApproveModal.html'),
controller: ['$scope', '$modalInstance', ($scope, $modalInstance) => { controller: ['$scope', '$modalInstance', ($scope, $modalInstance) => {
$scope.operation = operation; $scope.operation = operation;
$scope.header = operation + "?"; $scope.header = operation + "?";
$scope.ok = () => { $scope.ok = () => {
modal.close(); modal.close();
postToJenkins(url, operation); postToJenkins(url, operation);
}; };
$scope.cancel = () => { $scope.cancel = () => {
modal.dismiss(); modal.dismiss();
}; };
}] }]
}); });
}; };
function postToJenkins(uri, operation) { function postToJenkins(uri, operation) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, uri); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, uri);
if (url) { if (url) {
var body = null; var body = null;
var config = { var config = {
headers: { headers: {
} }
}; };
log.info("posting to jenkinsUrl: " + url); log.info("posting to jenkinsUrl: " + url);
$http.post(url, body, config). $http.post(url, body, config).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
log.info("Managed to " + operation + " at " + url); log.info("Managed to " + operation + " at " + url);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed " + operation + " job at " + url + " " + data + " " + status); log.warn("Failed " + operation + " job at " + url + " " + data + " " + status);
}); });
} else { } else {
log.warn("Cannot post to jenkins URI: " + uri + " as no jenkins found!"); log.warn("Cannot post to jenkins URI: " + uri + " as no jenkins found!");
} }
} }
$scope.$keepPolling = () => Kubernetes.keepPollingModel; $scope.$keepPolling = () => Kubernetes.keepPollingModel;
$scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => { $scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
if ($scope.$eval('hideLogs && !build.building')) { if ($scope.$eval('hideLogs && !build.building')) {
log.debug("Log hidden, not fetching logs"); log.debug("Log hidden, not fetching logs");
return; return;
} else { } else {
log.debug("Fetching logs for build: ", $scope.$eval('build')); log.debug("Fetching logs for build: ", $scope.$eval('build'));
} }
var buildId = getBuildId(); var buildId = getBuildId();
var jobId = getJobId(); var jobId = getJobId();
//log.info("=== jenkins log querying job " + jobId + " build " + buildId + " selected build " + $scope.selectedBuild); //log.info("=== jenkins log querying job " + jobId + " build " + buildId + " selected build " + $scope.selectedBuild);
if (jobId && buildId) { if (jobId && buildId) {
if ($scope.buildId !== buildId || $scope.jobId !== jobId) { if ($scope.buildId !== buildId || $scope.jobId !== jobId) {
// lets clear the query // lets clear the query
$scope.log = { $scope.log = {
html: "", html: "",
start: 0, start: 0,
firstIdx: null firstIdx: null
}; };
} }
$scope.buildId = buildId; $scope.buildId = buildId;
$scope.jobId = jobId; $scope.jobId = jobId;
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", jobId, buildId, "fabric8/logHtml?tail=1&start=" + $scope.log.start + "&size=" + querySize)); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", jobId, buildId, "fabric8/logHtml?tail=1&start=" + $scope.log.start + "&size=" + querySize));
if ($scope.log.firstIdx !== null) { if ($scope.log.firstIdx !== null) {
url += "&first=" + $scope.log.firstIdx; url += "&first=" + $scope.log.firstIdx;
} }
if (url && (!$scope.log.fetched || Kubernetes.keepPollingModel)) { if (url && (!$scope.log.fetched || Kubernetes.keepPollingModel)) {
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
var replaceClusterIPsInHtml = replaceClusterIpFunction(); var replaceClusterIPsInHtml = replaceClusterIpFunction();
if (!$scope.log.logs) { if (!$scope.log.logs) {
$scope.log.logs = []; $scope.log.logs = [];
} }
var lines = data.lines; var lines = data.lines;
var returnedLength = data.returnedLength; var returnedLength = data.returnedLength;
var logLength = data.logLength; var logLength = data.logLength;
var returnedStart = data.start; var returnedStart = data.start;
var earlierLog = false; var earlierLog = false;
if (angular.isDefined(returnedStart)) { if (angular.isDefined(returnedStart)) {
earlierLog = returnedStart < $scope.log.start; earlierLog = returnedStart < $scope.log.start;
} }
var lineSplit = data.lineSplit; var lineSplit = data.lineSplit;
// log.info("start was: " + $scope.log.start + " first: " + $scope.log.firstIdx + " => returnedLength: " + returnedLength + " logLength: " + logLength + " returnedStart: " + returnedStart + " earlierLog: " + earlierLog + " lineSplit: " + lineSplit); // log.info("start was: " + $scope.log.start + " first: " + $scope.log.firstIdx + " => returnedLength: " + returnedLength + " logLength: " + logLength + " returnedStart: " + returnedStart + " earlierLog: " + earlierLog + " lineSplit: " + lineSplit);
if (lines) { if (lines) {
var currentLogs = $scope.log.logs; var currentLogs = $scope.log.logs;
// lets re-join split lines // lets re-join split lines
if (lineSplit && currentLogs.length) { if (lineSplit && currentLogs.length) {
var lastIndex; var lastIndex;
var restOfLine; var restOfLine;
if (earlierLog) { if (earlierLog) {
lastIndex = 0; lastIndex = 0;
restOfLine = lines.pop(); restOfLine = lines.pop();
if (restOfLine) { if (restOfLine) {
currentLogs[lastIndex] = replaceClusterIPsInHtml(restOfLine + currentLogs[lastIndex]); currentLogs[lastIndex] = replaceClusterIPsInHtml(restOfLine + currentLogs[lastIndex]);
} }
} else { } else {
lastIndex = currentLogs.length - 1; lastIndex = currentLogs.length - 1;
restOfLine = lines.shift(); restOfLine = lines.shift();
if (restOfLine) { if (restOfLine) {
currentLogs[lastIndex] = replaceClusterIPsInHtml(currentLogs[lastIndex] + restOfLine); currentLogs[lastIndex] = replaceClusterIPsInHtml(currentLogs[lastIndex] + restOfLine);
} }
} }
} }
for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length; i++) {
lines[i] = replaceClusterIPsInHtml(lines[i]); lines[i] = replaceClusterIPsInHtml(lines[i]);
} }
if (earlierLog) { if (earlierLog) {
$scope.log.logs = lines.concat(currentLogs); $scope.log.logs = lines.concat(currentLogs);
} else { } else {
$scope.log.logs = currentLogs.concat(lines); $scope.log.logs = currentLogs.concat(lines);
} }
} }
var moveForward = true; var moveForward = true;
if (angular.isDefined(returnedStart)) { if (angular.isDefined(returnedStart)) {
if (returnedStart > $scope.log.start && $scope.log.start === 0) { if (returnedStart > $scope.log.start && $scope.log.start === 0) {
// we've jumped to the end of the file to read the tail of it // we've jumped to the end of the file to read the tail of it
$scope.log.start = returnedStart; $scope.log.start = returnedStart;
$scope.log.firstIdx = returnedStart; $scope.log.firstIdx = returnedStart;
} else if ($scope.log.firstIdx === null) { } else if ($scope.log.firstIdx === null) {
// lets remember where the first request started // lets remember where the first request started
$scope.log.firstIdx = returnedStart; $scope.log.firstIdx = returnedStart;
} else if (returnedStart < $scope.log.firstIdx) { } else if (returnedStart < $scope.log.firstIdx) {
// we've got an earlier bit of the log // we've got an earlier bit of the log
// after starting at the tail // after starting at the tail
// so lets move firstIdx backwards and leave start as it is (at the end of the file) // so lets move firstIdx backwards and leave start as it is (at the end of the file)
$scope.log.firstIdx = returnedStart; $scope.log.firstIdx = returnedStart;
moveForward = false; moveForward = false;
} }
} }
if (moveForward && returnedLength && !earlierLog) { if (moveForward && returnedLength && !earlierLog) {
$scope.log.start += returnedLength; $scope.log.start += returnedLength;
if (logLength && $scope.log.start > logLength) { if (logLength && $scope.log.start > logLength) {
$scope.log.start = logLength; $scope.log.start = logLength;
} }
} }
updateJenkinsLink(); updateJenkinsLink();
} }
$scope.log.fetched = true; $scope.log.fetched = true;
// Core.$apply($scope); // Core.$apply($scope);
next(); next();
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
next(); next();
}); });
} }
} else { } else {
$scope.log.fetched = true; $scope.log.fetched = true;
Core.$apply($scope); Core.$apply($scope);
next(); next();
} }
}); });
if (angular.isFunction($scope.fetch)) { if (angular.isFunction($scope.fetch)) {
$scope.fetch(); $scope.fetch();
} }
function replaceClusterIpFunction() { function replaceClusterIpFunction() {
function createReplaceFunction(from, to) { function createReplaceFunction(from, to) {
return (text) => replaceText(text, from, to); return (text) => replaceText(text, from, to);
} }
var replacements = []; var replacements = [];
angular.forEach($scope.model.services, (service) => { angular.forEach($scope.model.services, (service) => {
var $portalIP = service.$portalIP; var $portalIP = service.$portalIP;
var $serviceUrl = service.$serviceUrl; var $serviceUrl = service.$serviceUrl;
var $portsText = service.$portsText; var $portsText = service.$portsText;
if ($portalIP && $serviceUrl) { if ($portalIP && $serviceUrl) {
var idx = $serviceUrl.indexOf("://"); var idx = $serviceUrl.indexOf("://");
if (idx > 0) { if (idx > 0) {
var replaceWith = $serviceUrl.substring(idx, $serviceUrl.length); var replaceWith = $serviceUrl.substring(idx, $serviceUrl.length);
if (!replaceWith.endsWith("/")) { if (!replaceWith.endsWith("/")) {
replaceWith += "/"; replaceWith += "/";
} }
if (replaceWith.length > 4) { if (replaceWith.length > 4) {
replacements.push(createReplaceFunction( replacements.push(createReplaceFunction(
"://" + $portalIP + "/", "://" + $portalIP + "/",
replaceWith replaceWith
)); ));
if ($portsText) { if ($portsText) {
var suffix = ":" + $portsText; var suffix = ":" + $portsText;
var serviceWithPort = replaceWith.substring(0, replaceWith.length - 1); var serviceWithPort = replaceWith.substring(0, replaceWith.length - 1);
if (!serviceWithPort.endsWith(suffix)) { if (!serviceWithPort.endsWith(suffix)) {
serviceWithPort += suffix; serviceWithPort += suffix;
} }
serviceWithPort += "/"; serviceWithPort += "/";
replacements.push(createReplaceFunction( replacements.push(createReplaceFunction(
"://" + $portalIP + ":" + $portsText + "/", "://" + $portalIP + ":" + $portsText + "/",
serviceWithPort serviceWithPort
)); ));
} }
} }
} }
} }
}); });
function addReplaceFn(from, to) { function addReplaceFn(from, to) {
replacements.push((text) => { replacements.push((text) => {
return replaceText(text, from, to); return replaceText(text, from, to);
}); });
} }
addReplaceFn("[INFO]", "<span class='log-success'>[INFO]</span>"); addReplaceFn("[INFO]", "<span class='log-success'>[INFO]</span>");
addReplaceFn("[WARN]", "<span class='log-warn'>[WARN]</span>"); addReplaceFn("[WARN]", "<span class='log-warn'>[WARN]</span>");
addReplaceFn("[WARNING]", "<span class='log-warn'>[WARNING]</span>"); addReplaceFn("[WARNING]", "<span class='log-warn'>[WARNING]</span>");
addReplaceFn("[ERROR]", "<span class='log-error'>[ERROR]</span>"); addReplaceFn("[ERROR]", "<span class='log-error'>[ERROR]</span>");
addReplaceFn("FAILURE", "<span class='log-error'>FAILURE</span>"); addReplaceFn("FAILURE", "<span class='log-error'>FAILURE</span>");
addReplaceFn("SUCCESS", "<span class='log-success'>SUCCESS</span>"); addReplaceFn("SUCCESS", "<span class='log-success'>SUCCESS</span>");
// lets try convert the Proceed / Abort links // lets try convert the Proceed / Abort links
replacements.push((text) => { replacements.push((text) => {
var prefix = "<a href='#' onclick=\"new Ajax.Request('"; var prefix = "<a href='#' onclick=\"new Ajax.Request('";
var idx = 0; var idx = 0;
while (idx >= 0) { while (idx >= 0) {
idx = text.indexOf(prefix, idx); idx = text.indexOf(prefix, idx);
if (idx >= 0) { if (idx >= 0) {
var start = idx + prefix.length; var start = idx + prefix.length;
var endQuote = text.indexOf("'", start + 1); var endQuote = text.indexOf("'", start + 1);
if (endQuote <= 0) { if (endQuote <= 0) {
break; break;
} }
var endDoubleQuote = text.indexOf('"', endQuote + 1); var endDoubleQuote = text.indexOf('"', endQuote + 1);
if (endDoubleQuote <= 0) { if (endDoubleQuote <= 0) {
break; break;
} }
var url = text.substring(start, endQuote); var url = text.substring(start, endQuote);
// TODO using $compile is a tad complex, for now lets cheat with a little onclick ;) // TODO using $compile is a tad complex, for now lets cheat with a little onclick ;)
//text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' ng-click=\"approve('" + url + "')\"" + text.substring(endDoubleQuote + 1); //text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' ng-click=\"approve('" + url + "')\"" + text.substring(endDoubleQuote + 1);
text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' onclick=\"Developer.clickApprove(this, '" + url + "')\"" + text.substring(endDoubleQuote + 1); text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' onclick=\"Developer.clickApprove(this, '" + url + "')\"" + text.substring(endDoubleQuote + 1);
} }
} }
return text; return text;
}); });
return function(text) { return function(text) {
var answer = text; var answer = text;
angular.forEach(replacements, (fn) => { angular.forEach(replacements, (fn) => {
answer = fn(answer); answer = fn(answer);
}); });
return answer; return answer;
} }
} }
function replaceText(text, from, to) { function replaceText(text, from, to) {
if (from && to && text) { if (from && to && text) {
//log.info("Replacing '" + from + "' => '" + to + "'"); //log.info("Replacing '" + from + "' => '" + to + "'");
var idx = 0; var idx = 0;
while (true) { while (true) {
idx = text.indexOf(from, idx); idx = text.indexOf(from, idx);
if (idx >= 0) { if (idx >= 0) {
text = text.substring(0, idx) + to + text.substring(idx + from.length); text = text.substring(0, idx) + to + text.substring(idx + from.length);
idx += to.length; idx += to.length;
} else { } else {
break; break;
} }
} }
} }
return text; return text;
} }
}); });
} }

View File

@ -1,181 +1,181 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var JenkinsMetricsController = controller("JenkinsMetricsController", export var JenkinsMetricsController = controller("JenkinsMetricsController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"]; $scope.jobId = $routeParams["job"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.jenkins = null; $scope.jenkins = null;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id); $scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId); $scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateData(); updateData();
}); });
$scope.$on('$routeUpdate', ($event) => { $scope.$on('$routeUpdate', ($event) => {
updateData(); updateData();
}); });
$scope.options = { $scope.options = {
chart: { chart: {
type: 'discreteBarChart', type: 'discreteBarChart',
autorefresh: false, autorefresh: false,
height: 450, height: 450,
margin: { margin: {
top: 20, top: 20,
right: 20, right: 20,
bottom: 60, bottom: 60,
left: 45 left: 45
}, },
clipEdge: true, clipEdge: true,
staggerLabels: false, staggerLabels: false,
transitionDuration: 500, transitionDuration: 500,
stacked: false, stacked: false,
interactive: true, interactive: true,
tooltip: { tooltip: {
enabled: true, enabled: true,
contentGenerator: (args) => { contentGenerator: (args) => {
var data = args.data || {}; var data = args.data || {};
return data.tooltip; return data.tooltip;
}, },
}, },
color: (d, i) => { color: (d, i) => {
return d.color; return d.color;
}, },
xAxis: { xAxis: {
axisLabel: 'Builds', axisLabel: 'Builds',
showMaxMin: false, showMaxMin: false,
tickFormat: function (d) { tickFormat: function (d) {
return "#" + d; return "#" + d;
} }
}, },
yAxis: { yAxis: {
axisLabel: 'Build Duration (seconds)', axisLabel: 'Build Duration (seconds)',
tickFormat: function (d) { tickFormat: function (d) {
return d3.format(',.1f')(d); return d3.format(',.1f')(d);
} }
} }
} }
}; };
$scope.data = []; $scope.data = [];
updateData(); updateData();
function barColourForBuildResult(result) { function barColourForBuildResult(result) {
if (result) { if (result) {
if (result === "FAILURE" || result === "FAILED") { if (result === "FAILURE" || result === "FAILED") {
return "red"; return "red";
} else if (result === "ABORTED" || result === "INTERUPTED") { } else if (result === "ABORTED" || result === "INTERUPTED") {
return "tan"; return "tan";
} else if (result === "SUCCESS") { } else if (result === "SUCCESS") {
return "green"; return "green";
} else if (result === "NOT_STARTED") { } else if (result === "NOT_STARTED") {
return "lightgrey" return "lightgrey"
} }
} }
return "darkgrey"; return "darkgrey";
} }
function updateChartData() { function updateChartData() {
var useSingleSet = true; var useSingleSet = true;
var buildsSucceeded = []; var buildsSucceeded = [];
var buildsFailed = []; var buildsFailed = [];
var successBuildKey = "Succeeded builds"; var successBuildKey = "Succeeded builds";
var failedBuildKey = "Failed builds"; var failedBuildKey = "Failed builds";
if (useSingleSet) { if (useSingleSet) {
successBuildKey = "Builds"; successBuildKey = "Builds";
} }
var count = 0; var count = 0;
var builds = _.sortBy($scope.metrics.builds || [], "number"); var builds = _.sortBy($scope.metrics.builds || [], "number");
angular.forEach(builds, (build:any) => { angular.forEach(builds, (build:any) => {
var x = build.number; var x = build.number;
var y = build.duration / 1000; var y = build.duration / 1000;
var date = Developer.asDate(build.timeInMillis); var date = Developer.asDate(build.timeInMillis);
var result = build.result || "NOT_STARTED"; var result = build.result || "NOT_STARTED";
var color = barColourForBuildResult(result); var color = barColourForBuildResult(result);
var iconClass = createBuildStatusIconClass(result); var iconClass = createBuildStatusIconClass(result);
var tooltip = '<h3><i class="' + iconClass + '"></i> ' + build.displayName + '</h3>' + var tooltip = '<h3><i class="' + iconClass + '"></i> ' + build.displayName + '</h3>' +
'<p>duration: <b>' + y + '</b> seconds</p>'; '<p>duration: <b>' + y + '</b> seconds</p>';
if (date) { if (date) {
tooltip += '<p>started: <b>' + date + '</b></p>'; tooltip += '<p>started: <b>' + date + '</b></p>';
} }
if (result) { if (result) {
tooltip += '<p>result: <b>' + result + '</b></p>'; tooltip += '<p>result: <b>' + result + '</b></p>';
} }
if (x) { if (x) {
var data = buildsSucceeded; var data = buildsSucceeded;
var key = successBuildKey; var key = successBuildKey;
if (!successBuildKey && (!result || !result.startsWith("SUCC"))) { if (!successBuildKey && (!result || !result.startsWith("SUCC"))) {
data = buildsFailed; data = buildsFailed;
key = failedBuildKey; key = failedBuildKey;
} }
data.push({ data.push({
tooltip: tooltip, tooltip: tooltip,
color: color, color: color,
x: x, y: y}); x: x, y: y});
} }
}); });
$scope.data = []; $scope.data = [];
if (buildsSucceeded.length) { if (buildsSucceeded.length) {
$scope.data.push({ $scope.data.push({
key: successBuildKey, key: successBuildKey,
values: buildsSucceeded values: buildsSucceeded
}); });
} }
if (buildsFailed.length) { if (buildsFailed.length) {
$scope.data.push({ $scope.data.push({
key: failedBuildKey, key: failedBuildKey,
values: buildsFailed values: buildsFailed
}); });
} }
$scope.api.updateWithData($scope.data); $scope.api.updateWithData($scope.data);
$timeout(() => { $timeout(() => {
$scope.api.update(); $scope.api.update();
}, 50); }, 50);
} }
function updateData() { function updateData() {
var metricsPath = $scope.jobId ? UrlHelpers.join("job", $scope.jobId, "fabric8/metrics") : "fabric8/metrics"; var metricsPath = $scope.jobId ? UrlHelpers.join("job", $scope.jobId, "fabric8/metrics") : "fabric8/metrics";
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, metricsPath); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, metricsPath);
log.info(""); log.info("");
if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) { if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) {
$http.get(url, jenkinsHttpConfig). $http.get(url, jenkinsHttpConfig).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.metrics = data; $scope.metrics = data;
updateChartData(); updateChartData();
} }
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
}); });
} }
} }
}]); }]);
} }

View File

@ -1,25 +1,25 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var NavBarController = controller("NavBarController", export var NavBarController = controller("NavBarController",
["$scope", "$location", "$routeParams", "$timeout", "KubernetesApiURL", ["$scope", "$location", "$routeParams", "$timeout", "KubernetesApiURL",
($scope, $location:ng.ILocationService, $routeParams, $timeout) => { ($scope, $location:ng.ILocationService, $routeParams, $timeout) => {
$scope.isValid = (item) => { $scope.isValid = (item) => {
if (item) { if (item) {
var value = item.isValid; var value = item.isValid;
if (angular.isFunction(value)) { if (angular.isFunction(value)) {
return value(item) return value(item)
} else { } else {
return angular.isUndefined(value) || value; return angular.isUndefined(value) || value;
} }
} }
return false; return false;
} }
}]); }]);
} }

View File

@ -1,67 +1,67 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var PipelineController = controller("PipelineController", export var PipelineController = controller("PipelineController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.kubeModel = KubernetesModel; $scope.kubeModel = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"]; $scope.jobId = $routeParams["job"];
$scope.buildId = $routeParams["build"]; $scope.buildId = $routeParams["build"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
$scope.model = { $scope.model = {
stages: null stages: null
}; };
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id); $scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId); $scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateData(); updateData();
}); });
$scope.$on('$routeUpdate', ($event) => { $scope.$on('$routeUpdate', ($event) => {
updateData(); updateData();
}); });
updateData(); updateData();
function updateData() { function updateData() {
if ($scope.jobId) { if ($scope.jobId) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, $scope.buildId, "fabric8/stages/")); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, $scope.buildId, "fabric8/stages/"));
if (url && (!$scope.model.stages || Kubernetes.keepPollingModel)) { if (url && (!$scope.model.stages || Kubernetes.keepPollingModel)) {
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
enrichJenkinsStages(data, $scope.id, $scope.jobId); enrichJenkinsStages(data, $scope.id, $scope.jobId);
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.build = data; $scope.build = data;
$scope.model.stages = data.stages; $scope.model.stages = data.stages;
} }
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
$scope.model.fetched = true; $scope.model.fetched = true;
}); });
} }
} else { } else {
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
} }
} }
}]); }]);
} }

View File

@ -1,13 +1,13 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
_module.directive("pipelineView", () => { _module.directive("pipelineView", () => {
return { return {
templateUrl: templatePath + 'pipelineView.html' templateUrl: templatePath + 'pipelineView.html'
}; };
}); });
} }

View File

@ -1,165 +1,165 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerPlugin.ts"/> /// <reference path="developerPlugin.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var PipelinesController = _module.controller("Developer.PipelinesController", ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, export var PipelinesController = _module.controller("Developer.PipelinesController", ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry, $element) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry, $element) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.kubeModel = KubernetesModel; $scope.kubeModel = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.jobId = $scope.jobId || $routeParams["job"]; $scope.jobId = $scope.jobId || $routeParams["job"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
$element.on('$destroy', () => { $element.on('$destroy', () => {
$scope.$destroy(); $scope.$destroy();
}); });
$scope.model = { $scope.model = {
job: null, job: null,
pendingOnly: $scope.pendingPipelinesOnly pendingOnly: $scope.pendingPipelinesOnly
}; };
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id); $scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId); $scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () { $scope.$on('kubernetesModelUpdated', function () {
updateData(); updateData();
}); });
$scope.$on('$routeUpdate', ($event) => { $scope.$on('$routeUpdate', ($event) => {
updateData(); updateData();
}); });
$scope.$watch('model.pendingOnly', ($event) => { $scope.$watch('model.pendingOnly', ($event) => {
updateData(); updateData();
}); });
$scope.selectBuild = (build) => { $scope.selectBuild = (build) => {
var id = build.id; var id = build.id;
if (id) { if (id) {
if (id !== $scope.selectedBuildId) { if (id !== $scope.selectedBuildId) {
$scope.selectedBuildId = id; $scope.selectedBuildId = id;
$scope.$broadcast("jenkinsSelectedBuild", build); $scope.$broadcast("jenkinsSelectedBuild", build);
} }
} }
}; };
var updateData = _.debounce(() => { var updateData = _.debounce(() => {
var entity = $scope.entity; var entity = $scope.entity;
if ($scope.jobId) { if ($scope.jobId) {
if ((!entity || entity.$jenkinsJob)) { if ((!entity || entity.$jenkinsJob)) {
var queryPath = "fabric8/stages/"; var queryPath = "fabric8/stages/";
if ($scope.model.pendingOnly) { if ($scope.model.pendingOnly) {
queryPath = "fabric8/pendingStages/"; queryPath = "fabric8/pendingStages/";
} }
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, queryPath)); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, queryPath));
if (url && (!$scope.model.job || Kubernetes.keepPollingModel)) { if (url && (!$scope.model.job || Kubernetes.keepPollingModel)) {
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
enrichJenkinsPipelineJob(data, $scope.id, $scope.jobId); enrichJenkinsPipelineJob(data, $scope.id, $scope.jobId);
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.model.job = data; $scope.model.job = data;
var builds = data.builds; var builds = data.builds;
if (builds && builds.length) { if (builds && builds.length) {
$scope.selectBuild(builds[0]); $scope.selectBuild(builds[0]);
} }
} }
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
$scope.model.fetched = true; $scope.model.fetched = true;
}); });
} }
} else { } else {
if ($scope.model) { if ($scope.model) {
Kubernetes.enrichBuilds($scope.kubeModel.builds); Kubernetes.enrichBuilds($scope.kubeModel.builds);
var builds = []; var builds = [];
angular.forEach($scope.kubeModel.builds, (build) => { angular.forEach($scope.kubeModel.builds, (build) => {
var labels = Kubernetes.getLabels(build); var labels = Kubernetes.getLabels(build);
var app = labels["app"]; var app = labels["app"];
if (app === $scope.projectId) { if (app === $scope.projectId) {
builds.push(build); builds.push(build);
} }
}); });
builds = _.sortBy(builds, "$creationDate").reverse(); builds = _.sortBy(builds, "$creationDate").reverse();
var allBuilds = builds; var allBuilds = builds;
if (allBuilds.length > 1) { if (allBuilds.length > 1) {
builds = _.filter(allBuilds, (b) => !b.$creationDate); builds = _.filter(allBuilds, (b) => !b.$creationDate);
if (!builds.length) { if (!builds.length) {
builds = [allBuilds[0]]; builds = [allBuilds[0]];
} }
} }
var pipelines = []; var pipelines = [];
angular.forEach(builds, (build) => { angular.forEach(builds, (build) => {
var buildStatus = build.status || {}; var buildStatus = build.status || {};
var result = buildStatus.phase || ""; var result = buildStatus.phase || "";
var resultUpperCase = result.toUpperCase(); var resultUpperCase = result.toUpperCase();
var description = ""; var description = "";
var $viewLink = build.$viewLink; var $viewLink = build.$viewLink;
var $logLink = build.$logsLink; var $logLink = build.$logsLink;
var $timestamp = build.$creationDate; var $timestamp = build.$creationDate;
var duration = buildStatus.duration; var duration = buildStatus.duration;
if (duration) { if (duration) {
// 17s = 17,000,000,000 on openshift // 17s = 17,000,000,000 on openshift
duration = duration / 1000000; duration = duration / 1000000;
} }
var displayName = Kubernetes.getName(build); var displayName = Kubernetes.getName(build);
var $iconClass = createBuildStatusIconClass(resultUpperCase); var $iconClass = createBuildStatusIconClass(resultUpperCase);
var $backgroundClass = createBuildStatusBackgroundClass(resultUpperCase); var $backgroundClass = createBuildStatusBackgroundClass(resultUpperCase);
var stage = { var stage = {
stageName: "OpenShift Build", stageName: "OpenShift Build",
$viewLink: $viewLink, $viewLink: $viewLink,
$logLink: $logLink, $logLink: $logLink,
$startTime: $timestamp, $startTime: $timestamp,
duration: duration, duration: duration,
status: result, status: result,
$iconClass: $iconClass, $iconClass: $iconClass,
$backgroundClass: $backgroundClass $backgroundClass: $backgroundClass
}; };
var pipeline = { var pipeline = {
description: description, description: description,
displayName: displayName, displayName: displayName,
$viewLink: $viewLink, $viewLink: $viewLink,
$logLink: $logLink, $logLink: $logLink,
$timestamp: $timestamp, $timestamp: $timestamp,
duration: duration, duration: duration,
stages: [stage] stages: [stage]
}; };
pipelines.push(pipeline); pipelines.push(pipeline);
}); });
// lets filter the OpenShift builds and make a pipeline from that // lets filter the OpenShift builds and make a pipeline from that
$scope.model.job = { $scope.model.job = {
$jobId: $scope.jobId, $jobId: $scope.jobId,
$project: $scope.projectId, $project: $scope.projectId,
builds: pipelines builds: pipelines
}; };
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
} }
} else { } else {
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
} }
}, 50); }, 50);
updateData(); updateData();
}); });
} }

View File

@ -1,95 +1,95 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var ProjectController = controller("ProjectController", export var ProjectController = controller("ProjectController",
["$scope", "$element", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", ["$scope", "$element", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
($scope, $element, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, $element, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.id = $routeParams["id"]; $scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_build_BuildConfig; $scope.config = KubernetesSchema.definitions.os_build_BuildConfig;
$scope.entityChangedCache = {}; $scope.entityChangedCache = {};
$scope.envVersionsCache = {}; $scope.envVersionsCache = {};
$scope.envNSCaches = {}; $scope.envNSCaches = {};
$scope.envVersions = {}; $scope.envVersions = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = []; //Developer.createProjectBreadcrumbs($scope.id); $scope.breadcrumbConfig = []; //Developer.createProjectBreadcrumbs($scope.id);
updateTabs(); updateTabs();
// this is used for the pendingPipelines view // this is used for the pendingPipelines view
$scope.jobId = $scope.id; $scope.jobId = $scope.id;
$scope.pendingPipelinesOnly = true; $scope.pendingPipelinesOnly = true;
$scope.$on('jenkinsSelectedBuild', (event, build) => { $scope.$on('jenkinsSelectedBuild', (event, build) => {
$scope.selectedBuild = build; $scope.selectedBuild = build;
}); });
// TODO this should be unnecessary but seems sometiems this watch doesn't always trigger unless you hit reload on this page // TODO this should be unnecessary but seems sometiems this watch doesn't always trigger unless you hit reload on this page
if ($scope.model.buildconfigs) { if ($scope.model.buildconfigs) {
onBuildConfigs($scope.model.buildconfigs); onBuildConfigs($scope.model.buildconfigs);
} }
Kubernetes.watch($scope, $element, "buildconfigs", $scope.namespace, onBuildConfigs); Kubernetes.watch($scope, $element, "buildconfigs", $scope.namespace, onBuildConfigs);
function onBuildConfigs(buildConfigs) { function onBuildConfigs(buildConfigs) {
angular.forEach(buildConfigs, (data) => { angular.forEach(buildConfigs, (data) => {
var name = Kubernetes.getName(data); var name = Kubernetes.getName(data);
if (name === $scope.id) { if (name === $scope.id) {
var sortedBuilds = null; var sortedBuilds = null;
Kubernetes.enrichBuildConfig(data, sortedBuilds); Kubernetes.enrichBuildConfig(data, sortedBuilds);
if (hasObjectChanged(data, $scope.entityChangedCache)) { if (hasObjectChanged(data, $scope.entityChangedCache)) {
log.info("entity has changed!"); log.info("entity has changed!");
$scope.entity = data; $scope.entity = data;
$scope.entity.$build = (data.$fabric8CodeViews || {})['fabric8.link.browseGogs.view']; $scope.entity.$build = (data.$fabric8CodeViews || {})['fabric8.link.browseGogs.view'];
$scope.model.setProject($scope.entity); $scope.model.setProject($scope.entity);
} }
updateEnvironmentWatch(); updateEnvironmentWatch();
updateTabs(); updateTabs();
} }
}); });
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
} }
/** /**
* We have updated the entity so lets make sure we are watching all the environments to find * We have updated the entity so lets make sure we are watching all the environments to find
* the project versions for each namespace * the project versions for each namespace
*/ */
function updateEnvironmentWatch() { function updateEnvironmentWatch() {
var project = $scope.entity; var project = $scope.entity;
if (project) { if (project) {
var jenkinsJob = project.$jenkinsJob; var jenkinsJob = project.$jenkinsJob;
if (jenkinsJob) { if (jenkinsJob) {
var buildsTab = _.find($scope.subTabConfig, {id: "builds"}); var buildsTab = _.find($scope.subTabConfig, {id: "builds"});
if (buildsTab) { if (buildsTab) {
buildsTab["href"] = UrlHelpers.join("/workspaces", Kubernetes.currentKubernetesNamespace(), "projects", $scope.id, "jenkinsJob", jenkinsJob); buildsTab["href"] = UrlHelpers.join("/workspaces", Kubernetes.currentKubernetesNamespace(), "projects", $scope.id, "jenkinsJob", jenkinsJob);
} }
} }
angular.forEach(project.environments, (env) => { angular.forEach(project.environments, (env) => {
var ns = env.namespace; var ns = env.namespace;
var caches = $scope.envNSCaches[ns]; var caches = $scope.envNSCaches[ns];
if (!caches) { if (!caches) {
caches = {}; caches = {};
$scope.envNSCaches[ns] = caches; $scope.envNSCaches[ns] = caches;
loadProjectVersions($scope, $element, project, env, ns, $scope.envVersions, caches); loadProjectVersions($scope, $element, project, env, ns, $scope.envVersions, caches);
} }
}); });
} }
} }
function updateTabs() { function updateTabs() {
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, null, $scope); $scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, null, $scope);
} }
}]); }]);
} }

View File

@ -1,19 +1,19 @@
/// <reference path="developerPlugin.ts"/> /// <reference path="developerPlugin.ts"/>
module Developer { module Developer {
_module.controller('Developer.ProjectSelector', ['$scope', '$routeParams', 'KubernetesModel', ($scope, $routeParams, KubernetesModel) => { _module.controller('Developer.ProjectSelector', ['$scope', '$routeParams', 'KubernetesModel', ($scope, $routeParams, KubernetesModel) => {
var projectId = $routeParams['projectId'] || $routeParams['project'] || $routeParams['id']; var projectId = $routeParams['projectId'] || $routeParams['project'] || $routeParams['id'];
if (projectId) { if (projectId) {
$scope.projectId = projectId; $scope.projectId = projectId;
$scope.model = KubernetesModel $scope.model = KubernetesModel
$scope.$watch('model.buildconfigs', (buildconfigs) => { $scope.$watch('model.buildconfigs', (buildconfigs) => {
$scope.projects = buildconfigs; $scope.projects = buildconfigs;
}); });
} else { } else {
log.info("no project ID in routeParams: ", $routeParams); log.info("no project ID in routeParams: ", $routeParams);
} }
}]); }]);
} }

View File

@ -1,171 +1,171 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var ProjectsController = controller("ProjectsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL", export var ProjectsController = controller("ProjectsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location:ng.ILocationService, localStorage, $http, $timeout, KubernetesApiURL) => { ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location:ng.ILocationService, localStorage, $http, $timeout, KubernetesApiURL) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.tableConfig = { $scope.tableConfig = {
data: 'model.buildconfigs', data: 'model.buildconfigs',
showSelectionCheckbox: true, showSelectionCheckbox: true,
enableRowClickSelection: false, enableRowClickSelection: false,
multiSelect: true, multiSelect: true,
selectedItems: [], selectedItems: [],
filterOptions: { filterOptions: {
filterText: $location.search()["q"] || '' filterText: $location.search()["q"] || ''
}, },
columnDefs: [ columnDefs: [
{ {
field: '$name', field: '$name',
displayName: 'Name', displayName: 'Name',
cellTemplate: $templateCache.get("idTemplate.html") cellTemplate: $templateCache.get("idTemplate.html")
}, },
/* /*
{ {
field: 'spec.source.type', field: 'spec.source.type',
displayName: 'Source' displayName: 'Source'
}, },
*/ */
{ {
field: 'spec.source.git.uri', field: 'spec.source.git.uri',
displayName: 'Repository' displayName: 'Repository'
}, },
/* /*
{ {
field: 'spec.strategy.type', field: 'spec.strategy.type',
displayName: 'Strategy' displayName: 'Strategy'
}, },
{ {
field: 'spec.strategy.stiStrategy.image', field: 'spec.strategy.stiStrategy.image',
displayName: 'Source Image' displayName: 'Source Image'
}, },
{ {
field: 'spec.output.imageTag', field: 'spec.output.imageTag',
displayName: 'Output Image' displayName: 'Output Image'
}, },
*/ */
{ {
field: 'metadata.description', field: 'metadata.description',
displayName: 'Description' displayName: 'Description'
}, },
{ {
field: '$creationDate', field: '$creationDate',
displayName: 'Created', displayName: 'Created',
cellTemplate: $templateCache.get("creationTimeTemplate.html") cellTemplate: $templateCache.get("creationTimeTemplate.html")
}, },
{ {
field: '$labelsText', field: '$labelsText',
displayName: 'Labels', displayName: 'Labels',
cellTemplate: $templateCache.get("labelTemplate.html") cellTemplate: $templateCache.get("labelTemplate.html")
} }
] ]
}; };
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = createProjectBreadcrumbs(); $scope.breadcrumbConfig = createProjectBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars(); $scope.subTabConfig = Developer.createWorkspaceSubNavBars();
// TODO // TODO
//$scope.isLoggedIntoGogs = Forge.isLoggedIntoGogs; //$scope.isLoggedIntoGogs = Forge.isLoggedIntoGogs;
$scope.deletePrompt = (selected) => { $scope.deletePrompt = (selected) => {
UI.multiItemConfirmActionDialog(<UI.MultiItemConfirmActionOptions>{ UI.multiItemConfirmActionDialog(<UI.MultiItemConfirmActionOptions>{
collection: selected, collection: selected,
index: '$name', index: '$name',
onClose: (result:boolean) => { onClose: (result:boolean) => {
if (result) { if (result) {
function deleteSelected(selected, next) { function deleteSelected(selected, next) {
if (next) { if (next) {
deleteEntity(next, () => { deleteEntity(next, () => {
deleteSelected(selected, selected.shift()); deleteSelected(selected, selected.shift());
}); });
} else { } else {
// TODO // TODO
// updateData(); // updateData();
} }
} }
deleteSelected(selected, selected.shift()); deleteSelected(selected, selected.shift());
} }
}, },
title: 'Delete Apps', title: 'Delete Apps',
action: 'The following Apps will be deleted:', action: 'The following Apps will be deleted:',
okText: 'Delete', okText: 'Delete',
okClass: 'btn-danger', okClass: 'btn-danger',
custom: "This operation is permanent once completed!", custom: "This operation is permanent once completed!",
customClass: "alert alert-warning" customClass: "alert alert-warning"
}).open(); }).open();
}; };
function deleteEntity(selection, nextCallback) { function deleteEntity(selection, nextCallback) {
var name = (selection || {}).$name; var name = (selection || {}).$name;
var jenkinsJob = selection.$jenkinsJob; var jenkinsJob = selection.$jenkinsJob;
var publicJenkinsUrl = jenkinsLink(); var publicJenkinsUrl = jenkinsLink();
//var jenkinsUrl = Core.pathGet(selection, ["$fabric8Views", "fabric8.link.jenkins.job", "url"]); //var jenkinsUrl = Core.pathGet(selection, ["$fabric8Views", "fabric8.link.jenkins.job", "url"]);
if (name) { if (name) {
console.log("About to delete build config: " + name); console.log("About to delete build config: " + name);
var url = Kubernetes.buildConfigRestUrl(name); var url = Kubernetes.buildConfigRestUrl(name);
$http.delete(url). $http.delete(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
nextCallback(); nextCallback();
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to delete build config on " + url + " " + data + " " + status); log.warn("Failed to delete build config on " + url + " " + data + " " + status);
nextCallback(); nextCallback();
}); });
} else { } else {
console.log("warning: no name for selection: " + angular.toJson(selection)); console.log("warning: no name for selection: " + angular.toJson(selection));
} }
if (jenkinsJob && publicJenkinsUrl) { if (jenkinsJob && publicJenkinsUrl) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", jenkinsJob, "doDelete")); var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(jenkinsServiceNameAndPort, UrlHelpers.join("job", jenkinsJob, "doDelete"));
var body = ""; var body = "";
var config = { var config = {
headers: { headers: {
'Content-Type': "text/plain" 'Content-Type': "text/plain"
} }
}; };
log.info("posting to jenkinsUrl: " + url); log.info("posting to jenkinsUrl: " + url);
$http.post(url, body, config). $http.post(url, body, config).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
log.info("Managed to delete " + url); log.info("Managed to delete " + url);
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to delete jenkins job at " + url + " " + data + " " + status); log.warn("Failed to delete jenkins job at " + url + " " + data + " " + status);
}); });
} }
} }
/* /*
$scope.$keepPolling = () => Kubernetes.keepPollingModel; $scope.$keepPolling = () => Kubernetes.keepPollingModel;
$scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => { $scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
var url = Kubernetes.buildConfigsRestURL(); var url = Kubernetes.buildConfigsRestURL();
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
//console.log("got data " + angular.toJson(data, true)); //console.log("got data " + angular.toJson(data, true));
var sortedBuilds = null; var sortedBuilds = null;
$scope.buildConfigs = Kubernetes.enrichBuildConfigs(data.items, sortedBuilds); $scope.buildConfigs = Kubernetes.enrichBuildConfigs(data.items, sortedBuilds);
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
next(); next();
} }
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
next(); next();
}); });
}); });
$scope.fetch(); $scope.fetch();
*/ */
}]); }]);
} }

View File

@ -1,53 +1,53 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/> /// <reference path="developerNavigation.ts"/>
module Developer { module Developer {
export var WorkspaceController = controller("WorkspaceController", export var WorkspaceController = controller("WorkspaceController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema, ($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => { $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => {
$scope.kubernetes = KubernetesState; $scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel; $scope.model = KubernetesModel;
$scope.id = $routeParams["namespace"]; $scope.id = $routeParams["namespace"];
$scope.schema = KubernetesSchema; $scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.kubernetes_Namespace; $scope.config = KubernetesSchema.definitions.kubernetes_Namespace;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL); Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = createWorkspaceBreadcrumbs(); $scope.breadcrumbConfig = createWorkspaceBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars(); $scope.subTabConfig = Developer.createWorkspaceSubNavBars();
$scope.$keepPolling = () => Kubernetes.keepPollingModel; $scope.$keepPolling = () => Kubernetes.keepPollingModel;
$scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => { $scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
$scope.item = null; $scope.item = null;
if ($scope.id) { if ($scope.id) {
var url = UrlHelpers.join(Kubernetes.resourcesUriForKind("Projects"), $scope.id); var url = UrlHelpers.join(Kubernetes.resourcesUriForKind("Projects"), $scope.id);
log.info("Loading url: " + url); log.info("Loading url: " + url);
$http.get(url). $http.get(url).
success(function (data, status, headers, config) { success(function (data, status, headers, config) {
if (data) { if (data) {
$scope.entity = enrichWorkspace(data); $scope.entity = enrichWorkspace(data);
} }
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
next(); next();
}). }).
error(function (data, status, headers, config) { error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status); log.warn("Failed to load " + url + " " + data + " " + status);
next(); next();
}); });
} else { } else {
$scope.model.fetched = true; $scope.model.fetched = true;
Core.$apply($scope); Core.$apply($scope);
next(); next();
} }
}); });
$scope.fetch(); $scope.fetch();
}]); }]);
} }

View File

@ -1,211 +1,211 @@
/// <reference path="../../includes.ts"/> /// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/> /// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/> /// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/> /// <reference path="developerHelpers.ts"/>
/// <reference path="dataManagerHelper.ts"/> /// <reference path="dataManagerHelper.ts"/>
/// <reference path="dataManagerModel.ts"/> /// <reference path="dataManagerModel.ts"/>
module Developer { module Developer {
export var WorkspacesController = controller("WorkspacesController", ["$scope", "KubernetesModel", "DataModel","KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "$element", export var WorkspacesController = controller("WorkspacesController", ["$scope", "KubernetesModel", "DataModel","KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "$element",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, DataModel:Developer.DataModelService, KubernetesState, $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, $element) => { ($scope, KubernetesModel:Kubernetes.KubernetesModelService, DataModel:Developer.DataModelService, KubernetesState, $templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL, $element) => {
init($scope,location,$routeParams); init($scope,location,$routeParams);
$scope.model=DataModel; $scope.model=DataModel;
$scope.model.initParamOptions(); $scope.model.initParamOptions();
$scope.options = DataModel.paramOptions; $scope.options = DataModel.paramOptions;
$scope.pageSizeChoses = DataModel.paramOptions.pagerSizeOption; $scope.pageSizeChoses = DataModel.paramOptions.pagerSizeOption;
$scope.options.dataType = getDataType($location); $scope.options.dataType = getDataType($location);
$scope.model.updateModel(); $scope.model.updateModel();
//配置数据表格需要显示的内容及显示格式 //配置数据表格需要显示的内容及显示格式
$scope.tableConfig = { $scope.tableConfig = {
data: 'model.data', data: 'model.data',
enableRowClickSelection: true, enableRowClickSelection: true,
showSelectionCheckbox: true, showSelectionCheckbox: true,
multiSelect: true, multiSelect: true,
selectedItems: [], selectedItems: [],
filterOptions: { filterOptions: {
filterText: $location.search()["q"] || '' filterText: $location.search()["q"] || ''
}, },
columnDefs: [ columnDefs: [
{ {
field: "_key", field: "_key",
displayName: '编码', displayName: '编码',
customSortField: (field) =>{ customSortField: (field) =>{
return field.id; return field.id;
//console.log(field); //console.log(field);
} }
}, },
{ {
field: "name", field: "name",
displayName: '市-区/县' displayName: '市-区/县'
}, },
{ {
field: "systemName", field: "systemName",
displayName: '系统名称' displayName: '系统名称'
}, },
{ {
field: "collectingTime", field: "collectingTime",
displayName: '采集时间' displayName: '采集时间'
}, },
{ {
field: "collectorName", field: "collectorName",
displayName: '汇总状态' displayName: '汇总状态'
}, },
{ {
field: "collectorContacts", field: "collectorContacts",
displayName: '联系方式' displayName: '联系方式'
} }
] ]
}; };
$scope.selectBatchItem = (item)=> { $scope.selectBatchItem = (item)=> {
$scope.navbarItems.forEach((nav) =>{ $scope.navbarItems.forEach((nav) =>{
nav.class=""; nav.class="";
}); });
item.class="active"; item.class="active";
if(item.label === "全部") if(item.label === "全部")
$scope.model.updateParamOption("dataBatch", null); $scope.model.updateParamOption("dataBatch", null);
else else
$scope.model.updateParamOption("dataBatch", item.alias); $scope.model.updateParamOption("dataBatch", item.alias);
} }
$scope.isEmptyOrFirst = () => { $scope.isEmptyOrFirst = () => {
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
var length =$scope.options.getPageSizeNum(); var length =$scope.options.getPageSizeNum();
return length <= 0 || idx <= 1; return length <= 0 || idx <= 1;
} }
$scope.isEmptyOrLast = () =>{ $scope.isEmptyOrLast = () =>{
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
var length =$scope.options.getPageSizeNum(); var length =$scope.options.getPageSizeNum();
return length < 1 || idx >= length; return length < 1 || idx >= length;
} }
$scope.first = () => { $scope.first = () => {
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
if(idx >1) if(idx >1)
$scope.model.updateParamOption("currentPageNum", 1); $scope.model.updateParamOption("currentPageNum", 1);
} }
$scope.last = () =>{ $scope.last = () =>{
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
var length =$scope.options.getPageSizeNum(); var length =$scope.options.getPageSizeNum();
if(idx < length) if(idx < length)
$scope.model.updateParamOption("currentPageNum", length); $scope.model.updateParamOption("currentPageNum", length);
} }
$scope.previous = () => { $scope.previous = () => {
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
var length =$scope.options.getPageSizeNum(); var length =$scope.options.getPageSizeNum();
if(idx > 1) if(idx > 1)
$scope.model.updateParamOption("currentPageNum", idx-1); $scope.model.updateParamOption("currentPageNum", idx-1);
} }
$scope.next = () =>{ $scope.next = () =>{
var length =$scope.options.getPageSizeNum(); var length =$scope.options.getPageSizeNum();
var idx = $scope.model.getParamOption("currentPageNum"); var idx = $scope.model.getParamOption("currentPageNum");
if(idx < length) if(idx < length)
$scope.model.updateParamOption("currentPageNum", idx+1); $scope.model.updateParamOption("currentPageNum", idx+1);
} }
$scope.$watch('options', (newValue, oldValue) => { $scope.$watch('options', (newValue, oldValue) => {
if(newValue && newValue !== oldValue){ if(newValue && newValue !== oldValue){
if(newValue.currentTableSize !== oldValue.currentTableSize) if(newValue.currentTableSize !== oldValue.currentTableSize)
$scope.options.priorTableSize = oldValue.currentTableSize; $scope.options.priorTableSize = oldValue.currentTableSize;
else else
$scope.options.priorTableSize = newValue.currentTableSize; $scope.options.priorTableSize = newValue.currentTableSize;
DataModel.updateModel(); DataModel.updateModel();
} }
}, true); }, true);
$scope.deletePrompt = (items) =>{ $scope.deletePrompt = (items) =>{
var idColl = []; var idColl = [];
angular.forEach(items,(item) => { angular.forEach(items,(item) => {
idColl.push(item.id); idColl.push(item.id);
console.log(item.id); console.log(item.id);
}); });
$http({ $http({
method: "POST", method: "POST",
url: "/java/console/api/delete/data", url: "/java/console/api/delete/data",
params: {"data": idColl} params: {"data": idColl}
}).success(function(data, status, headers, config) { }).success(function(data, status, headers, config) {
//成功之后做一些事情 //成功之后做一些事情
DataModel.updateModel(); DataModel.updateModel();
}).error(function(data, status, headers, config) { }).error(function(data, status, headers, config) {
}); });
} }
$scope.createOracleService = (items) =>{ $scope.createOracleService = (items) =>{
angular.forEach(items,(item)=>{ angular.forEach(items,(item)=>{
console.log(item); console.log(item);
Kubernetes.createRC({ Kubernetes.createRC({
name: item._key, name: item._key,
labels: { labels: {
system: item.systemCode.toString(), system: item.systemCode.toString(),
version: item.dataVersion.toString(), version: item.dataVersion.toString(),
region: item.regionalismCode.toString() region: item.regionalismCode.toString()
}, },
annotations: { annotations: {
cityName: item.cityName, cityName: item.cityName,
districtName: item.districtName, districtName: item.districtName,
systemName: item.systemName systemName: item.systemName
}, },
path: item.dataPath+"app/", path: item.dataPath+"app/",
isTarget: "false" isTarget: "false"
}, (rc) =>{ }, (rc) =>{
Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "create", Kubernetes.getName(rc), 0); Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "create", Kubernetes.getName(rc), 0);
}); });
}); });
} }
function init($scope,$location,$routeParams){ function init($scope,$location,$routeParams){
//创建二级菜单 //创建二级菜单
$scope.subTabConfig = Developer.createCurrentSubNavBar($scope, $location, $routeParams); $scope.subTabConfig = Developer.createCurrentSubNavBar($scope, $location, $routeParams);
$scope.navbarItems =[{ $scope.navbarItems =[{
herf: "", herf: "",
label: "全部", label: "全部",
title: "查看全部数据", title: "查看全部数据",
class: "active", class: "active",
alias: null alias: null
}, },
{ {
herf: "", herf: "",
label: "批次A", label: "批次A",
title: "查看批次A的数据", title: "查看批次A的数据",
class: "", class: "",
alias: "A" alias: "A"
}, },
{ {
herf: "", herf: "",
label: "批次B", label: "批次B",
title: "查看批次B的数据", title: "查看批次B的数据",
class: "", class: "",
alias: "B" alias: "B"
}] }]
} }
function getDataType($location){ function getDataType($location){
var path = $location.path(); var path = $location.path();
var result; var result;
var subPath = path.split("/"); var subPath = path.split("/");
switch (subPath[subPath.length -1]) { switch (subPath[subPath.length -1]) {
case "financial": case "financial":
result = "财政" result = "财政"
break; break;
case "social-security": case "social-security":
result = "社保" result = "社保"
break; break;
default: default:
result = null; result = null;
break; break;
} }
return result; return result;
} }
}]); }]);
} }

View File

@ -1,9 +1,9 @@
/// <reference path="../libs/hawtio-forms/defs.d.ts"/> /// <reference path="../libs/hawtio-forms/defs.d.ts"/>
/// <reference path="../libs/hawtio-kubernetes-api/defs.d.ts"/> /// <reference path="../libs/hawtio-kubernetes-api/defs.d.ts"/>
/// <reference path="../libs/hawtio-oauth/defs.d.ts"/> /// <reference path="../libs/hawtio-oauth/defs.d.ts"/>
/// <reference path="../libs/hawtio-ui/defs.d.ts"/> /// <reference path="../libs/hawtio-ui/defs.d.ts"/>
/// <reference path="../libs/hawtio-utilities/defs.d.ts"/> /// <reference path="../libs/hawtio-utilities/defs.d.ts"/>
declare var humandate; declare var humandate;
declare var jsyaml:any; declare var jsyaml:any;

View File

@ -1,3 +1,3 @@
<div class="ngCellText" title="deployed at: {{row.entity.$creationDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}"> <div class="ngCellText" title="deployed at: {{row.entity.$creationDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}">
{{row.entity.$creationDate ? (row.entity.$creationDate | relativeTime) : ''}} {{row.entity.$creationDate ? (row.entity.$creationDate | relativeTime) : ''}}
</div> </div>

View File

@ -1,149 +1,149 @@
<div class="service-view-rectangle" ng-repeat="view in item.$serviceViews" ng-hide="view.appName === 'kubernetes'"> <div class="service-view-rectangle" ng-repeat="view in item.$serviceViews" ng-hide="view.appName === 'kubernetes'">
<div class="service-view-header row"> <div class="service-view-header row">
<div class="col-md-4"> <div class="col-md-4">
<span class="service-view-icon"> <span class="service-view-icon">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page"> <a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
<img ng-show="item.$iconUrl" ng-src="{{item.$iconUrl}}"> <img ng-show="item.$iconUrl" ng-src="{{item.$iconUrl}}">
</a> </a>
</span> </span>
<span class="service-view-name" title="{{view.name}}"> <span class="service-view-name" title="{{view.name}}">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page"> <a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
{{view.appName}} {{view.appName}}
</a> </a>
</span> </span>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<span class="service-view-address" title="The service address"> <span class="service-view-address" title="The service address">
<a ng-show="view.service.$connectUrl" target="_blank" href="{{view.service.$connectUrl}}" title="Connect to the service"> <a ng-show="view.service.$connectUrl" target="_blank" href="{{view.service.$connectUrl}}" title="Connect to the service">
{{view.service.$host}} {{view.service.$host}}
</a> </a>
<span ng-hide="view.service.$connectUrl">{{view.service.$host}}</span> <span ng-hide="view.service.$connectUrl">{{view.service.$host}}</span>
</span> </span>
</div> </div>
<div class="col-md-2 align-right"> <div class="col-md-2 align-right">
<a class="service-view-header-delete" href="" ng-click="deleteSingleApp(item)" title="Delete this app"><i <a class="service-view-header-delete" href="" ng-click="deleteSingleApp(item)" title="Delete this app"><i
class="fa fa-remove red"></i></a> class="fa fa-remove red"></i></a>
</div> </div>
</div> </div>
<div class="service-view-detail-rectangle"> <div class="service-view-detail-rectangle">
<div class="service-view-detail-header row"> <div class="service-view-detail-header row">
<div class="col-md-3"> <div class="col-md-3">
<div class="service-view-detail-deployed" ng-show="view.createdDate" <div class="service-view-detail-deployed" ng-show="view.createdDate"
title="deployed at: {{view.createdDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}"> title="deployed at: {{view.createdDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}">
deployed: deployed:
<span class="value">{{view.createdDate | relativeTime}}</span> <span class="value">{{view.createdDate | relativeTime}}</span>
</div> </div>
<div class="service-view-detail-deployed" ng-hide="view.createdDate"> <div class="service-view-detail-deployed" ng-hide="view.createdDate">
not deployed not deployed
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="service-view-detail-pod-template" ng-show="view.controllerId"> <div class="service-view-detail-pod-template" ng-show="view.controllerId">
pod template: pod template:
<span class="value" title="Go to the replication controller detail page"><a <span class="value" title="Go to the replication controller detail page"><a
ng-href="{{view.replicationController | kubernetesPageLink}}">{{view.controllerId}}</a></span> ng-href="{{view.replicationController | kubernetesPageLink}}">{{view.controllerId}}</a></span>
</div> </div>
<div class="service-view-detail-pod-template" ng-hide="view.controllerId"> <div class="service-view-detail-pod-template" ng-hide="view.controllerId">
no pod template no pod template
</div> </div>
</div> </div>
<div class="col-md-3 service-view-detail-pod-counts align-right"> <div class="col-md-3 service-view-detail-pod-counts align-right">
<span> <span>
pods: pods:
<a href="" ng-show="view.replicationController" class="badge badge-success" <a href="" ng-show="view.replicationController" class="badge badge-success"
ng-click="resizeDialog.open(view.replicationController)" ng-click="resizeDialog.open(view.replicationController)"
title="Resize the number of pods"> title="Resize the number of pods">
{{view.podCount}} {{view.podCount}}
</a> </a>
<span ng-hide="view.replicationController" class="badge badge-info"> <span ng-hide="view.replicationController" class="badge badge-info">
{{view.podCount}} {{view.podCount}}
</span> </span>
</span> </span>
</div> </div>
</div> </div>
<div class="service-view-detail-pod-box row"> <div class="service-view-detail-pod-box row">
<div class="col-md-12"> <div class="col-md-12">
<div class="inline-block" ng-repeat="pod in item.pods track by $index"> <div class="inline-block" ng-repeat="pod in item.pods track by $index">
<div ng-show="podExpanded(pod)" class="service-view-detail-pod-summary-expand"> <div ng-show="podExpanded(pod)" class="service-view-detail-pod-summary-expand">
<table> <table>
<tr> <tr>
<td class="service-view-detail-pod-status"> <td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i> <i ng-class="pod.statusClass"></i>
</td> </td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl" <td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController"> ng-controller="Kubernetes.ConnectController">
<a class="clickable" <a class="clickable"
ng-click="doConnect(pod)" ng-click="doConnect(pod)"
title="Open a new window and connect to this container"> title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i> <i class="fa fa-sign-in"></i>
</a> </a>
</td> </td>
<td> <td>
<div class="service-view-detail-pod-id" title="{{pod.id}}"> <div class="service-view-detail-pod-id" title="{{pod.id}}">
<span class="value">Pod <a title="Go to the pod detail page" ng-href="{{pod | kubernetesPageLink}}">{{pod.idAbbrev}}</a></span> <span class="value">Pod <a title="Go to the pod detail page" ng-href="{{pod | kubernetesPageLink}}">{{pod.idAbbrev}}</a></span>
</div> </div>
<div class="service-view-detail-pod-ip"> <div class="service-view-detail-pod-ip">
IP: IP:
<span class="value">{{pod.status.podIP}}</span> <span class="value">{{pod.status.podIP}}</span>
</div> </div>
</td> </td>
<td> <td>
<div class="service-view-detail-pod-ports"> <div class="service-view-detail-pod-ports">
ports: <span class="value">{{pod.$containerPorts.join(", ")}}</span> ports: <span class="value">{{pod.$containerPorts.join(", ")}}</span>
</div> </div>
<div class="service-view-detail-pod-minion"> <div class="service-view-detail-pod-minion">
minion: minion:
<span class="value"> <span class="value">
<a ng-show="pod.$host" ng-href="{{baseUri}}/kubernetes/hosts/{{pod.$host}}">{{pod.$host}}</a> <a ng-show="pod.$host" ng-href="{{baseUri}}/kubernetes/hosts/{{pod.$host}}">{{pod.$host}}</a>
</span> </span>
</div> </div>
</td> </td>
<td class="service-view-detail-pod-expand" ng-click="collapsePod(pod)"> <td class="service-view-detail-pod-expand" ng-click="collapsePod(pod)">
<i class="fa fa-chevron-left"></i> <i class="fa fa-chevron-left"></i>
</td> </td>
</tr> </tr>
</table> </table>
<!-- <!--
<div class="service-view-detail-pod-status"> <div class="service-view-detail-pod-status">
status: status:
<span class="value">{{pod.status}}</span> <span class="value">{{pod.status}}</span>
</div> </div>
--> -->
</div> </div>
<div ng-hide="podExpanded(pod)" class="service-view-detail-pod-summary"> <div ng-hide="podExpanded(pod)" class="service-view-detail-pod-summary">
<table> <table>
<tr> <tr>
<td class="service-view-detail-pod-status"> <td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i> <i ng-class="pod.statusClass"></i>
</td> </td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl" <td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController"> ng-controller="Kubernetes.ConnectController">
<a class="clickable" <a class="clickable"
ng-click="doConnect(pod)" ng-click="doConnect(pod)"
title="Open a new window and connect to this container"> title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i> <i class="fa fa-sign-in"></i>
</a> </a>
</td> </td>
<td> <td>
<div class="service-view-detail-pod-id" title="{{pod.id}}"> <div class="service-view-detail-pod-id" title="{{pod.id}}">
<span class="value">Pod <a title="Go to the pod detail page" ng-href="{{pod | kubernetesPageLink}}">{{pod.idAbbrev}}</a></span> <span class="value">Pod <a title="Go to the pod detail page" ng-href="{{pod | kubernetesPageLink}}">{{pod.idAbbrev}}</a></span>
</div> </div>
<div class="service-view-detail-pod-ip"> <div class="service-view-detail-pod-ip">
IP: IP:
<span class="value">{{pod.status.podIP}}</span> <span class="value">{{pod.status.podIP}}</span>
</div> </div>
</td> </td>
<td class="service-view-detail-pod-expand" ng-click="expandPod(pod)"> <td class="service-view-detail-pod-expand" ng-click="expandPod(pod)">
<i class="fa fa-chevron-right"></i> <i class="fa fa-chevron-right"></i>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,10 +1,10 @@
<div class="ngCellText" title="{{row.entity.$info.description}}"> <div class="ngCellText" title="{{row.entity.$info.description}}">
<a ng-href="row.entity.$appUrl"> <a ng-href="row.entity.$appUrl">
<img ng-show="row.entity.$iconUrl" class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img ng-show="row.entity.$iconUrl" class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
</a> </a>
<span class="app-name"> <span class="app-name">
<a ng-click="row.entity.$select()"> <a ng-click="row.entity.$select()">
{{row.entity.$info.name}} {{row.entity.$info.name}}
</a> </a>
</span> </span>
</div> </div>

View File

@ -1,9 +1,9 @@
<div class="ngCellText" title="Number of running pods for this controller"> <div class="ngCellText" title="Number of running pods for this controller">
<div ng-repeat="podCounters in row.entity.$podCounters track by $index"> <div ng-repeat="podCounters in row.entity.$podCounters track by $index">
<a ng-show="podCounters.podsLink" href="{{podCounters.podsLink}}" title="{{podCounters.labelText}}"> <a ng-show="podCounters.podsLink" href="{{podCounters.podsLink}}" title="{{podCounters.labelText}}">
<span ng-show="podCounters.valid" class="badge badge-success">{{podCounters.valid}}</span> <span ng-show="podCounters.valid" class="badge badge-success">{{podCounters.valid}}</span>
<span ng-show="podCounters.waiting" class="badge">{{podCounters.waiting}}</span> <span ng-show="podCounters.waiting" class="badge">{{podCounters.waiting}}</span>
<span ng-show="podCounters.error" class="badge badge-warning">{{podCounters.error}}</span> <span ng-show="podCounters.error" class="badge badge-warning">{{podCounters.error}}</span>
</a> </a>
</div> </div>
</div> </div>

View File

@ -1,14 +1,14 @@
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="controller in row.entity.replicationControllers"> <span ng-repeat="controller in row.entity.replicationControllers">
<a ng-href="{{controller | kubernetesPageLink}}" <a ng-href="{{controller | kubernetesPageLink}}"
title="View controller details"> title="View controller details">
<span>{{controller.metadata.name || controller.id}}</span> <span>{{controller.metadata.name || controller.id}}</span>
</a> </a>
&nbsp; &nbsp;
<span class="pull-right"> <span class="pull-right">
<a class="badge badge-info" href="" ng-click="$emit('do-resize', controller)" <a class="badge badge-info" href="" ng-click="$emit('do-resize', controller)"
title="Resize the number of replicas of this controller"> title="Resize the number of replicas of this controller">
{{controller.spec.replicas || 0}}</a> {{controller.spec.replicas || 0}}</a>
</span> </span>
</span> </span>
</div> </div>

View File

@ -1,8 +1,8 @@
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="service in row.entity.services"> <span ng-repeat="service in row.entity.services">
<a ng-href="{{service | kubernetesPageLink}}" <a ng-href="{{service | kubernetesPageLink}}"
title="View service details"> title="View service details">
<span>{{service.metadata.name ||service.name || service.id}}</span> <span>{{service.metadata.name ||service.name || service.id}}</span>
</a> </a>
</span> </span>
</div> </div>

View File

@ -1,175 +1,175 @@
<div ng-controller="Kubernetes.Apps"> <div ng-controller="Kubernetes.Apps">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div ng-hide="appSelectorShow"> <div ng-hide="appSelectorShow">
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span ng-show="model.apps.length && !id"> <span ng-show="model.apps.length && !id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter apps..."></hawtio-filter> placeholder="Filter apps..."></hawtio-filter>
</span> </span>
<span ng-hide="id" class="pull-right"> <span ng-hide="id" class="pull-right">
<div class="btn-group"> <div class="btn-group">
<a class="btn btn-default" ng-disabled="mode == 'list'" href="" ng-click="mode = 'list'"> <a class="btn btn-default" ng-disabled="mode == 'list'" href="" ng-click="mode = 'list'">
<i class="fa fa-list"></i></a> <i class="fa fa-list"></i></a>
<a class="btn btn-default" ng-disabled="mode == 'detail'" href="" ng-click="mode = 'detail'"> <a class="btn btn-default" ng-disabled="mode == 'detail'" href="" ng-click="mode = 'detail'">
<i class="fa fa-table"></i></a> <i class="fa fa-table"></i></a>
</div> </div>
</span> </span>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="model.apps.length && mode == 'list'" <button ng-show="model.apps.length && mode == 'list'"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(id || tableConfig.selectedItems)"> ng-click="deletePrompt(id || tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<!-- <!--
<button ng-show="model.showRunButton" <button ng-show="model.showRunButton"
class="btn btn-success pull-right" class="btn btn-success pull-right"
ng-click="appSelectorShow = true" ng-click="appSelectorShow = true"
title="Run an application"> title="Run an application">
<i class="fa fa-play-circle"></i> Run ... <i class="fa fa-play-circle"></i> Run ...
</button> </button>
--> -->
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<span ng-include="'runButton.html'"></span> <span ng-include="'runButton.html'"></span>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="id" <button ng-show="id"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
ng-click="id = undefined"><i class="fa fa-list"></i></button> ng-click="id = undefined"><i class="fa fa-list"></i></button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched && !id"> <div ng-show="model.fetched && !id">
<div ng-hide="model.apps.length" class="align-center"> <div ng-hide="model.apps.length" class="align-center">
<p class="alert alert-info">There are no apps currently available.</p> <p class="alert alert-info">There are no apps currently available.</p>
</div> </div>
<div ng-show="model.apps.length"> <div ng-show="model.apps.length">
<div ng-show="mode == 'list'"> <div ng-show="mode == 'list'">
<table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table> <table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table>
</div> </div>
<div ng-show="mode == 'detail'"> <div ng-show="mode == 'detail'">
<div class="app-detail" ng-repeat="item in model.apps | filter:tableConfig.filterOptions.filterText | orderBy:'$name' track by $index"> <div class="app-detail" ng-repeat="item in model.apps | filter:tableConfig.filterOptions.filterText | orderBy:'$name' track by $index">
<ng-include src="'plugins/kubernetes/html/appDetailTemplate.html'"/> <ng-include src="'plugins/kubernetes/html/appDetailTemplate.html'"/>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched && id"> <div ng-show="model.fetched && id">
<div class="app-detail"> <div class="app-detail">
<ng-include src="'plugins/kubernetes/html/appDetailTemplate.html'"/> <ng-include src="'plugins/kubernetes/html/appDetailTemplate.html'"/>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="appSelectorShow"> <div ng-show="appSelectorShow">
<div class="col-md-7"> <div class="col-md-7">
<div class="row"> <div class="row">
<hawtio-filter ng-model="appSelector.filterText" <hawtio-filter ng-model="appSelector.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter apps..."></hawtio-filter> placeholder="Filter apps..."></hawtio-filter>
</div> </div>
<div class="row"> <div class="row">
<ul> <ul>
<li class="no-list profile-selector-folder" ng-repeat="folder in model.appFolders" <li class="no-list profile-selector-folder" ng-repeat="folder in model.appFolders"
ng-show="appSelector.showFolder(folder)"> ng-show="appSelector.showFolder(folder)">
<div class="expandable" ng-class="appSelector.isOpen(folder)"> <div class="expandable" ng-class="appSelector.isOpen(folder)">
<div title="{{folder.path}}" class="title"> <div title="{{folder.path}}" class="title">
<i class="expandable-indicator folder"></i> <span class="folder-title" ng-show="folder.path">{{folder.path.capitalize(true)}}</span><span <i class="expandable-indicator folder"></i> <span class="folder-title" ng-show="folder.path">{{folder.path.capitalize(true)}}</span><span
class="folder-title" ng-hide="folder.path">Uncategorized</span> class="folder-title" ng-hide="folder.path">Uncategorized</span>
</div> </div>
<div class="expandable-body"> <div class="expandable-body">
<ul> <ul>
<li class="no-list profile" ng-repeat="profile in folder.apps" ng-show="appSelector.showApp(profile)"> <li class="no-list profile" ng-repeat="profile in folder.apps" ng-show="appSelector.showApp(profile)">
<div class="profile-selector-item"> <div class="profile-selector-item">
<div class="inline-block profile-selector-checkbox"> <div class="inline-block profile-selector-checkbox">
<input type="checkbox" ng-model="profile.selected" <input type="checkbox" ng-model="profile.selected"
ng-change="appSelector.updateSelected()"> ng-change="appSelector.updateSelected()">
</div> </div>
<div class="inline-block profile-selector-name" ng-class="appSelector.getSelectedClass(profile)"> <div class="inline-block profile-selector-name" ng-class="appSelector.getSelectedClass(profile)">
<span class="contained c-max"> <span class="contained c-max">
<a href="" ng-click="appSelector.select(profile, !profile.selected)" <a href="" ng-click="appSelector.select(profile, !profile.selected)"
title="Details for {{profile.id}}"> title="Details for {{profile.id}}">
<img ng-show="profile.$iconUrl" class="icon-small-app" ng-src="{{profile.$iconUrl}}"> <img ng-show="profile.$iconUrl" class="icon-small-app" ng-src="{{profile.$iconUrl}}">
<span class="app-name">{{profile.name}}</span> <span class="app-name">{{profile.name}}</span>
</a> </a>
</span> </span>
</div> </div>
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="col-md-5"> <div class="col-md-5">
<div class="row"> <div class="row">
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
ng-click="appSelectorShow = undefined"><i class="fa fa-circle-arrow-left"></i> Back ng-click="appSelectorShow = undefined"><i class="fa fa-circle-arrow-left"></i> Back
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn pull-right" <button class="btn pull-right"
ng-disabled="!appSelector.selectedApps.length" ng-disabled="!appSelector.selectedApps.length"
title="Clears the selected Apps" title="Clears the selected Apps"
ng-click="appSelector.clearSelected()"><i class="fa fa-check-empty"></i> Clear ng-click="appSelector.clearSelected()"><i class="fa fa-check-empty"></i> Clear
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn btn-success pull-right" <button class="btn btn-success pull-right"
ng-disabled="!appSelector.selectedApps.length" ng-disabled="!appSelector.selectedApps.length"
ng-click="appSelector.runSelectedApps()" ng-click="appSelector.runSelectedApps()"
title="Run the selected apps"> title="Run the selected apps">
<i class="fa fa-play-circle"></i> <i class="fa fa-play-circle"></i>
<ng-pluralize count="appSelector.selectedApps.length" <ng-pluralize count="appSelector.selectedApps.length"
when="{'0': 'No App Selected', when="{'0': 'No App Selected',
'1': 'Run App', '1': 'Run App',
'other': 'Run {} Apps'}"></ng-pluralize> 'other': 'Run {} Apps'}"></ng-pluralize>
</button> </button>
</div> </div>
<div class="row"> <div class="row">
<!-- <!--
<div ng-hide="appSelector.selectedApps.length"> <div ng-hide="appSelector.selectedApps.length">
<p class="alert pull-right"> <p class="alert pull-right">
Please select an App Please select an App
</p> </p>
</div> </div>
--> -->
<div ng-show="appSelector.selectedApps.length"> <div ng-show="appSelector.selectedApps.length">
<ul class="zebra-list pull-right"> <ul class="zebra-list pull-right">
<li ng-repeat="app in appSelector.selectedApps"> <li ng-repeat="app in appSelector.selectedApps">
<img ng-show="app.$iconUrl" class="icon-selected-app" ng-src="{{app.$iconUrl}}"> <img ng-show="app.$iconUrl" class="icon-selected-app" ng-src="{{app.$iconUrl}}">
<strong class="green selected-app-name">{{app.name}}</strong> <strong class="green selected-app-name">{{app.name}}</strong>
&nbsp; &nbsp;
<i class="red clickable fa fa-remove" <i class="red clickable fa fa-remove"
title="Remove appp" title="Remove appp"
ng-click="appSelector.select(app, false)"></i> ng-click="appSelector.select(app, false)"></i>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<ng-include src="'resizeDialog.html'"/> <ng-include src="'resizeDialog.html'"/>
</div> </div>

View File

@ -1,10 +1,10 @@
<div ng-show="breadcrumbConfig" ng-init="breadcrumbConfig = $parent.breadcrumbConfig" <div ng-show="breadcrumbConfig" ng-init="breadcrumbConfig = $parent.breadcrumbConfig"
ng-controller="Developer.NavBarController"> ng-controller="Developer.NavBarController">
<ol class="breadcrumb"> <ol class="breadcrumb">
<li ng-repeat="breadcrumb in breadcrumbConfig" ng-show="isValid(breadcrumb)" <li ng-repeat="breadcrumb in breadcrumbConfig" ng-show="isValid(breadcrumb)"
class="{{breadcrumb.active ? 'active' : ''}}" class="{{breadcrumb.active ? 'active' : ''}}"
title="{{breadcrumb.title}}"> title="{{breadcrumb.title}}">
<a ng-show="breadcrumb.href && !breadcrumb.active" href="{{breadcrumb.href}}">{{breadcrumb.label}}</a> <a ng-show="breadcrumb.href && !breadcrumb.active" href="{{breadcrumb.href}}">{{breadcrumb.label}}</a>
<span ng-hide="breadcrumb.href && !breadcrumb.active">{{breadcrumb.label}}</span> <span ng-hide="breadcrumb.href && !breadcrumb.active">{{breadcrumb.label}}</span>
</ol> </ol>
</div> </div>

View File

@ -1,46 +1,46 @@
<div ng-controller="Kubernetes.BuildController"> <div ng-controller="Kubernetes.BuildController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/builds"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/builds"><i class="fa fa-list"></i></a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$configLink" <a class="btn btn-default pull-right" ng-show="entity.$configLink"
title="View the build configuration" title="View the build configuration"
href="{{entity.$configLink}}"> href="{{entity.$configLink}}">
Configuration Configuration
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$podLink" <a class="btn btn-default pull-right" ng-show="entity.$podLink"
title="View the build pod" title="View the build pod"
href="{{entity.$podLink}}"> href="{{entity.$podLink}}">
Pod Pod
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" ng-show="entity.$logsLink" <a class="btn btn-primary pull-right" ng-show="entity.$logsLink"
title="View the build logs" title="View the build logs"
href="{{entity.$logsLink}}"> href="{{entity.$logsLink}}">
View Log View Log
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-object="entity" config="config"></div> <div hawtio-object="entity" config="config"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,42 +1,42 @@
<div ng-controller="Kubernetes.BuildConfigController"> <div ng-controller="Kubernetes.BuildConfigController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$editLink" href="{{entity.$editLink}}"> <a class="btn btn-default pull-right" ng-show="entity.$editLink" href="{{entity.$editLink}}">
<i class="fa fa-pencil-square-o"></i> Edit <i class="fa fa-pencil-square-o"></i> Edit
</a> </a>
<div class="pull-right" ng-repeat="view in entity.$fabric8Views | orderBy:'label'"> <div class="pull-right" ng-repeat="view in entity.$fabric8Views | orderBy:'label'">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
<span class="pull-right" ng-show="view.url" >&nbsp;</span> <span class="pull-right" ng-show="view.url" >&nbsp;</span>
</div> </div>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Trigger this build" title="Trigger this build"
ng-disabled="!entity.$triggerUrl" ng-disabled="!entity.$triggerUrl"
ng-click="triggerBuild(entity)"><i class="fa fa-play-circle-o"></i> Trigger</button> ng-click="triggerBuild(entity)"><i class="fa fa-play-circle-o"></i> Trigger</button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-object="entity" config="config"></div> <div hawtio-object="entity" config="config"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,62 +1,62 @@
<div ng-init="mode='edit'"> <div ng-init="mode='edit'">
<div ng-controller="Kubernetes.BuildConfigEditController"> <div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div ng-init="subTabConfig = tabs" ng-include="'plugins/kubernetes/html/tabs.html'"></div> <div ng-init="subTabConfig = tabs" ng-include="'plugins/kubernetes/html/tabs.html'"></div>
<div> <div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Saves changes to this project configuration" title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name" ng-disabled="!entity.metadata.name"
ng-click="save()"> ng-click="save()">
Save Changes Save Changes
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal"> <form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset> <fieldset>
<legend ng-show="config.label || config.description" ng-hide="config.hideLegend" <legend ng-show="config.label || config.description" ng-hide="config.hideLegend"
class="ng-binding"></legend> class="ng-binding"></legend>
<div class="row"> <div class="row">
<div class="clearfix col-md-12"> <div class="clearfix col-md-12">
<div class="form-group"> <div class="form-group">
<label class="control-label">Name</label> <label class="control-label">Name</label>
<input type="text" class="form-control" placeholder="project name" pattern="[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*" ng-model="entity.metadata.name" required> <input type="text" class="form-control" placeholder="project name" pattern="[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*" ng-model="entity.metadata.name" required>
<p class="form-warning bg-danger" ng-show="nameForm.$error.pattern"> <p class="form-warning bg-danger" ng-show="nameForm.$error.pattern">
Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com` Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com`
</p> </p>
</div> </div>
</div> </div>
</div> </div>
</fieldset> </fieldset>
</form> </form>
<!-- <!--
<div hawtio-form-2="config" entity="entity"></div> <div hawtio-form-2="config" entity="entity"></div>
--> -->
<div hawtio-form-2="specConfig" entity="spec"></div> <div hawtio-form-2="specConfig" entity="spec"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,122 +1,122 @@
<div class="row" ng-controller="Kubernetes.BuildConfigsController"> <div class="row" ng-controller="Kubernetes.BuildConfigsController">
<script type="text/ng-template" id="buildConfigLinkTemplate.html"> <script type="text/ng-template" id="buildConfigLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View details for this build configuration" <a title="View details for this build configuration"
href="{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}"> href="{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}">
<!-- <!--
<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
--> -->
{{row.entity.metadata.name}}</a> {{row.entity.metadata.name}}</a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigViewsTemplate.html"> <script type="text/ng-template" id="buildConfigViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8Views track by $index"> <span ng-repeat="view in row.entity.$fabric8Views track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigCodeViewsTemplate.html"> <script type="text/ng-template" id="buildConfigCodeViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8CodeViews track by $index"> <span ng-repeat="view in row.entity.$fabric8CodeViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigBuildViewsTemplate.html"> <script type="text/ng-template" id="buildConfigBuildViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8BuildViews track by $index"> <span ng-repeat="view in row.entity.$fabric8BuildViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigEnvironmentViewsTemplate.html"> <script type="text/ng-template" id="buildConfigEnvironmentViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8EnvironmentViews track by $index"> <span ng-repeat="view in row.entity.$fabric8EnvironmentViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildConfigTeamViewsTemplate.html"> <script type="text/ng-template" id="buildConfigTeamViewsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="view in row.entity.$fabric8TeamViews track by $index"> <span ng-repeat="view in row.entity.$fabric8TeamViews track by $index">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
</span> </span>
</div> </div>
</script> </script>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="buildConfigs.length" <hawtio-filter ng-show="buildConfigs.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter build configurations..."></hawtio-filter> placeholder="Filter build configurations..."></hawtio-filter>
</span> </span>
<button ng-show="fetched" <button ng-show="fetched"
title="Delete the selected build configuration" title="Delete the selected build configuration"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="tableConfig.selectedItems.length == 0" ng-disabled="tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(tableConfig.selectedItems)"> ng-click="deletePrompt(tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Add a build configuration for an existing project" title="Add a build configuration for an existing project"
href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-wrench"></i> Add Build</a> href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-wrench"></i> Add Build</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" href="/workspaces/{{namespace}}/forge/createProject" <a class="btn btn-primary pull-right" href="/workspaces/{{namespace}}/forge/createProject"
ng-show="isLoggedIntoGogs()" ng-show="isLoggedIntoGogs()"
title="Create a new app and repository"> title="Create a new app and repository">
<i class="fa fa-plus"></i> Create Project</a> <i class="fa fa-plus"></i> Create Project</a>
</a> </a>
<span class="pull-right" ng-show="isLoggedIntoGogs()">&nbsp;</span> <span class="pull-right" ng-show="isLoggedIntoGogs()">&nbsp;</span>
<a class="btn btn-primary pull-right" href="/workspaces/{{namespace}}/forge/repos" <a class="btn btn-primary pull-right" href="/workspaces/{{namespace}}/forge/repos"
ng-hide="isLoggedIntoGogs()" ng-hide="isLoggedIntoGogs()"
title="Sign in to gogs so that you can create a new app"> title="Sign in to gogs so that you can create a new app">
<i class="fa fa-sign-in"></i> Sign In</a> <i class="fa fa-sign-in"></i> Sign In</a>
</a> </a>
<span class="pull-right" ng-hide="isLoggedIntoGogs()">&nbsp;</span> <span class="pull-right" ng-hide="isLoggedIntoGogs()">&nbsp;</span>
<button class="btn btn-default pull-right" <button class="btn btn-default pull-right"
title="Trigger the given build" title="Trigger the given build"
ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl" ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl"
ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button> ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.buildconfigs.length" class="align-center"> <div ng-hide="model.buildconfigs.length" class="align-center">
<p class="alert alert-info">There are no build configurations available.</p> <p class="alert alert-info">There are no build configurations available.</p>
<a class="btn btn-primary" href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-wrench"></i> Add Build Configuration</a> <a class="btn btn-primary" href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-wrench"></i> Add Build Configuration</a>
</div> </div>
<div ng-show="model.buildconfigs.length"> <div ng-show="model.buildconfigs.length">
<table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace" <table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,45 +1,45 @@
<div ng-controller="Kubernetes.BuildLogsController"> <div ng-controller="Kubernetes.BuildLogsController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="entity.$viewLink" <a class="btn btn-default pull-right" ng-show="entity.$viewLink"
title="View the build detail" title="View the build detail"
href="{{entity.$viewLink}}"> href="{{entity.$viewLink}}">
Build Build
</a> </a>
<a class="btn btn-primary pull-right" ng-show="entity.$configLink" <a class="btn btn-primary pull-right" ng-show="entity.$configLink"
title="View the build configuration" title="View the build configuration"
href="{{entity.$configLink}}"> href="{{entity.$configLink}}">
Configuration Configuration
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<h3>logs for {{entity.$configId}}</h3> <h3>logs for {{entity.$configId}}</h3>
<p> <p>
<pre> <pre>
<code> <code>
{{logsText}} {{logsText}}
</code> </code>
</pre> </pre>
</p> </p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,111 +1,111 @@
<div class="row" ng-controller="Kubernetes.BuildsController"> <div class="row" ng-controller="Kubernetes.BuildsController">
<script type="text/ng-template" id="buildLinkTemplate.html"> <script type="text/ng-template" id="buildLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View details for this build: {{row.entity.$name}}" <a title="View details for this build: {{row.entity.$name}}"
href="{{row.entity.$viewLink}}"> href="{{row.entity.$viewLink}}">
<!-- <!--
<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
--> -->
{{row.entity.$shortName}} {{row.entity.$shortName}}
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildPodTemplate.html"> <script type="text/ng-template" id="buildPodTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View the pod for this build: {{row.entity.podName}}" ng-show="row.entity.$podLink" <a title="View the pod for this build: {{row.entity.podName}}" ng-show="row.entity.$podLink"
href="{{row.entity.$podLink}}"> href="{{row.entity.$podLink}}">
{{row.entity.$podShortName}}</a> {{row.entity.$podShortName}}</a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildLogsTemplate.html"> <script type="text/ng-template" id="buildLogsTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View the log for this build" ng-show="row.entity.$logsLink" <a title="View the log for this build" ng-show="row.entity.$logsLink"
href="{{row.entity.$logsLink}}"> href="{{row.entity.$logsLink}}">
<i class="fa fa-file-text-o"></i> Logs <i class="fa fa-file-text-o"></i> Logs
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildRepositoryTemplate.html"> <script type="text/ng-template" id="buildRepositoryTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a ng-show="row.entity.spec.source.git.uri" target="gitRepository" <a ng-show="row.entity.spec.source.git.uri" target="gitRepository"
title="View the git based source repository" title="View the git based source repository"
href="{{row.entity.spec.source.git.uri}}"> href="{{row.entity.spec.source.git.uri}}">
{{row.entity.spec.source.git.uri}} {{row.entity.spec.source.git.uri}}
</a> </a>
<span ng-hide="row.entity.spec.source.git.uri"> <span ng-hide="row.entity.spec.source.git.uri">
{{row.entity.spec.source.git.uri}} {{row.entity.spec.source.git.uri}}
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildStatusTemplate.html"> <script type="text/ng-template" id="buildStatusTemplate.html">
<div class="ngCellText" ng-switch="row.entity.status.phase"> <div class="ngCellText" ng-switch="row.entity.status.phase">
<span ng-switch-when="New" class="text-primary"> <span ng-switch-when="New" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> New <i class="fa fa-spin fa-spinner"></i> New
</span> </span>
<span ng-switch-when="Pending" class="text-primary"> <span ng-switch-when="Pending" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> Pending <i class="fa fa-spin fa-spinner"></i> Pending
</span> </span>
<span ng-switch-when="Running" class="text-primary"> <span ng-switch-when="Running" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> Running <i class="fa fa-spin fa-spinner"></i> Running
</span> </span>
<span ng-switch-when="Complete" class="text-success"> <span ng-switch-when="Complete" class="text-success">
<i class="fa fa-check-circle"></i> Complete <i class="fa fa-check-circle"></i> Complete
</span> </span>
<span ng-switch-when="Failed" class="text-danger"> <span ng-switch-when="Failed" class="text-danger">
<i class="fa fa-exclamation-circle"></i> Failed <i class="fa fa-exclamation-circle"></i> Failed
</span> </span>
<span ng-switch-default class="text-warning"> <span ng-switch-default class="text-warning">
<i class="fa fa-exclamation-triangle"></i> {{row.entity.status}} <i class="fa fa-exclamation-triangle"></i> {{row.entity.status}}
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="buildTimeTemplate.html"> <script type="text/ng-template" id="buildTimeTemplate.html">
<div class="ngCellText" title="built at: {{row.entity.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}"> <div class="ngCellText" title="built at: {{row.entity.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}">
{{row.entity.$creationDate.relative()}} {{row.entity.$creationDate.relative()}}
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" > <div class="col-md-12" >
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-show="model.builds.length" <hawtio-filter ng-show="model.builds.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter builds..."></hawtio-filter> placeholder="Filter builds..."></hawtio-filter>
</span> </span>
<div class="pull-right" ng-repeat="view in buildConfig.$fabric8BuildViews | orderBy:'label'"> <div class="pull-right" ng-repeat="view in buildConfig.$fabric8BuildViews | orderBy:'label'">
<a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default"> <a title="{{view.description}}" ng-show="view.url" ng-href="{{view.url}}" class="btn btn-default">
<i class="{{view.iconClass}}" ng-show="view.iconClass"></i> <i class="{{view.iconClass}}" ng-show="view.iconClass"></i>
{{view.label}} {{view.label}}
</a> </a>
<span class="pull-right" ng-show="view.url" >&nbsp;</span> <span class="pull-right" ng-show="view.url" >&nbsp;</span>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div ng-hide="model.builds.length" class="align-center"> <div ng-hide="model.builds.length" class="align-center">
<p class="alert alert-info">There are no builds currently running.</p> <p class="alert alert-info">There are no builds currently running.</p>
</div> </div>
<div ng-show="model.builds.length"> <div ng-show="model.builds.length">
<table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table> <table class="table table-bordered table-striped" hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,21 +1,21 @@
<div ng-controller="Kubernetes.DeploymentConfigController"> <div ng-controller="Kubernetes.DeploymentConfigController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/deploymentConfigs"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/deploymentConfigs"><i class="fa fa-list"></i></a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-object="entity" config="config"></div> <div hawtio-object="entity" config="config"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,67 +1,67 @@
<div class="row" ng-controller="Kubernetes.DeploymentConfigsController"> <div class="row" ng-controller="Kubernetes.DeploymentConfigsController">
<script type="text/ng-template" id="deploymentConfigLinkTemplate.html"> <script type="text/ng-template" id="deploymentConfigLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<a title="View details for this build configuration" <a title="View details for this build configuration"
href="{{baseUri}}/kubernetes/deploymentConfigs/{{row.entity.metadata.name}}"> href="{{baseUri}}/kubernetes/deploymentConfigs/{{row.entity.metadata.name}}">
<!-- <!--
<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
--> -->
{{row.entity.metadata.name}}</a> {{row.entity.metadata.name}}</a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="deploymentConfigLabelTemplate.html"> <script type="text/ng-template" id="deploymentConfigLabelTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="(key, label) in row.entity.template.controllerTemplate.template.metadata.labels track by $index" <span ng-repeat="(key, label) in row.entity.template.controllerTemplate.template.metadata.labels track by $index"
class="pod-label badge" class="pod-label badge"
ng-class="labelClass(key)" ng-class="labelClass(key)"
ng-click="clickTag(entity, key, label)" ng-click="clickTag(entity, key, label)"
title="{{key}}">{{label}}</span> title="{{key}}">{{label}}</span>
</div> </div>
</script> </script>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="deploymentConfigs.length" <hawtio-filter ng-show="deploymentConfigs.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter deployment configurations..."></hawtio-filter> placeholder="Filter deployment configurations..."></hawtio-filter>
</span> </span>
<button ng-show="fetched && deploymentConfigs.length" <button ng-show="fetched && deploymentConfigs.length"
title="Delete the selected build configuration" title="Delete the selected build configuration"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="tableConfig.selectedItems.length == 0" ng-disabled="tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(tableConfig.selectedItems)"> ng-click="deletePrompt(tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Create a new build configuration" title="Create a new build configuration"
href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-plus"></i> Create</a> href="{{baseUri}}/kubernetes/buildConfigCreate"><i class="fa fa-plus"></i> Create</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
ng-show="fetched && deploymentConfigs.length" ng-show="fetched && deploymentConfigs.length"
title="Trigger the given build" title="Trigger the given build"
ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl" ng-disabled="tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl"
ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button> ng-click="triggerBuild(tableConfig.selectedItems[0])"><i class="fa fa-play-circle-o"></i> Trigger</button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div ng-hide="deploymentConfigs.length" class="align-center"> <div ng-hide="deploymentConfigs.length" class="align-center">
<p class="alert alert-info">There are no deployment configurations available.</p> <p class="alert alert-info">There are no deployment configurations available.</p>
<a class="btn btn-primary" href="{{baseUri}}/kubernetes/deploymentConfigCreate"><i class="fa fa-plus"></i> Create Deployment Configuration</a> <a class="btn btn-primary" href="{{baseUri}}/kubernetes/deploymentConfigCreate"><i class="fa fa-plus"></i> Create Deployment Configuration</a>
</div> </div>
<div ng-show="deploymentConfigs.length"> <div ng-show="deploymentConfigs.length">
<table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace" <table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,72 +1,72 @@
<div ng-controller="Kubernetes.EventsController"> <div ng-controller="Kubernetes.EventsController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" ng-show="model.events.length"> <div class="col-md-12" ng-show="model.events.length">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="筛选日志信息..."></hawtio-filter> placeholder="筛选日志信息..."></hawtio-filter>
</span> </span>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="id" <button ng-show="id"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
ng-click="id = undefined"><i class="fa fa-list"></i></button> ng-click="id = undefined"><i class="fa fa-list"></i></button>
<span ng-include="'runButton.html'"></span> <span ng-include="'runButton.html'"></span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.events.length" class="align-center"> <div ng-hide="model.events.length" class="align-center">
<p class="alert alert-info">There are no events currently available.</p> <p class="alert alert-info">There are no events currently available.</p>
</div> </div>
<div ng-show="model.events.length"> <div ng-show="model.events.length">
<div ng-show="mode == 'list'"> <div ng-show="mode == 'list'">
<table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace" <table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
<div ng-hide="mode == 'list'"> <div ng-hide="mode == 'list'">
<div class="column-box" <div class="column-box"
ng-repeat="service in model.serviceApps | filter:filterTemplates | orderBy:'metadata.name' track by $index"> ng-repeat="service in model.serviceApps | filter:filterTemplates | orderBy:'metadata.name' track by $index">
<div class="row"> <div class="row">
<div class="col-md-2"> <div class="col-md-2">
<a href="{{service.$serviceUrl}}" <a href="{{service.$serviceUrl}}"
target="_blank" target="_blank"
title="Click to open this app"> title="Click to open this app">
<img style="width: 64px; height: 64px;" ng-src="{{service.$iconUrl}}"> <img style="width: 64px; height: 64px;" ng-src="{{service.$iconUrl}}">
</a> </a>
</div> </div>
<div class="col-md-9"> <div class="col-md-9">
<a href="{{service.$serviceUrl}}" <a href="{{service.$serviceUrl}}"
target="_blank" target="_blank"
title="Click to open this app"> title="Click to open this app">
<h3 ng-bind="service.metadata.name"></h3> <h3 ng-bind="service.metadata.name"></h3>
</a> </a>
</div> </div>
<!-- <!--
<div class="col-md-1"> <div class="col-md-1">
<a href="" ng-click="deleteService(service)"><i class="fa fa-remove red"></i></a> <a href="" ng-click="deleteService(service)"><i class="fa fa-remove red"></i></a>
</div> </div>
--> -->
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,61 +1,61 @@
<div ng-controller="Kubernetes.HostController"> <div ng-controller="Kubernetes.HostController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/hosts"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/hosts"><i class="fa fa-list"></i></a>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
ng-click="flipRaw()" ng-click="flipRaw()"
title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a> title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a>
<a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a> <a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a> <a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" <a class="btn btn-primary pull-right"
title="View all the pods on this host" title="View all the pods on this host"
href="{{baseUri}}/kubernetes/pods/?q=host={{item.id}}"> href="{{baseUri}}/kubernetes/pods/?q=host={{item.id}}">
Pods Pods
</a> </a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched && !rawMode"> <div ng-show="model.fetched && !rawMode">
<div hawtio-object="item" config="itemConfig"></div> <div hawtio-object="item" config="itemConfig"></div>
</div> </div>
</div> </div>
</div> </div>
<div class="span12"> <div class="span12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched && rawMode"> <div ng-show="model.fetched && rawMode">
<div class="row-fluid wiki-fixed form-horizontal"> <div class="row-fluid wiki-fixed form-horizontal">
<div class="control-group editor-autoresize"> <div class="control-group editor-autoresize">
<div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div> <div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,43 +1,43 @@
<div class="row" ng-controller="Kubernetes.HostsController"> <div class="row" ng-controller="Kubernetes.HostsController">
<script type="text/ng-template" id="hostLinkTemplate.html"> <script type="text/ng-template" id="hostLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-show="model.hosts.length" <hawtio-filter ng-show="model.hosts.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter hosts..."></hawtio-filter> placeholder="Filter hosts..."></hawtio-filter>
</span> </span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.hosts.length" class="align-center"> <div ng-hide="model.hosts.length" class="align-center">
<p class="alert alert-info">There are no hosts currently running.</p> <p class="alert alert-info">There are no hosts currently running.</p>
</div> </div>
<div ng-show="model.hosts.length"> <div ng-show="model.hosts.length">
<table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace" <table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,51 +1,51 @@
<div class="row" ng-controller="Kubernetes.ImageRepositoriesController"> <div class="row" ng-controller="Kubernetes.ImageRepositoriesController">
<script type="text/ng-template" id="imageRegistryLabelTemplate.html"> <script type="text/ng-template" id="imageRegistryLabelTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="(key, label) in row.entity.tags track by $index" <span ng-repeat="(key, label) in row.entity.tags track by $index"
class="pod-label badge" class="pod-label badge"
ng-class="labelClass(key)" ng-class="labelClass(key)"
ng-click="clickTag(entity, key, label)" ng-click="clickTag(entity, key, label)"
title="{{key}}">{{label}}</span> title="{{key}}">{{label}}</span>
</div> </div>
</script> </script>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="imageRepositories.length" <hawtio-filter ng-show="imageRepositories.length"
ng-model="tableConfig.filterOptions.filterText" ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter image repositories..."></hawtio-filter> placeholder="Filter image repositories..."></hawtio-filter>
</span> </span>
<button ng-show="fetched && imageRepositories.length" <button ng-show="fetched && imageRepositories.length"
title="Delete the selected build configuration" title="Delete the selected build configuration"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="tableConfig.selectedItems.length == 0" ng-disabled="tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(tableConfig.selectedItems)"> ng-click="deletePrompt(tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Create a new image repository" title="Create a new image repository"
href="{{baseUri}}/kubernetes/imageRepositoryCreate"><i class="fa fa-plus"></i> Create</a> href="{{baseUri}}/kubernetes/imageRepositoryCreate"><i class="fa fa-plus"></i> Create</a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div ng-hide="imageRepositories.length" class="align-center"> <div ng-hide="imageRepositories.length" class="align-center">
<p class="alert alert-info">There are no image repositories available.</p> <p class="alert alert-info">There are no image repositories available.</p>
<a class="btn btn-primary" href="{{baseUri}}/kubernetes/imageRepositoryCreate"><i class="fa fa-plus"></i> Create Image Repository</a> <a class="btn btn-primary" href="{{baseUri}}/kubernetes/imageRepositoryCreate"><i class="fa fa-plus"></i> Create Image Repository</a>
</div> </div>
<div ng-show="imageRepositories.length"> <div ng-show="imageRepositories.length">
<table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace" <table class="table table-bordered table-striped" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,58 +1,58 @@
<div ng-init="mode='create'"> <div ng-init="mode='create'">
<div ng-controller="Kubernetes.BuildConfigEditController"> <div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Saves changes to this project configuration" title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name" ng-disabled="!entity.metadata.name"
ng-click="save()"> ng-click="save()">
Save Changes Save Changes
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<p class="hero-unit"> <p class="hero-unit">
Create a project by entering or copy/pasting the Git URL for a repository, and give the project a name. By default the name will be based on the repository name. Create a project by entering or copy/pasting the Git URL for a repository, and give the project a name. By default the name will be based on the repository name.
</p> </p>
<div hawtio-form-2="specConfig" entity="spec"></div> <div hawtio-form-2="specConfig" entity="spec"></div>
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal"> <form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset> <fieldset>
<div class="row"> <div class="row">
<div class="clearfix col-md-12"> <div class="clearfix col-md-12">
<div class="form-group"> <div class="form-group">
<label class="control-label">Name</label> <label class="control-label">Name</label>
<input type="text" class="form-control" pattern="[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*" ng-model="entity.metadata.name" required> <input type="text" class="form-control" pattern="[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*" ng-model="entity.metadata.name" required>
<p class="form-warning bg-danger" ng-show="nameForm.$error.pattern"> <p class="form-warning bg-danger" ng-show="nameForm.$error.pattern">
Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com` Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com`
</p> </p>
<p class="help-block">Name of this project</p> <p class="help-block">Name of this project</p>
</div> </div>
</div> </div>
</div> </div>
</fieldset> </fieldset>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,32 +1,32 @@
<div> <div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="fabric-page-header row"> <div class="fabric-page-header row">
<div class="pull-left" ng-show="iconURL"> <div class="pull-left" ng-show="iconURL">
<div class="app-logo"> <div class="app-logo">
<img ng-src="{{iconURL}}">&nbsp; <img ng-src="{{iconURL}}">&nbsp;
</div> </div>
</div> </div>
<div class="pull-left"> <div class="pull-left">
<h2 class="list-inline"><span class="contained c-wide3">&nbsp;{{displayName || appTitle}}</span></h2> <h2 class="list-inline"><span class="contained c-wide3">&nbsp;{{displayName || appTitle}}</span></h2>
</div> </div>
<div class="pull-right"> <div class="pull-right">
<button class="btn btn-success pull-right" <button class="btn btn-success pull-right"
title="Run this application" title="Run this application"
ng-disabled="!config || config.error" ng-disabled="!config || config.error"
ng-click="apply()"> ng-click="apply()">
<i class="fa fa-play-circle"></i> Run <i class="fa fa-play-circle"></i> Run
</button> </button>
</div> </div>
<div class="pull-left col-md-10 profile-summary-wide"> <div class="pull-left col-md-10 profile-summary-wide">
<div <div
ng-show="summaryHtml" ng-show="summaryHtml"
ng-bind-html-unsafe="summaryHtml"></div> ng-bind-html-unsafe="summaryHtml"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,244 +1,244 @@
<script type="text/ng-template" id="runButton.html"> <script type="text/ng-template" id="runButton.html">
<button ng-show="model.showRunButton" <button ng-show="model.showRunButton"
class="btn btn-success pull-right" class="btn btn-success pull-right"
ng-click="viewTemplates()" ng-click="viewTemplates()"
title="Run an application from a template"> title="Run an application from a template">
<i class="fa fa-play-circle"></i> Run ... <i class="fa fa-play-circle"></i> Run ...
</button> </button>
</script> </script>
<script type="text/ng-template" id="idTemplate.html"> <script type="text/ng-template" id="idTemplate.html">
<div class="ngCellText nowrap"> <div class="ngCellText nowrap">
<a href="" <a href=""
style="color:Blue" style="color:Blue"
title="View details for {{row.entity.metadata.name || row.entity.name}}"> title="View details for {{row.entity.metadata.name || row.entity.name}}">
<!--<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}" ng-show="row.entity.$iconUrl">--> <!--<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}" ng-show="row.entity.$iconUrl">-->
<strong>{{row.entity.$oracleName || row.entity.name}}</strong></a> <strong>{{row.entity.$oracleName || row.entity.name}}</strong></a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="selectorTemplate.html"> <script type="text/ng-template" id="selectorTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<span ng-repeat="(name, value) in row.entity.spec.selector track by $index"> <span ng-repeat="(name, value) in row.entity.spec.selector track by $index">
<strong>{{name}}</strong>: {{value}} <strong>{{name}}</strong>: {{value}}
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="podCountsAndLinkTemplate.html"> <script type="text/ng-template" id="podCountsAndLinkTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Status"> <div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Status">
<a ng-show="row.entity.$podCounters.podsLink" title="pods status"> <a ng-show="row.entity.$podCounters.podsLink" title="pods status">
<span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===2)" class="badge badge-success" > 启动</span> <span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===2)" class="badge badge-success" > 启动</span>
<span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===0)" class="badge badge-info" > 等待</span> <span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===0)" class="badge badge-info" > 等待</span>
<span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===1)" class="badge badge-warning" > 失败</span> <span ng-show="row.entity.$podCounters.ready && (row.entity.$oracleStatus===1)" class="badge badge-warning" > 失败</span>
<span ng-show="row.entity.$podCounters.valid || row.entity.$podCounters.waiting" class="badge badge-info"> 等待</span> <span ng-show="row.entity.$podCounters.valid || row.entity.$podCounters.waiting" class="badge badge-info"> 等待</span>
<span ng-show="!(row.entity.$podCounters.waiting || row.entity.$podCounters.ready || row.entity.$podCounters.valid || row.entity.$podCounters.error)" class="badge"> 停止</span> <span ng-show="!(row.entity.$podCounters.waiting || row.entity.$podCounters.ready || row.entity.$podCounters.valid || row.entity.$podCounters.error)" class="badge"> 停止</span>
<span ng-show="row.entity.$podCounters.error" class="badge badge-warning" > 失败</span> <span ng-show="row.entity.$podCounters.error" class="badge badge-warning" > 失败</span>
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="dataSummaryTemplate.html"> <script type="text/ng-template" id="dataSummaryTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity" > <div class="ngCellText" ng-init="entity=row.entity" >
<a ng-show="row.entity.$podCounters.podsLink" title="pods status"> <a ng-show="row.entity.$podCounters.podsLink" title="pods status">
<span ng-show="row.entity.$extractStatus === 0" class="badge badge-info" href=""> 未汇总</span> <span ng-show="row.entity.$extractStatus === 0" class="badge badge-info" href=""> 未汇总</span>
<span ng-show="row.entity.$extractStatus === 1" class="badge badge-success" href=""> 正在汇总</span> <span ng-show="row.entity.$extractStatus === 1" class="badge badge-success" href=""> 正在汇总</span>
<span ng-show="row.entity.$extractStatus === 2" class="badge" href=""> 已完成</span> <span ng-show="row.entity.$extractStatus === 2" class="badge" href=""> 已完成</span>
<span ng-show="row.entity.$extractStatus === 3" class="badge badge-warning" href=""> 失败</span> <span ng-show="row.entity.$extractStatus === 3" class="badge badge-warning" href=""> 失败</span>
<div ng-show="row.entity.$extractStatus === 10"> <div ng-show="row.entity.$extractStatus === 10">
<span class="badge badge-remind"> 汇总数据库</span> <span class="badge badge-remind"> 汇总数据库</span>
<span ng-include = "'oracleLogTemplate.html'"></span> <span ng-include = "'oracleLogTemplate.html'"></span>
</div> </div>
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="labelTemplate.html"> <script type="text/ng-template" id="labelTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Labels"> <div class="ngCellText" ng-init="entity=row.entity" ng-controller="Kubernetes.Labels">
<p ng-show="data"><strong>Labels</strong></p> <p ng-show="data"><strong>Labels</strong></p>
<span ng-repeat="label in labels track by $index" <span ng-repeat="label in labels track by $index"
class="pod-label badge" class="pod-label badge"
ng-class="labelClass(label.key)" ng-class="labelClass(label.key)"
ng-click="handleClick(entity, label.key, label)" ng-click="handleClick(entity, label.key, label)"
title="{{label.key}}">{{label.title}}</span> title="{{label.key}}">{{label.title}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="eventSourceTemplate.html"> <script type="text/ng-template" id="eventSourceTemplate.html">
<div class="ngCellText" ng-init="labels=row.entity.source"> <div class="ngCellText" ng-init="labels=row.entity.source">
<p ng-show="data"><strong>Labels</strong></p> <p ng-show="data"><strong>Labels</strong></p>
<span ng-repeat="(key, value) in labels track by $index" <span ng-repeat="(key, value) in labels track by $index"
class="pod-label badge" class="pod-label badge"
class="background-light-grey mouse-pointer" class="background-light-grey mouse-pointer"
title="{{key}}" title="{{key}}"
ng-click="$emit('labelFilterUpdate', key + '=' + value)">{{value}}</span> ng-click="$emit('labelFilterUpdate', key + '=' + value)">{{value}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="hostTemplate.html"> <script type="text/ng-template" id="hostTemplate.html">
<div class="ngCellText" ng-init="host=row.entity.$host"> <div class="ngCellText" ng-init="host=row.entity.$host">
<span class="pod-label badge background-light-grey mouse-pointer" <span class="pod-label badge background-light-grey mouse-pointer"
ng-click="$emit('labelFilterUpdate', 'host=' + host)">{{host}}</span> ng-click="$emit('labelFilterUpdate', 'host=' + host)">{{host}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="portalAddress.html"> <script type="text/ng-template" id="portalAddress.html">
<div class="ngCellText"> <div class="ngCellText">
<div ng-repeat="port in row.entity.$ports track by $index"> <div ng-repeat="port in row.entity.$ports track by $index">
<a target="_blank" href="{{row.entity.$connectUrl}}" <a target="_blank" href="{{row.entity.$connectUrl}}"
ng-show="row.entity.$connectUrl && row.entity.$podCounters.ready" ng-show="row.entity.$connectUrl && row.entity.$podCounters.ready"
title="Protocol {{row.entity.spec.protocol}}"> title="Protocol {{row.entity.spec.protocol}}">
{{row.entity.$host}} {{row.entity.$host}}
</a> </a>
<span ng-hide="row.entity.$connectUrl && row.entity.$podCounters.ready">{{row.entity.spec.portalIP || row.entity.spec.clusterIP}}:{{port}}</span> <span ng-hide="row.entity.$connectUrl && row.entity.$podCounters.ready">{{row.entity.spec.portalIP || row.entity.spec.clusterIP}}:{{port}}</span>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="iconCellTemplate.html"> <script type="text/ng-template" id="iconCellTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}"> <img class="app-icon-small" ng-src="{{row.entity.$iconUrl}}">
</div> </div>
</script> </script>
<script type="text/ng-template" id="ageTemplate.html"> <script type="text/ng-template" id="ageTemplate.html">
<div class="ngCellText " ng-model="row.entity.$pods[0].$age"> <div class="ngCellText " ng-model="row.entity.$pods[0].$age">
{{row.entity.$pods[0].$age}} {{row.entity.$pods[0].$age}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="firstTimestampTemplate.html"> <script type="text/ng-template" id="firstTimestampTemplate.html">
<div class="ngCellText" title="{{row.entity.$firstTimestamp}}"> <div class="ngCellText" title="{{row.entity.$firstTimestamp}}">
{{row.entity.$firstTimestamp | relativeTime}} {{row.entity.$firstTimestamp | relativeTime}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="lastTimestampTemplate.html"> <script type="text/ng-template" id="lastTimestampTemplate.html">
<div class="ngCellText" title="{{row.entity.$lastTimestamp}}"> <div class="ngCellText" title="{{row.entity.$lastTimestamp}}">
{{row.entity.$lastTimestamp | relativeTime}} {{row.entity.$lastTimestamp | relativeTime}}
</div> </div>
</script> </script>
<script type="text/ng-template" id="eventKindTemplate.html"> <script type="text/ng-template" id="eventKindTemplate.html">
<div class="ngCellText" ng-init="kind=row.entity.involvedObject.kind"> <div class="ngCellText" ng-init="kind=row.entity.involvedObject.kind">
<span class="pod-label badge" <span class="pod-label badge"
class="background-light-grey mouse-pointer" class="background-light-grey mouse-pointer"
ng-click="$emit('labelFilterUpdate', 'kind=' + kind)">{{kind}}</span> ng-click="$emit('labelFilterUpdate', 'kind=' + kind)">{{kind}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="eventNameTemplate.html"> <script type="text/ng-template" id="eventNameTemplate.html">
<div class="ngCellText" ng-init="name=row.entity.involvedObject.name"> <div class="ngCellText" ng-init="name=row.entity.involvedObject.name">
<span class="pod-label badge" <span class="pod-label badge"
class="background-light-grey mouse-pointer" class="background-light-grey mouse-pointer"
ng-click="$emit('labelFilterUpdate', 'name=' + name)">{{name}}</span> ng-click="$emit('labelFilterUpdate', 'name=' + name)">{{name}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="eventSummaryTemplate.html"> <script type="text/ng-template" id="eventSummaryTemplate.html">
<div class="ngCellText" title="Number of events on this resource"> <div class="ngCellText" title="Number of events on this resource">
<a ng-show="row.entity.$pods[0].$eventsLink" href="{{row.entity.$pods[0].$eventsLink}}"> <a ng-show="row.entity.$pods[0].$eventsLink" href="{{row.entity.$pods[0].$eventsLink}}">
<span class="badge">{{row.entity.$pods[0].$events.length}}</span> <span class="badge">{{row.entity.$pods[0].$events.length}}</span>
</a> </a>
</div> </div>
</script> </script>
<script type="text/ng-template" id="connectTemplate.html"> <script type="text/ng-template" id="connectTemplate.html">
<span ng-show="entity.$jolokiaUrl && entity.$ready" ng-controller="Kubernetes.ConnectController"> <span ng-show="entity.$jolokiaUrl && entity.$ready" ng-controller="Kubernetes.ConnectController">
<a class="clickable" <a class="clickable"
ng-click="doConnect(row.entity)" ng-click="doConnect(row.entity)"
title="Open a new window and connect to this container"> title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i> <i class="fa fa-sign-in"></i>
</a> </a>
</span> </span>
</script> </script>
<script type="text/ng-template" id="termTemplate.html"> <script type="text/ng-template" id="termTemplate.html">
<span ng-show="entity.status.phase === 'Running'" ng-controller="Kubernetes.TermController"> <span ng-show="entity.status.phase === 'Running'" ng-controller="Kubernetes.TermController">
<span ng-repeat="container in entity.spec.containers" ng-show="canConnectTo(container)"> <span ng-repeat="container in entity.spec.containers" ng-show="canConnectTo(container)">
<i class="fa fa-television clickable" title="Open up a terminal to {{container.name}}" ng-click="openTerminal(entity.metadata.selfLink, container.name)"></i> <i class="fa fa-television clickable" title="Open up a terminal to {{container.name}}" ng-click="openTerminal(entity.metadata.selfLink, container.name)"></i>
</span> </span>
</span> </span>
</script> </script>
<script type="text/ng-template" id="logIconTemplate.html"> <script type="text/ng-template" id="logIconTemplate.html">
<span ng-show="entity.status.phase === 'Running'" ng-controller="Kubernetes.PodLogLinkController"> <span ng-show="entity.status.phase === 'Running'" ng-controller="Kubernetes.PodLogLinkController">
<i class="fa fa-file-text" title="Open up the logs for {{entity.metadata.name}}" ng-click="openLogs(entity)"></i> <i class="fa fa-file-text" title="Open up the logs for {{entity.metadata.name}}" ng-click="openLogs(entity)"></i>
</span> </span>
</script> </script>
<script type="text/ng-template" id="oracleLogTemplate.html"> <script type="text/ng-template" id="oracleLogTemplate.html">
<span ng-controller="Kubernetes.PodLogLinkController"> <span ng-controller="Kubernetes.PodLogLinkController">
<i class="fa fa-file-text" title="打开{{entity.$oracleName}}的汇总日志" ng-click="openLogs(entity)"></i> <i class="fa fa-file-text" title="打开{{entity.$oracleName}}的汇总日志" ng-click="openLogs(entity)"></i>
</span> </span>
</script> </script>
<script type="text/ng-template" id="connectParamTemplate.html"> <script type="text/ng-template" id="connectParamTemplate.html">
<div class="ngCellText" ng-init="entity=row.entity"> <div class="ngCellText" ng-init="entity=row.entity">
<p ng-show="row.entity.$pods.length"><strong>{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl</strong></p> <p ng-show="row.entity.$pods.length"><strong>{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl</strong></p>
</div> </div>
</script> </script>
<script type="text/ng-template" id="statusTemplate.html"> <script type="text/ng-template" id="statusTemplate.html">
<div class="ngCellText nowrap" ng-init="entity=row.entity" ng-controller="Kubernetes.PodStatus" <div class="ngCellText nowrap" ng-init="entity=row.entity" ng-controller="Kubernetes.PodStatus"
title="Pod {{entity.metadata.name}} is {{entity.status.phase}}"> title="Pod {{entity.metadata.name}} is {{entity.status.phase}}">
<!-- in detail view --> <!-- in detail view -->
<p ng-show="data"><strong>Status: </strong></p> <p ng-show="data"><strong>Status: </strong></p>
<i class="fa {{entity.$statusCss}}"></i> <i class="fa {{entity.$statusCss}}"></i>
<span ng-show="data">{{data}}</span> <span ng-show="data">{{data}}</span>
<!-- in table --> <!-- in table -->
<span ng-include="'connectTemplate.html'"></span> <span ng-include="'connectTemplate.html'"></span>
<span ng-include="'termTemplate.html'"></span> <span ng-include="'termTemplate.html'"></span>
<span ng-include="'logIconTemplate.html'"></span> <span ng-include="'logIconTemplate.html'"></span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="resizeDialog.html"> <script type="text/ng-template" id="resizeDialog.html">
<div modal="resizeDialog.dialog.show"> <div modal="resizeDialog.dialog.show">
<form class="form-horizontal" ng-submit="resizeDialog.onOk()"> <form class="form-horizontal" ng-submit="resizeDialog.onOk()">
<div class="modal-header"><h4>Scale {{resizeDialog.controller.metadata.name}}</h4></div> <div class="modal-header"><h4>Scale {{resizeDialog.controller.metadata.name}}</h4></div>
<div class="modal-body"> <div class="modal-body">
<div class="control-group"> <div class="control-group">
<label class="control-label" for="replicas">Number of pods you would like to scale to?</label> <label class="control-label" for="replicas">Number of pods you would like to scale to?</label>
<div class="controls"> <div class="controls">
<input type="number" min="0" id="replicas" ng-model="resizeDialog.newReplicas"> <input type="number" min="0" id="replicas" ng-model="resizeDialog.newReplicas">
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<input class="btn btn-primary" type="submit" <input class="btn btn-primary" type="submit"
ng-disabled="resizeDialog.newReplicas === resizeDialog.controller.status.replicas" ng-disabled="resizeDialog.newReplicas === resizeDialog.controller.status.replicas"
value="Resize"> value="Resize">
<button class="btn btn-warning cancel" type="button" ng-click="resizeDialog.close()">取消</button> <button class="btn btn-warning cancel" type="button" ng-click="resizeDialog.close()">取消</button>
</div> </div>
</form> </form>
</div> </div>
</script> </script>
<script type="text/ng-template" id="namespaceSelector.html"> <script type="text/ng-template" id="namespaceSelector.html">
<span ng-controller="Kubernetes.NamespaceController"> <span ng-controller="Kubernetes.NamespaceController">
namespace: namespace:
<select ng-model="namespace" ng-options="namespace for namespace in namespaces" <select ng-model="namespace" ng-options="namespace for namespace in namespaces"
title="choose the namespace - which is a selection of resources in kubernetes"> title="choose the namespace - which is a selection of resources in kubernetes">
</select> </select>
</span> </span>
</script> </script>
<script type="text/ng-template" id="pendingPipelines.html"> <script type="text/ng-template" id="pendingPipelines.html">
<div class="row" ng-controller="Developer.PipelinesController"> <div class="row" ng-controller="Developer.PipelinesController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.job.builds.length" class="align-center"> <div ng-hide="model.job.builds.length" class="align-center">
<p class="alert alert-info">There are no pipelines for this job.</p> <p class="alert alert-info">There are no pipelines for this job.</p>
</div> </div>
<div ng-show="model.job.builds.length"> <div ng-show="model.job.builds.length">
<div class="pipeline-build-block" ng-repeat="build in model.job.builds | filter:model.filterText track by $index"> <div class="pipeline-build-block" ng-repeat="build in model.job.builds | filter:model.filterText track by $index">
<div pipeline-view></div> <div pipeline-view></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="creationTimeTemplate.html"> <script type="text/ng-template" id="creationTimeTemplate.html">
<div class="ngCellText" title="created at: {{row.entity.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}"> <div class="ngCellText" title="created at: {{row.entity.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}">
{{row.entity.$creationDate.relative()}} {{row.entity.$creationDate.relative()}}
</div> </div>
</script> </script>
<div ng-controller="Kubernetes.TopLevel"> <div ng-controller="Kubernetes.TopLevel">
<div class="wiki-icon-view" ng-controller="Kubernetes.FileDropController" nv-file-drop nv-file-over <div class="wiki-icon-view" ng-controller="Kubernetes.FileDropController" nv-file-drop nv-file-over
uploader="uploader" over-class="ready-drop"> uploader="uploader" over-class="ready-drop">
<div class="row kubernetes-view" ng-view></div> <div class="row kubernetes-view" ng-view></div>
</div> </div>
</div> </div>

View File

@ -1,15 +1,15 @@
<div class="terminal-window pod-log-window" pod-log-window ng-mousedown="raise()"> <div class="terminal-window pod-log-window" pod-log-window ng-mousedown="raise()">
<div class="resize-dot" ng-mousedown="startResize($event)" ng-hide="docked"></div> <div class="resize-dot" ng-mousedown="startResize($event)" ng-hide="docked"></div>
<div class="centered scroll-indicator" ng-hide="atBottom" ng-click="atBottom = true"> <div class="centered scroll-indicator" ng-hide="atBottom" ng-click="atBottom = true">
<span class="fa fa-caret-down"></span> <span class="fa fa-caret-down"></span>
</div> </div>
<div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)"> <div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)">
<h5 class="top-bottom-middle">{{containerName}}的汇总日志</h5> <h5 class="top-bottom-middle">{{containerName}}的汇总日志</h5>
<i class="fa fa-remove pull-right clickable" title="Close and exit this log" ng-click="close()"></i> <i class="fa fa-remove pull-right clickable" title="Close and exit this log" ng-click="close()"></i>
<i class="fa fa-square-o pull-right clickable" title="Maximize this log" ng-click="maximize($event)"></i> <i class="fa fa-square-o pull-right clickable" title="Maximize this log" ng-click="maximize($event)"></i>
<i class="fa fa-sort-desc pull-right clickable" ng-hide="maximized()" title="Minimize this log" ng-click="minimize($event)"></i> <i class="fa fa-sort-desc pull-right clickable" ng-hide="maximized()" title="Minimize this log" ng-click="minimize($event)"></i>
</div> </div>
<!--<div class="terminal-body" scroll-glue ng-model="atBottom" style="overflow-y:hidden"> --> <!--<div class="terminal-body" scroll-glue ng-model="atBottom" style="overflow-y:hidden"> -->
<textarea style="height:100%; width:100%" disabled="disabled">{{logs}}</textarea> <textarea style="height:100%; width:100%" disabled="disabled">{{logs}}</textarea>
<!--</div>--> <!--</div>-->
</div> </div>

View File

@ -1,117 +1,117 @@
<div ng-controller="Kubernetes.OverviewController"> <div ng-controller="Kubernetes.OverviewController">
<script type="text/ng-template" id="serviceBoxTemplate.html"> <script type="text/ng-template" id="serviceBoxTemplate.html">
<div> <div>
<div class="align-left node-body">{{entity.$portsText}}</div> <div class="align-left node-body">{{entity.$portsText}}</div>
<div class="align-right node-header" title="{{entity.metadata.name}}" ng-bind="entity.metadata.name"></div> <div class="align-right node-header" title="{{entity.metadata.name}}" ng-bind="entity.metadata.name"></div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="serviceTemplate.html"> <script type="text/ng-template" id="serviceTemplate.html">
<div class="kubernetes-overview-row"> <div class="kubernetes-overview-row">
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div id="{{service._key}}" <div id="{{service._key}}"
namespace="{{service.metadata.namespace}}" namespace="{{service.metadata.namespace}}"
connect-to="{{service.connectTo}}" connect-to="{{service.connectTo}}"
data-type="service" data-type="service"
class="jsplumb-node kubernetes-node kubernetes-service-node" class="jsplumb-node kubernetes-node kubernetes-service-node"
ng-controller="Kubernetes.OverviewBoxController" ng-controller="Kubernetes.OverviewBoxController"
ng-init="entity=getEntity('service', '{{service._key}}')" ng-init="entity=getEntity('service', '{{service._key}}')"
ng-mouseenter="mouseEnter($event)" ng-mouseenter="mouseEnter($event)"
ng-mouseleave="mouseLeave($event)" ng-mouseleave="mouseLeave($event)"
ng-click="viewDetails(entity, 'services')"> ng-click="viewDetails(entity, 'services')">
<div ng-init="entity=entity" ng-include="'serviceBoxTemplate.html'"></div> <div ng-init="entity=entity" ng-include="'serviceBoxTemplate.html'"></div>
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="overviewHostTemplate.html"> <script type="text/ng-template" id="overviewHostTemplate.html">
<div class="kubernetes-overview-row"> <div class="kubernetes-overview-row">
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div id="{{host.elementId}}" <div id="{{host.elementId}}"
data-type="host" data-type="host"
class="kubernetes-host-container host"> class="kubernetes-host-container host">
<h5><img ng-src="{{host.$iconUrl}}" style="width: 32px; height: 32px;"> <h5><img ng-src="{{host.$iconUrl}}" style="width: 32px; height: 32px;">
<a ng-href="{{baseUri}}/kubernetes/hosts/{{host.id}}">{{host.id}}</a> <a ng-href="{{baseUri}}/kubernetes/hosts/{{host.id}}">{{host.id}}</a>
</h5> </h5>
<div class="pod-container"></div> <div class="pod-container"></div>
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="podTemplate.html"> <script type="text/ng-template" id="podTemplate.html">
<div id="{{pod._key}}" <div id="{{pod._key}}"
data-type="pod" data-type="pod"
title="Pod ID: {{pod.metadata.name}}" title="Pod ID: {{pod.metadata.name}}"
class="jsplumb-node kubernetes-node kubernetes-pod-node" class="jsplumb-node kubernetes-node kubernetes-pod-node"
ng-mouseenter="mouseEnter($event)" ng-mouseenter="mouseEnter($event)"
ng-mouseleave="mouseLeave($event)" ng-mouseleave="mouseLeave($event)"
ng-controller="Kubernetes.OverviewBoxController" ng-controller="Kubernetes.OverviewBoxController"
ng-init="entity=getEntity('pod', '{{pod._key}}')" ng-init="entity=getEntity('pod', '{{pod._key}}')"
ng-click="viewDetails(entity, 'pods')"> ng-click="viewDetails(entity, 'pods')">
<div class="css-table"> <div class="css-table">
<div class="css-table-row"> <div class="css-table-row">
<div class="pod-status-cell css-table-cell"> <div class="pod-status-cell css-table-cell">
<span ng-init="row={ entity: entity }" ng-include="'statusTemplate.html'"></span> <span ng-init="row={ entity: entity }" ng-include="'statusTemplate.html'"></span>
</div> </div>
<div class="pod-label-cell css-table-cell"> <div class="pod-label-cell css-table-cell">
<span ng-init="row={ entity: entity }" ng-include="'labelTemplate.html'"></span> <span ng-init="row={ entity: entity }" ng-include="'labelTemplate.html'"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="replicationControllerTemplate.html"> <script type="text/ng-template" id="replicationControllerTemplate.html">
<div class="kubernetes-overview-row"> <div class="kubernetes-overview-row">
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div <div
id="{{replicationController._key}}" id="{{replicationController._key}}"
title="{{replicationController.id}}" title="{{replicationController.id}}"
data-type="replicationController" data-type="replicationController"
data-placement="top" data-placement="top"
connect-to="{{replicationController.connectTo}}" connect-to="{{replicationController.connectTo}}"
ng-mouseenter="mouseEnter($event)" ng-mouseenter="mouseEnter($event)"
ng-mouseleave="mouseLeave($event)" ng-mouseleave="mouseLeave($event)"
class="jsplumb-node kubernetes-replicationController-node kubernetes-node" class="jsplumb-node kubernetes-replicationController-node kubernetes-node"
ng-controller="Kubernetes.OverviewBoxController" ng-controller="Kubernetes.OverviewBoxController"
ng-init="entity=getEntity('replicationController', '{{replicationController._key}}')" ng-init="entity=getEntity('replicationController', '{{replicationController._key}}')"
ng-click="viewDetails(entity, 'replicationControllers')"> ng-click="viewDetails(entity, 'replicationControllers')">
<img class="app-icon-medium" ng-src="{{replicationController.$iconUrl}}"> <img class="app-icon-medium" ng-src="{{replicationController.$iconUrl}}">
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<script type="text/ng-template" id="overviewTemplate.html"> <script type="text/ng-template" id="overviewTemplate.html">
<div class="kubernetes-overview" <div class="kubernetes-overview"
hawtio-jsplumb hawtio-jsplumb
draggable="false" draggable="false"
layout="false" layout="false"
node-sep="50" node-sep="50"
rank-sep="300"> rank-sep="300">
<div class="kubernetes-overview-row"> <div class="kubernetes-overview-row">
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div class="kubernetes-overview services"> <div class="kubernetes-overview services">
<h6>Services</h6> <h6>Services</h6>
</div> </div>
</div> </div>
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div class="kubernetes-overview hosts"> <div class="kubernetes-overview hosts">
<h6>Hosts and Pods</h6> <h6>Hosts and Pods</h6>
</div> </div>
</div> </div>
<div class="kubernetes-overview-cell"> <div class="kubernetes-overview-cell">
<div class="kubernetes-overview replicationControllers"> <div class="kubernetes-overview replicationControllers">
<h6>Replication controllers</h6> <h6>Replication controllers</h6>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<kubernetes-overview></kubernetes-overview> <kubernetes-overview></kubernetes-overview>
</div> </div>

View File

@ -1,20 +1,20 @@
<div class="pipeline-panel"> <div class="pipeline-panel">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<div class="spinner spinner-lg"></div> <div class="spinner spinner-lg"></div>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.job.builds.length" class="align-center"> <div ng-hide="model.job.builds.length" class="align-center">
<div> <div>
<h2>No Pipeline Available</h2> <h2>No Pipeline Available</h2>
<p>Pipeline is a kind of build which uses Jenkins Workflow internally which has multiple Stages. You will see the active pipelines here after you add a build to this project</p> <p>Pipeline is a kind of build which uses Jenkins Workflow internally which has multiple Stages. You will see the active pipelines here after you add a build to this project</p>
</div> </div>
</div> </div>
<div ng-show="model.job.builds.length"> <div ng-show="model.job.builds.length">
<div ng-repeat="build in model.job.builds | filter:model.filterText track by $index"> <div ng-repeat="build in model.job.builds | filter:model.filterText track by $index">
<div pipeline-view></div> <div pipeline-view></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,131 +1,131 @@
<div class="row" ng-controller="Kubernetes.PipelinesController"> <div class="row" ng-controller="Kubernetes.PipelinesController">
<script type="text/ng-template" id="hostLinkTemplate.html"> <script type="text/ng-template" id="hostLinkTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
</div> </div>
</script> </script>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12"> <div class="col-md-12">
<span> <span>
<hawtio-filter ng-show="pipelines.length" <hawtio-filter ng-show="pipelines.length"
ng-model="filterText" ng-model="filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter builds..."></hawtio-filter> placeholder="Filter builds..."></hawtio-filter>
</span> </span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Create a new project" title="Create a new project"
ng-show="forgeEnabled" ng-show="forgeEnabled"
href="/workspaces/{{namespace}}/forge/createProject"><i class="fa fa-plus"></i> Create Project</a> href="/workspaces/{{namespace}}/forge/createProject"><i class="fa fa-plus"></i> Create Project</a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div ng-hide="pipelines.length" class="align-center"> <div ng-hide="pipelines.length" class="align-center">
<p class="alert alert-info">There are no build pipelines available.</p> <p class="alert alert-info">There are no build pipelines available.</p>
<a class="btn btn-primary" href="{{baseUri}}/kubernetes/buildConfig">Create Build Configuration</a> <a class="btn btn-primary" href="{{baseUri}}/kubernetes/buildConfig">Create Build Configuration</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="fetched && pipelines.length"> <div ng-show="fetched && pipelines.length">
<div ng-repeat="pipeline in pipelines | filter:filterText"> <div ng-repeat="pipeline in pipelines | filter:filterText">
<div class="row"> <div class="row">
<div class="pipeline-row"> <div class="pipeline-row">
<div ng-repeat="step in pipeline.triggersSteps"> <div ng-repeat="step in pipeline.triggersSteps">
<div ng-switch="step.buildConfig.kind"> <div ng-switch="step.buildConfig.kind">
<div ng-switch-default=""> <div ng-switch-default="">
<div class="col-md-1" ng-hide="$first"> <div class="col-md-1" ng-hide="$first">
<div class="pipeline-arrow"> <div class="pipeline-arrow">
<i class="fa fa-long-arrow-right"></i> <i class="fa fa-long-arrow-right"></i>
</div> </div>
</div> </div>
<div class="col-md-2 pipeline-build" title="Build configuration"> <div class="col-md-2 pipeline-build" title="Build configuration">
<span class="pipeline-build-details"> <span class="pipeline-build-details">
<a title="View details for this build configuration" <a title="View details for this build configuration"
href="{{baseUri}}/kubernetes/buildConfigs/{{step.buildConfig.metadata.name}}"> href="{{baseUri}}/kubernetes/buildConfigs/{{step.buildConfig.metadata.name}}">
<i class="fa fa-cog"></i> <i class="fa fa-cog"></i>
{{step.buildConfig.metadata.name}} {{step.buildConfig.metadata.name}}
</a> </a>
</span> </span>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<span class="pipeline-last-build" ng-show="step.buildConfig.$lastBuild"> <span class="pipeline-last-build" ng-show="step.buildConfig.$lastBuild">
<a href="{{step.buildConfig.$lastBuild.$viewLink}}" title="view this build"> <a href="{{step.buildConfig.$lastBuild.$viewLink}}" title="view this build">
<i class="fa fa-info"></i> <i class="fa fa-info"></i>
build build
</a> </a>
</span> </span>
<div class="ngCellText" class="pipeline-last-build-time" <div class="ngCellText" class="pipeline-last-build-time"
title="last build was at: {{step.buildConfig.$lastBuild.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}"> title="last build was at: {{step.buildConfig.$lastBuild.$creationDate | date : 'h:mm:ss a, EEE MMM yyyy'}}">
<div ng-switch="step.buildConfig.$lastBuild.status"> <div ng-switch="step.buildConfig.$lastBuild.status">
<span ng-switch-when="New" class="text-primary"> <span ng-switch-when="New" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> new: {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-spin fa-spinner"></i> new: {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
<span ng-switch-when="Pending" class="text-primary"> <span ng-switch-when="Pending" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> pending: {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-spin fa-spinner"></i> pending: {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
<span ng-switch-when="Running" class="text-primary"> <span ng-switch-when="Running" class="text-primary">
<i class="fa fa-spin fa-spinner"></i> running {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-spin fa-spinner"></i> running {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
<span ng-switch-when="Complete" class="text-success"> <span ng-switch-when="Complete" class="text-success">
<i class="fa fa-check-circle"></i> completed {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-check-circle"></i> completed {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
<span ng-switch-when="Failed" class="text-danger"> <span ng-switch-when="Failed" class="text-danger">
<i class="fa fa-exclamation-circle"></i> failed {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-exclamation-circle"></i> failed {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
<span ng-switch-default class="text-warning"> <span ng-switch-default class="text-warning">
<i class="fa fa-exclamation-triangle"></i> {{step.buildConfig.$lastBuild.status}}: {{step.buildConfig.$lastBuild.$creationDate.relative()}} <i class="fa fa-exclamation-triangle"></i> {{step.buildConfig.$lastBuild.status}}: {{step.buildConfig.$lastBuild.$creationDate.relative()}}
</span> </span>
</div> </div>
</div> </div>
<div class="pipeline-last-build-logs"> <div class="pipeline-last-build-logs">
<a href="{{step.buildConfig.$lastBuild.$logsLink}}" title="view the logs of this build"> <a href="{{step.buildConfig.$lastBuild.$logsLink}}" title="view the logs of this build">
<i class="fa fa-file-text-o"></i> <i class="fa fa-file-text-o"></i>
logs logs
</a> </a>
</div> </div>
</div> </div>
</div> </div>
<div ng-switch-when="DeploymentConfig"> <div ng-switch-when="DeploymentConfig">
<div class="col-md-1"> <div class="col-md-1">
<div class="pipeline-arrow"> <div class="pipeline-arrow">
<i class="fa fa-long-arrow-right"></i> <i class="fa fa-long-arrow-right"></i>
</div> </div>
</div> </div>
<div class="col-md-2 pipeline-deploy" title="Deployment Configuration"> <div class="col-md-2 pipeline-deploy" title="Deployment Configuration">
<div class="pipeline-build-details"> <div class="pipeline-build-details">
<a title="View details for this deployment configuration" <a title="View details for this deployment configuration"
href="{{baseUri}}/kubernetes/deploymentConfigs/{{step.buildConfig.metadata.name}}"> href="{{baseUri}}/kubernetes/deploymentConfigs/{{step.buildConfig.metadata.name}}">
<i class="fa fa-cogs"></i> <i class="fa fa-cogs"></i>
{{step.buildConfig.metadata.name}} {{step.buildConfig.metadata.name}}
</a> </a>
</div> </div>
<div class="pipeline-deploy-pods"> <div class="pipeline-deploy-pods">
<div class="pipeline-pod-counts" ng-show="step.$podCounters">pods: <div class="pipeline-pod-counts" ng-show="step.$podCounters">pods:
<a ng-show="step.$podCounters.podsLink" target="pods" href="{{step.$podCounters.podsLink}}" <a ng-show="step.$podCounters.podsLink" target="pods" href="{{step.$podCounters.podsLink}}"
title="View pods for this deployment"> title="View pods for this deployment">
<span class="badge badge-success">{{step.$podCounters.ready}}</span> <span class="badge badge-success">{{step.$podCounters.ready}}</span>
<span class="badge badge-info">{{step.$podCounters.valid}}</span> <span class="badge badge-info">{{step.$podCounters.valid}}</span>
<span ng-show="step.$podCounters.waiting" class="badge">{{step.$podCounters.waiting}}</span> <span ng-show="step.$podCounters.waiting" class="badge">{{step.$podCounters.waiting}}</span>
<span ng-show="step.$podCounters.error" <span ng-show="step.$podCounters.error"
class="badge badge-warning">{{step.$podCounters.error}}</span> class="badge badge-warning">{{step.$podCounters.error}}</span>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,88 +1,88 @@
<div ng-controller="Kubernetes.PodController"> <div ng-controller="Kubernetes.PodController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row row-header"> <div class="row row-header">
<div class="col-md-12"> <div class="col-md-12">
<span ng-show="model.fetched && !rawMode" class="icon-heading"> <span ng-show="model.fetched && !rawMode" class="icon-heading">
<i ng-show="item.$statusCss" class="icon-selected-app fa {{item.$statusCss}}"></i> <i ng-show="item.$statusCss" class="icon-selected-app fa {{item.$statusCss}}"></i>
<img ng-show="item.$iconUrl" class="icon-selected-app" ng-src="{{item.$iconUrl}}">&nbsp;{{item.metadata.name}} <img ng-show="item.$iconUrl" class="icon-selected-app" ng-src="{{item.$iconUrl}}">&nbsp;{{item.metadata.name}}
</span> </span>
<button class="btn btn-danger pull-right" <button class="btn btn-danger pull-right"
title="Delete this Pod" title="Delete this Pod"
ng-click="deleteEntity()"> ng-click="deleteEntity()">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="{{baseUri}}/kubernetes/pods?namespace={{item.metadata.namespace}}"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/pods?namespace={{item.metadata.namespace}}"><i class="fa fa-list"></i></a>
<span ng-show="hasServiceKibana()" class="pull-right">&nbsp;</span> <span ng-show="hasServiceKibana()" class="pull-right">&nbsp;</span>
<button ng-show="hasServiceKibana()" <button ng-show="hasServiceKibana()"
class="btn btn-default pull-right" class="btn btn-default pull-right"
title="View the logs for this pod" title="View the logs for this pod"
ng-click="openLogs()"> ng-click="openLogs()">
<i class="fa fa-file-text-o"></i> Logs <i class="fa fa-file-text-o"></i> Logs
</button> </button>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
ng-click="flipRaw()" ng-click="flipRaw()"
title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a> title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a> <a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a> <a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-primary pull-right" <a class="btn btn-primary pull-right"
href="/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DPod%20name%3D{{item.metadata.name}}" href="/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DPod%20name%3D{{item.metadata.name}}"
title="View the events for this Pod"> title="View the events for this Pod">
<i class="fa fa-ellipsis-v"></i> Events <i class="fa fa-ellipsis-v"></i> Events
</a> </a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<div ng-show="item.$jolokiaUrl && item.$ready" ng-controller="Kubernetes.ConnectController" class="pull-right"> <div ng-show="item.$jolokiaUrl && item.$ready" ng-controller="Kubernetes.ConnectController" class="pull-right">
<span>&nbsp;</span> <span>&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
ng-click="doConnect(item)" ng-click="doConnect(item)"
title="Open a new window and connect to this container"> title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i> Connect <i class="fa fa-sign-in"></i> Connect
</a> </a>
</div> </div>
</div> </div>
</div> </div>
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched && !rawMode"> <div ng-show="model.fetched && !rawMode">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div hawtio-object="item" config="itemConfig"></div> <div hawtio-object="item" config="itemConfig"></div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched && rawMode"> <div ng-show="model.fetched && rawMode">
<div class="raw-json-view"> <div class="raw-json-view">
<div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div> <div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,27 +1,27 @@
<div ng-controller="Kubernetes.PodEditController"> <div ng-controller="Kubernetes.PodEditController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Go back to viewing all the pods" title="Go back to viewing all the pods"
href="{{baseUri}}/kubernetes/pods"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/pods"><i class="fa fa-list"></i></a>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Create a new pod" title="Create a new pod"
ng-click="save()"> ng-click="save()">
Create Pod Create Pod
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-form-2="config" entity="entity"></div> <div hawtio-form-2="config" entity="entity"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,27 +1,27 @@
<div ng-controller="Kubernetes.PodEditController"> <div ng-controller="Kubernetes.PodEditController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Go back to viewing all the pods" title="Go back to viewing all the pods"
href="{{baseUri}}/kubernetes/pods"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/pods"><i class="fa fa-list"></i></a>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Saves changes to this pod" title="Saves changes to this pod"
ng-click="save()"> ng-click="save()">
Save Save
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-form-2="config" entity="entity"></div> <div hawtio-form-2="config" entity="entity"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,87 +1,87 @@
<div class="row" ng-controller="Kubernetes.Pods"> <div class="row" ng-controller="Kubernetes.Pods">
<script type="text/ng-template" id="imageTemplate.html"> <script type="text/ng-template" id="imageTemplate.html">
<div class="ngCellText"> <div class="ngCellText">
<!-- in table --> <!-- in table -->
<span ng-hide="data"> <span ng-hide="data">
<span ng-repeat="container in row.entity.spec.containers"> <span ng-repeat="container in row.entity.spec.containers">
<span ng-hide="container.$imageLink">{{container.image}}</span> <span ng-hide="container.$imageLink">{{container.image}}</span>
<a ng-show="container.$imageLink" target="dockerRegistry" href="{{container.$imageLink}}" title="{{container.name}}">{{container.image}}</a> <a ng-show="container.$imageLink" target="dockerRegistry" href="{{container.$imageLink}}" title="{{container.name}}">{{container.image}}</a>
</span> </span>
</span> </span>
<!-- in detail view --> <!-- in detail view -->
<span ng-show="data"> <span ng-show="data">
<a target="dockerRegistry" ng-href="https://registry.hub.docker.com/u/{{data}}" title="{{data}}">{{data}}</a> <a target="dockerRegistry" ng-href="https://registry.hub.docker.com/u/{{data}}" title="{{data}}">{{data}}</a>
</span> </span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="configDetail.html"> <script type="text/ng-template" id="configDetail.html">
<pre>{{data}}</pre> <pre>{{data}}</pre>
</script> </script>
<script type="text/ng-template" id="envItemTemplate.html"> <script type="text/ng-template" id="envItemTemplate.html">
<span ng-controller="Kubernetes.EnvItem"> <span ng-controller="Kubernetes.EnvItem">
<span class="blue">{{key}}</span>=<span class="green">{{value}}</span> <span class="blue">{{key}}</span>=<span class="green">{{value}}</span>
</span> </span>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" ng-show="true"> <div class="col-md-12" ng-show="true">
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="Filter pods..."></hawtio-filter> placeholder="Filter pods..."></hawtio-filter>
</span> </span>
<button ng-show="model.fetched" <button ng-show="model.fetched"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(id || tableConfig.selectedItems)"> ng-click="deletePrompt(id || tableConfig.selectedItems)">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="id" <button ng-show="id"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
ng-click="id = undefined"><i class="fa fa-list"></i></button> ng-click="id = undefined"><i class="fa fa-list"></i></button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="hasServiceKibana()" <button ng-show="hasServiceKibana()"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
title="View the logs for the selected pods" title="View the logs for the selected pods"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="openLogs()"> ng-click="openLogs()">
<i class="fa fa-file-text-o"></i> Logs <i class="fa fa-file-text-o"></i> Logs
</button> </button>
<span ng-show="hasServiceKibana()" class="pull-right">&nbsp;</span> <span ng-show="hasServiceKibana()" class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Create a new pod" title="Create a new pod"
ng-click="createPods()"><i class="fa fa-plus"></i> 创建新服务</a> ng-click="createPods()"><i class="fa fa-plus"></i> 创建新服务</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<span ng-include="'runButton.html'"></span> <span ng-include="'runButton.html'"></span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.pods.length" class="align-center"> <div ng-hide="model.pods.length" class="align-center">
<p class="alert alert-info">There are no pods currently running.</p> <p class="alert alert-info">There are no pods currently running.</p>
</div> </div>
<div ng-show="model.pods.length"> <div ng-show="model.pods.length">
<table class="table table-striped table-bordered" ui-if="kubernetes.selectedNamespace" <table class="table table-striped table-bordered" ui-if="kubernetes.selectedNamespace"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,89 +1,89 @@
<div ng-controller="Kubernetes.ReplicationControllerController"> <div ng-controller="Kubernetes.ReplicationControllerController">
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row row-header"> <div class="row row-header">
<div class="col-md-12"> <div class="col-md-12">
<span ng-show="model.fetched && !rawMode" class="icon-heading"> <span ng-show="model.fetched && !rawMode" class="icon-heading">
<img ng-show="item.$iconUrl" class="icon-selected-app" ng-src="{{item.$iconUrl}}">&nbsp;{{item.metadata.name}} <img ng-show="item.$iconUrl" class="icon-selected-app" ng-src="{{item.$iconUrl}}">&nbsp;{{item.metadata.name}}
</span> </span>
<button class="btn btn-danger pull-right" <button class="btn btn-danger pull-right"
title="Delete this ReplicationController" title="Delete this ReplicationController"
ng-click="deleteEntity()"> ng-click="deleteEntity()">
<i class="fa fa-remove"></i> Delete <i class="fa fa-remove"></i> Delete
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Return to table of controllers" title="Return to table of controllers"
href="{{baseUri}}/kubernetes/replicationControllers?namespace={{item.metadata.namespace}}"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/replicationControllers?namespace={{item.metadata.namespace}}"><i class="fa fa-list"></i></a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
ng-click="flipRaw()" ng-click="flipRaw()"
title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a> title="{{rawMode ? 'Raw mode' : 'Form mode'}}">{{rawMode ? 'Form' : 'Raw'}}</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a> <a class="btn btn-default pull-right" ng-show="rawMode" ng-click="readOnly = !readOnly" ng-class="!readOnly ? 'btn-primary' : ''">Edit</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a> <a class="btn btn-success pull-right" ng-show="dirty" ng-click="save(rawModel)">Save</a>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
href="/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DReplicationController%20name%3D{{item.metadata.name}}" href="/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DReplicationController%20name%3D{{item.metadata.name}}"
title="View the events for this Replication Controller"> title="View the events for this Replication Controller">
<i class="fa fa-ellipsis-v"></i> Events <i class="fa fa-ellipsis-v"></i> Events
</a> </a>
<span class="pull-right">&nbsp;&nbsp;&nbsp;</span> <span class="pull-right">&nbsp;&nbsp;&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
ng-click="resizeDialog.open(item)" ng-click="resizeDialog.open(item)"
title="Scale this controller, changing the number of pods you wish to run"> title="Scale this controller, changing the number of pods you wish to run">
<i class="fa fa-server"></i> Scale <i class="fa fa-server"></i> Scale
</a> </a>
<span class="pull-right controller-pod-counts" ng-show="item.$podCounters">Pods: <span class="pull-right controller-pod-counts" ng-show="item.$podCounters">Pods:
<a ng-show="item.$podCounters.podsLink" href="{{link(item.$podCounters.podsLink)}}" title="View pods"> <a ng-show="item.$podCounters.podsLink" href="{{link(item.$podCounters.podsLink)}}" title="View pods">
<span ng-show="item.$podCounters.ready" class="badge badge-success">{{item.$podCounters.ready}}</span> <span ng-show="item.$podCounters.ready" class="badge badge-success">{{item.$podCounters.ready}}</span>
<span ng-show="item.$podCounters.valid" class="badge badge-info">{{item.$podCounters.valid}}</span> <span ng-show="item.$podCounters.valid" class="badge badge-info">{{item.$podCounters.valid}}</span>
<span ng-show="item.$podCounters.waiting" class="badge">{{item.$podCounters.waiting}}</span> <span ng-show="item.$podCounters.waiting" class="badge">{{item.$podCounters.waiting}}</span>
<span ng-show="item.$podCounters.error" class="badge badge-warning">{{item.$podCounters.error}}</span> <span ng-show="item.$podCounters.error" class="badge badge-warning">{{item.$podCounters.error}}</span>
</a> </a>
</span> </span>
</div> </div>
</div> </div>
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched && !rawMode"> <div ng-show="model.fetched && !rawMode">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div hawtio-object="item" config="itemConfig"></div> <div hawtio-object="item" config="itemConfig"></div>
</div> </div>
</div> </div>
</div> </div>
<div ng-show="model.fetched && rawMode"> <div ng-show="model.fetched && rawMode">
<div class="raw-json-view"> <div class="raw-json-view">
<div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div> <div hawtio-editor="rawModel" mode="mode" read-only="readOnly"></div>
</div> </div>
</div> </div>
<ng-include src="'resizeDialog.html'"/> <ng-include src="'resizeDialog.html'"/>
</div> </div>

View File

@ -1,27 +1,27 @@
<div ng-controller="Kubernetes.ReplicationControllerEditController"> <div ng-controller="Kubernetes.ReplicationControllerEditController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Go back to viewing all the replication controllers" title="Go back to viewing all the replication controllers"
href="{{baseUri}}/kubernetes/replicationControllers"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/replicationControllers"><i class="fa fa-list"></i></a>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Create a new controller" title="Create a new controller"
ng-click="save()"> ng-click="save()">
Create Controller Create Controller
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-form-2="config" entity="entity"></div> <div hawtio-form-2="config" entity="entity"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,27 +1,27 @@
<div ng-controller="Kubernetes.ReplicationControllerEditController"> <div ng-controller="Kubernetes.ReplicationControllerEditController">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Go back to viewing all the replication controllers" title="Go back to viewing all the replication controllers"
href="{{baseUri}}/kubernetes/replicationControllers"><i class="fa fa-list"></i></a> href="{{baseUri}}/kubernetes/replicationControllers"><i class="fa fa-list"></i></a>
<button class="btn btn-primary pull-right" <button class="btn btn-primary pull-right"
title="Saves changes to the controller" title="Saves changes to the controller"
ng-click="save()"> ng-click="save()">
Save Save
</button> </button>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="fetched"> <div ng-hide="fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="fetched"> <div ng-show="fetched">
<div hawtio-form-2="config" entity="entity"></div> <div hawtio-form-2="config" entity="entity"></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,144 +1,144 @@
<div ng-controller="Kubernetes.ReplicationControllers"> <div ng-controller="Kubernetes.ReplicationControllers">
<script type="text/ng-template" id="currentReplicasTemplate.html"> <script type="text/ng-template" id="currentReplicasTemplate.html">
<div class="ngCellText" title="Number of running pods for this controller"> <div class="ngCellText" title="Number of running pods for this controller">
<a ng-show="row.entity.podsLink" href="{{row.entity.podsLink}}"> <a ng-show="row.entity.podsLink" href="{{row.entity.podsLink}}">
<span class="badge {{row.entity.status.replicas > 0 ? 'badge-success' : 'badge-warning'}}">{{row.entity.status.replicas}}</span> <span class="badge {{row.entity.status.replicas > 0 ? 'badge-success' : 'badge-warning'}}">{{row.entity.status.replicas}}</span>
</a> </a>
<span ng-hide="row.entity.podsLink" class="badge">{{row.entity.status.replicas}}</span> <span ng-hide="row.entity.podsLink" class="badge">{{row.entity.status.replicas}}</span>
</div> </div>
</script> </script>
<script type="text/ng-template" id="desiredReplicas.html"> <script type="text/ng-template" id="desiredReplicas.html">
<div class="ngCellText"> <div class="ngCellText">
<a href="" class="badge badge-info" <a href="" class="badge badge-info"
ng-click="$parent.$parent.resizeDialog.open(row.entity)" ng-click="$parent.$parent.resizeDialog.open(row.entity)"
title="Edit the number of replicas of this controller">{{row.entity.spec.replicas || 0}}</a> title="Edit the number of replicas of this controller">{{row.entity.spec.replicas || 0}}</a>
</div> </div>
</script> </script>
<div class="row"> <div class="row">
<div hawtio-breadcrumbs></div> <div hawtio-breadcrumbs></div>
</div> </div>
<div class="row"> <div class="row">
<div hawtio-tabs></div> <div hawtio-tabs></div>
</div> </div>
<div class="row filter-header"> <div class="row filter-header">
<div class="col-md-12" > <div class="col-md-12" >
<span ng-show="!id"> <span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText" <hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge" css-class="input-xxlarge"
placeholder="通过数据标签筛选相应的oracle服务..." placeholder="通过数据标签筛选相应的oracle服务..."
save-as="kubernetes-replication-controllers-text-filter"></hawtio-filter> save-as="kubernetes-replication-controllers-text-filter"></hawtio-filter>
</span> </span>
<button ng-show="model.fetched" <button ng-show="model.fetched"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="deletePrompt(id || tableConfig.selectedItems)"> ng-click="deletePrompt(id || tableConfig.selectedItems)">
<i class="fa fa-remove"></i> 删除 <i class="fa fa-remove"></i> 删除
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="model.fetched" <button ng-show="model.fetched"
class="btn btn-danger pull-right" class="btn btn-danger pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="stopPrompt(id || tableConfig.selectedItems)"> ng-click="stopPrompt(id || tableConfig.selectedItems)">
<i class="fa fa-remove"></i> 停止 <i class="fa fa-remove"></i> 停止
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<button ng-show="model.fetched" <button ng-show="model.fetched"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
ng-click="reStartPrompt(id || tableConfig.selectedItems)"> ng-click="reStartPrompt(id || tableConfig.selectedItems)">
<i class="fa fa-plus"></i> 启动 <i class="fa fa-plus"></i> 启动
</button> </button>
<span class="pull-right">&nbsp;</span> <span class="pull-right">&nbsp;</span>
<!--<button ng-show="id" <!--<button ng-show="id"
class="btn btn-primary pull-right" class="btn btn-primary pull-right"
ng-click="id = undefined"><i class="fa fa-list"></i></button> ng-click="id = undefined"><i class="fa fa-list"></i></button>
<span ng-show="id" class="pull-right">&nbsp;</span> <span ng-show="id" class="pull-right">&nbsp;</span>
<a class="btn btn-default pull-right" <a class="btn btn-default pull-right"
title="Create a new replication controller" title="Create a new replication controller"
ng-click="createRCs()"><i class="fa fa-plus"></i> 创建汇总数据库</a> ng-click="createRCs()"><i class="fa fa-plus"></i> 创建汇总数据库</a>
<span class="pull-right">&nbsp;</span>--> <span class="pull-right">&nbsp;</span>-->
<button ng-show="model.fetched" <button ng-show="model.fetched"
ng-disabled="!id && tableConfig.selectedItems.length == 0" ng-disabled="!id && tableConfig.selectedItems.length == 0"
class="btn btn-success pull-right" class="btn btn-success pull-right"
ng-click="extractData.open(id || tableConfig.selectedItems)"> ng-click="extractData.open(id || tableConfig.selectedItems)">
<i class="fa fa-play-circle"></i> 汇总 <i class="fa fa-play-circle"></i> 汇总
</button> </button>
<!--<span ng-include="'runButton.html'"></span>--> <!--<span ng-include="'runButton.html'"></span>-->
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div ng-hide="model.fetched"> <div ng-hide="model.fetched">
<div class="align-center"> <div class="align-center">
<i class="fa fa-spinner fa-spin"></i> <i class="fa fa-spinner fa-spin"></i>
</div> </div>
</div> </div>
<div ng-show="model.fetched"> <div ng-show="model.fetched">
<div ng-hide="model.replicationControllers.length" class="align-center"> <div ng-hide="model.replicationControllers.length" class="align-center">
<p class="alert alert-info">当前没有正在运行的oracle服务.</p> <p class="alert alert-info">当前没有正在运行的oracle服务.</p>
</div> </div>
<div ng-show="model.replicationControllers.length"> <div ng-show="model.replicationControllers.length">
<table class="table table-bordered table-striped" <table class="table table-bordered table-striped"
hawtio-simple-table="tableConfig"></table> hawtio-simple-table="tableConfig"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<ng-include src="'resizeDialog.html'"/> <ng-include src="'resizeDialog.html'"/>
<div modal="extractData.dialog.show"> <div modal="extractData.dialog.show">
<form name="createNamespaceForm" class="" ng-submit="extractData.onOk()"> <form name="createNamespaceForm" class="" ng-submit="extractData.onOk()">
<div class="modal-header"><h4>数据汇总</h4></div> <div class="modal-header"><h4>数据汇总</h4></div>
<div class="modal-body"> <div class="modal-body">
<div class="form-group" ng-class="{'has-error': createNamespaceForm.$invalid}"> <div class="form-group" ng-class="{'has-error': createNamespaceForm.$invalid}">
<label class="col-sm-3 control-label" for="selectedItem"> <label class="col-sm-3 control-label" for="selectedItem">
数据库名称 数据库名称
<a tabindex="0" role="button" data-toggle="popover" data-trigger="focus" data-html="true" title="" <a tabindex="0" role="button" data-toggle="popover" data-trigger="focus" data-html="true" title=""
data-content="name of the new project" data-placement="top" data-original-title=""> data-content="name of the new project" data-placement="top" data-original-title="">
<span class="fa fa-info-circle"></span> <span class="fa fa-info-circle"></span>
</a> </a>
</label> </label>
<div class="col-sm-9"> <div class="col-sm-9">
<select ng-model="extractData.selectedItem" class="form-control" <select ng-model="extractData.selectedItem" class="form-control"
title="name of the new namespace" title="name of the new namespace"
id ="selectedItem" id ="selectedItem"
ng-options="x.$oracleName for x in filterReplicationControllers"> ng-options="x.$oracleName for x in filterReplicationControllers">
</select> </select>
<span class="help-block" ng-show="filterReplicationControllers.length == 0"> <span class="help-block" ng-show="filterReplicationControllers.length == 0">
当前没有汇总数据库可以选择,请先创建,可以点击创建汇总数据库按钮进行创建或从汇总页面中的服务器数据列表中启动已创建的汇总数据库! 当前没有汇总数据库可以选择,请先创建,可以点击创建汇总数据库按钮进行创建或从汇总页面中的服务器数据列表中启动已创建的汇总数据库!
</span> </span>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<span class="help-block" ng-show="extractData.selectedItem"> <span class="help-block" ng-show="extractData.selectedItem">
<br> <br>
您所选择的数据库数据将会被抽取到汇总数据库: 您所选择的数据库数据将会被抽取到汇总数据库:
<font color="Red"><strong>{{extractData.selectedItem.$oracleName}}</strong></font> 中,是否继续请确认! <font color="Red"><strong>{{extractData.selectedItem.$oracleName}}</strong></font> 中,是否继续请确认!
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<input class="btn btn-primary" type="submit" <input class="btn btn-primary" type="submit"
ng-disabled="filterReplicationControllers.length == 0" ng-disabled="filterReplicationControllers.length == 0"
value="确定"> value="确定">
<button class="btn btn-warning cancel" type="button" ng-click="extractData.close()">取消</button> <button class="btn btn-warning cancel" type="button" ng-click="extractData.close()">取消</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More