数据管理页面的样式修改

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="kubernetesPlugin.d.ts" />
declare module Kubernetes {
var BuildConfigsController: ng.IModule;
}
/// <reference path="../../includes.d.ts" />
/// <reference path="kubernetesPlugin.d.ts" />
declare module Kubernetes {
var BuildConfigsController: ng.IModule;
}

View File

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

View File

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

View File

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

View File

@ -1,30 +1,30 @@
/// <reference path="../../includes.d.ts" />
declare module Service {
var pluginName: string;
var log: Logging.Logger;
/**
* 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
*/
var pollServices: boolean;
/**
* Returns true if there is a service available for the given ID or false
*/
function hasService(ServiceRegistry: any, serviceName: string): boolean;
/**
* Returns the service for the given service name (ID) or null if it cannot be found
*
* @param ServiceRegistry
* @param serviceName
* @return {null}
*/
function findService(ServiceRegistry: any, serviceName: string): any;
/**
* Returns the service link for the given service name
*
* @param ServiceRegistry
* @param serviceName
* @return {null}
*/
function serviceLink(ServiceRegistry: any, serviceName: string): string;
}
/// <reference path="../../includes.d.ts" />
declare module Service {
var pluginName: string;
var log: Logging.Logger;
/**
* 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
*/
var pollServices: boolean;
/**
* Returns true if there is a service available for the given ID or false
*/
function hasService(ServiceRegistry: any, serviceName: string): boolean;
/**
* Returns the service for the given service name (ID) or null if it cannot be found
*
* @param ServiceRegistry
* @param serviceName
* @return {null}
*/
function findService(ServiceRegistry: any, serviceName: string): any;
/**
* Returns the service link for the given service name
*
* @param ServiceRegistry
* @param serviceName
* @return {null}
*/
function serviceLink(ServiceRegistry: any, serviceName: string): string;
}

View File

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

View File

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

View File

@ -686,6 +686,73 @@ a:hover.data_file_btn {
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 */
.service-view-rectangle {
position: relative;
@ -1032,70 +1099,3 @@ kubernetes-container-terminal .terminal-actions {
overflow-y: auto;
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"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612"
sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36"
sodipodi:version="0.32"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg"
>
<defs
id="defs1614"
>
<linearGradient
id="linearGradient29808"
y2="654.74"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="191.45"
gradientTransform="translate(225.21 -257.03)"
y1="654.74"
x1="177.95"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29806"
y2="611.48"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="306.18"
gradientTransform="translate(-9.0156 192.16)"
y1="596.63"
x1="309.71"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient24757"
>
<stop
id="stop24759"
style="stop-color:#d5d5d5"
offset="0"
/>
<stop
id="stop24761"
style="stop-color:#848484;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29804"
y2="560.57"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="379.72"
y1="560.57"
x1="253.14"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29802"
y2="949.11"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="659.71"
gradientTransform="translate(-220.88 106.92)"
y1="400.17"
x1="491.76"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29800"
y2="482.62"
gradientUnits="userSpaceOnUse"
x2="265.58"
gradientTransform="translate(-208.22 109.74)"
y1="306.18"
x1="705.01"
inkscape:collect="always"
>
<stop
id="stop22985"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22987"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient22094"
>
<stop
id="stop22096"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22098"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29798"
y2="211.3"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="576.57"
gradientTransform="translate(-208.22 109.74)"
y1="133.76"
x1="575.89"
inkscape:collect="always"
/>
</defs
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="176"
pagecolor="#ffffff"
inkscape:window-height="581"
inkscape:zoom="0.7"
inkscape:window-x="176"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="454.3678"
inkscape:cy="517.33549"
inkscape:window-width="756"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
/>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)"
>
<g
id="g29774"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)"
>
<path
id="path29776"
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"
/>
<g
id="g29778"
>
<path
id="path29780"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29782"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29784"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29786"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29788"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29790"
sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/>
<path
id="path29792"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29794"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29796"
sodipodi:nodetypes="ccccc"
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"
/>
</g
>
</g
>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
<dc:title
>Server Cabinet CPU</dc:title
>
<dc:date
>2007-09-03T13:59:19</dc:date
>
<dc:description
>Represents a server in Network Diagrams</dc:description
>
<dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
>
<dc:creator
>
<cc:Agent
>
<dc:title
>sagar_ns</dc:title
>
</cc:Agent
>
</dc:creator
>
<dc:subject
>
<rdf:Bag
>
<rdf:li
>mainframe</rdf:li
>
<rdf:li
>server</rdf:li
>
</rdf:Bag
>
</dc:subject
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</svg
>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612"
sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36"
sodipodi:version="0.32"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg"
>
<defs
id="defs1614"
>
<linearGradient
id="linearGradient29808"
y2="654.74"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="191.45"
gradientTransform="translate(225.21 -257.03)"
y1="654.74"
x1="177.95"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29806"
y2="611.48"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="306.18"
gradientTransform="translate(-9.0156 192.16)"
y1="596.63"
x1="309.71"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient24757"
>
<stop
id="stop24759"
style="stop-color:#d5d5d5"
offset="0"
/>
<stop
id="stop24761"
style="stop-color:#848484;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29804"
y2="560.57"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="379.72"
y1="560.57"
x1="253.14"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29802"
y2="949.11"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="659.71"
gradientTransform="translate(-220.88 106.92)"
y1="400.17"
x1="491.76"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29800"
y2="482.62"
gradientUnits="userSpaceOnUse"
x2="265.58"
gradientTransform="translate(-208.22 109.74)"
y1="306.18"
x1="705.01"
inkscape:collect="always"
>
<stop
id="stop22985"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22987"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient22094"
>
<stop
id="stop22096"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22098"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29798"
y2="211.3"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="576.57"
gradientTransform="translate(-208.22 109.74)"
y1="133.76"
x1="575.89"
inkscape:collect="always"
/>
</defs
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="176"
pagecolor="#ffffff"
inkscape:window-height="581"
inkscape:zoom="0.7"
inkscape:window-x="176"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="454.3678"
inkscape:cy="517.33549"
inkscape:window-width="756"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
/>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)"
>
<g
id="g29774"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)"
>
<path
id="path29776"
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"
/>
<g
id="g29778"
>
<path
id="path29780"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29782"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29784"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29786"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29788"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29790"
sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/>
<path
id="path29792"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29794"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29796"
sodipodi:nodetypes="ccccc"
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"
/>
</g
>
</g
>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
<dc:title
>Server Cabinet CPU</dc:title
>
<dc:date
>2007-09-03T13:59:19</dc:date
>
<dc:description
>Represents a server in Network Diagrams</dc:description
>
<dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
>
<dc:creator
>
<cc:Agent
>
<dc:title
>sagar_ns</dc:title
>
</cc:Agent
>
</dc:creator
>
<dc:subject
>
<rdf:Bag
>
<rdf:li
>mainframe</rdf:li
>
<rdf:li
>server</rdf:li
>
</rdf:Bag
>
</dc:subject
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</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"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="138"
height="138"
id="svg2"
xml:space="preserve"
inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1054"
id="namedview147"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="3.0970926"
inkscape:cx="203.09647"
inkscape:cy="61.870747"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work
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
id="defs6" /><g
id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path252"
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="138"
height="138"
id="svg2"
xml:space="preserve"
inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1054"
id="namedview147"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="3.0970926"
inkscape:cx="203.09647"
inkscape:cy="61.870747"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work
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
id="defs6" /><g
id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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>

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

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

View File

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

View File

@ -1,316 +1,316 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612"
sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36"
sodipodi:version="0.32"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg"
>
<defs
id="defs1614"
>
<linearGradient
id="linearGradient29808"
y2="654.74"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="191.45"
gradientTransform="translate(225.21 -257.03)"
y1="654.74"
x1="177.95"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29806"
y2="611.48"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="306.18"
gradientTransform="translate(-9.0156 192.16)"
y1="596.63"
x1="309.71"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient24757"
>
<stop
id="stop24759"
style="stop-color:#d5d5d5"
offset="0"
/>
<stop
id="stop24761"
style="stop-color:#848484;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29804"
y2="560.57"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="379.72"
y1="560.57"
x1="253.14"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29802"
y2="949.11"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="659.71"
gradientTransform="translate(-220.88 106.92)"
y1="400.17"
x1="491.76"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29800"
y2="482.62"
gradientUnits="userSpaceOnUse"
x2="265.58"
gradientTransform="translate(-208.22 109.74)"
y1="306.18"
x1="705.01"
inkscape:collect="always"
>
<stop
id="stop22985"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22987"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient22094"
>
<stop
id="stop22096"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22098"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29798"
y2="211.3"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="576.57"
gradientTransform="translate(-208.22 109.74)"
y1="133.76"
x1="575.89"
inkscape:collect="always"
/>
</defs
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="176"
pagecolor="#ffffff"
inkscape:window-height="581"
inkscape:zoom="0.7"
inkscape:window-x="176"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="454.3678"
inkscape:cy="517.33549"
inkscape:window-width="756"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
/>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)"
>
<g
id="g29774"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)"
>
<path
id="path29776"
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"
/>
<g
id="g29778"
>
<path
id="path29780"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29782"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29784"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29786"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29788"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29790"
sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/>
<path
id="path29792"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29794"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29796"
sodipodi:nodetypes="ccccc"
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"
/>
</g
>
</g
>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
<dc:title
>Server Cabinet CPU</dc:title
>
<dc:date
>2007-09-03T13:59:19</dc:date
>
<dc:description
>Represents a server in Network Diagrams</dc:description
>
<dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
>
<dc:creator
>
<cc:Agent
>
<dc:title
>sagar_ns</dc:title
>
</cc:Agent
>
</dc:creator
>
<dc:subject
>
<rdf:Bag
>
<rdf:li
>mainframe</rdf:li
>
<rdf:li
>server</rdf:li
>
</rdf:Bag
>
</dc:subject
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</svg
>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:cc="http://web.resource.org/cc/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:ns1="http://sozi.baierouge.fr"
id="svg1612"
sodipodi:docname="sagar_ns_server.svg"
viewBox="0 0 359.37 469.36"
sodipodi:version="0.32"
version="1.0"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.45.1"
sodipodi:docbase="/Users/johnolsen/Pictures/svg"
>
<defs
id="defs1614"
>
<linearGradient
id="linearGradient29808"
y2="654.74"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="191.45"
gradientTransform="translate(225.21 -257.03)"
y1="654.74"
x1="177.95"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29806"
y2="611.48"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="306.18"
gradientTransform="translate(-9.0156 192.16)"
y1="596.63"
x1="309.71"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient24757"
>
<stop
id="stop24759"
style="stop-color:#d5d5d5"
offset="0"
/>
<stop
id="stop24761"
style="stop-color:#848484;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29804"
y2="560.57"
xlink:href="#linearGradient24757"
gradientUnits="userSpaceOnUse"
x2="379.72"
y1="560.57"
x1="253.14"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29802"
y2="949.11"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="659.71"
gradientTransform="translate(-220.88 106.92)"
y1="400.17"
x1="491.76"
inkscape:collect="always"
/>
<linearGradient
id="linearGradient29800"
y2="482.62"
gradientUnits="userSpaceOnUse"
x2="265.58"
gradientTransform="translate(-208.22 109.74)"
y1="306.18"
x1="705.01"
inkscape:collect="always"
>
<stop
id="stop22985"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22987"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient22094"
>
<stop
id="stop22096"
style="stop-color:#000000"
offset="0"
/>
<stop
id="stop22098"
style="stop-color:#000000;stop-opacity:0"
offset="1"
/>
</linearGradient
>
<linearGradient
id="linearGradient29798"
y2="211.3"
xlink:href="#linearGradient22094"
gradientUnits="userSpaceOnUse"
x2="576.57"
gradientTransform="translate(-208.22 109.74)"
y1="133.76"
x1="575.89"
inkscape:collect="always"
/>
</defs
>
<sodipodi:namedview
id="base"
bordercolor="#666666"
inkscape:pageshadow="2"
inkscape:window-y="176"
pagecolor="#ffffff"
inkscape:window-height="581"
inkscape:zoom="0.7"
inkscape:window-x="176"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="454.3678"
inkscape:cy="517.33549"
inkscape:window-width="756"
inkscape:pageopacity="0.0"
inkscape:document-units="px"
/>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(-226.03 -301.23)"
>
<g
id="g29774"
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="c:\documents and settings\602654809\My Documents\My Icons\text9507.png"
transform="matrix(.95252 0 0 .80631 78.742 104.9)"
>
<path
id="path29776"
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"
/>
<g
id="g29778"
>
<path
id="path29780"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29782"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29784"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29786"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29788"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29790"
sodipodi:nodetypes="ccccc"
style="fill-rule:evenodd;fill:url(#linearGradient29808)"
d="m403.76 306.01l12.9-5.48v502.75l-13.49 21.57 0.59-518.84z"
/>
<path
id="path29792"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29794"
sodipodi:nodetypes="ccccc"
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"
/>
<path
id="path29796"
sodipodi:nodetypes="ccccc"
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"
/>
</g
>
</g
>
</g
>
<metadata
>
<rdf:RDF
>
<cc:Work
>
<dc:format
>image/svg+xml</dc:format
>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
/>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
/>
<dc:publisher
>
<cc:Agent
rdf:about="http://openclipart.org/"
>
<dc:title
>Openclipart</dc:title
>
</cc:Agent
>
</dc:publisher
>
<dc:title
>Server Cabinet CPU</dc:title
>
<dc:date
>2007-09-03T13:59:19</dc:date
>
<dc:description
>Represents a server in Network Diagrams</dc:description
>
<dc:source
>https://openclipart.org/detail/5159/server-cabinet-cpu-by-sagar_ns</dc:source
>
<dc:creator
>
<cc:Agent
>
<dc:title
>sagar_ns</dc:title
>
</cc:Agent
>
</dc:creator
>
<dc:subject
>
<rdf:Bag
>
<rdf:li
>mainframe</rdf:li
>
<rdf:li
>server</rdf:li
>
</rdf:Bag
>
</dc:subject
>
</cc:Work
>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"
>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution"
/>
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
/>
</cc:License
>
</rdf:RDF
>
</metadata
>
</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"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="138"
height="138"
id="svg2"
xml:space="preserve"
inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1054"
id="namedview147"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="3.0970926"
inkscape:cx="203.09647"
inkscape:cy="61.870747"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work
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
id="defs6" /><g
id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path252"
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="138"
height="138"
id="svg2"
xml:space="preserve"
inkscape:version="0.48.5 r10040"
sodipodi:docname="kubernetes.svg"><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1918"
inkscape:window-height="1054"
id="namedview147"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="3.0970926"
inkscape:cx="203.09647"
inkscape:cy="61.870747"
inkscape:window-x="0"
inkscape:window-y="31"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><metadata
id="metadata8"><rdf:RDF><cc:Work
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
id="defs6" /><g
id="g12"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#336ee5;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g18"
transform="matrix(0,-0.23233006,0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g22"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g28"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g34"
transform="matrix(-0.21472442,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g40"
transform="matrix(-0.20558695,-2.5683182e-5,2.4999933e-5,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g46"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g52"
transform="matrix(0,0.22059285,-0.22843688,0,307.56315,1453.1993)"><path
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"
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
id="g56"
transform="matrix(-0.22843688,0,0,-0.23468008,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g62"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g68"
transform="matrix(-0.13387464,-0.17246257,0.17859952,-0.14631709,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g74"
transform="matrix(-0.12816215,-0.16514286,0.17861202,-0.1462914,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g80"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g86"
transform="matrix(-0.16787455,0.13753344,-0.14242462,-0.18348065,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g92"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g98"
transform="matrix(-0.04778737,0.21505812,-0.2226994,-0.05222675,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g104"
transform="matrix(-0.04577488,0.20590207,-0.2226994,-0.05225243,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g110"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g116"
transform="matrix(-0.20933694,-0.0490934,0.05083736,-0.22878579,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g122"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g128"
transform="matrix(-0.19346198,0.09570838,-0.09911223,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g134"
transform="matrix(-0.185237,0.09161191,-0.09907473,-0.21144964,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g140"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g146"
transform="matrix(-0.09316225,-0.1987493,0.20581194,-0.10182098,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g152"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g158"
transform="matrix(-0.19346198,-0.09572122,0.09912473,-0.2114368,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g164"
transform="matrix(-0.185212,-0.09166328,0.09914973,-0.21142395,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g170"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g176"
transform="matrix(-0.09317475,0.1987493,-0.20581194,-0.10183382,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g182"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g188"
transform="matrix(-0.04777487,-0.21505812,0.2226994,-0.05221391,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g194"
transform="matrix(-0.04571238,-0.20591491,0.2227119,-0.05217538,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g200"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g206"
transform="matrix(-0.20934944,0.04908056,-0.05082486,-0.22879863,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g212"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g218"
transform="matrix(-0.13388714,0.17246257,-0.17858702,-0.14632993,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g224"
transform="matrix(-0.12821215,0.16510434,-0.17857452,-0.14635561,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g230"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
id="g236"
transform="matrix(-0.16787455,-0.13754628,0.14243712,-0.18346781,307.56315,1453.1993)"><path
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"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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
inkscape:connector-curvature="0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
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>

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

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

Binary file not shown.

View File

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

View File

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

View File

@ -1,51 +1,51 @@
<div ng-controller="Kubernetes.BuildConfigController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row filter-header">
<div class="col-md-12" ng-show="model.tools.length">
<span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge"
placeholder="Filter tools..."></hawtio-filter>
</span>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="model.fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p>
</div>
<div ng-show="entity.tools.length">
<div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p>
</div>
<div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index">
<div class="row"
title="{{env.description}}">
<div class="col-md-9">
<a href="{{env.url}}">
<h3>
<i class="{{env.iconClass}}"></i>
{{env.label}}
</h3>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div ng-controller="Kubernetes.BuildConfigController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row filter-header">
<div class="col-md-12" ng-show="model.tools.length">
<span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge"
placeholder="Filter tools..."></hawtio-filter>
</span>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="model.fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p>
</div>
<div ng-show="entity.tools.length">
<div ng-hide="entity.tools.length" class="align-center">
<p class="alert alert-info">There are no tools currently available.</p>
</div>
<div ng-repeat="env in entity.tools | filter:filterTemplates | orderBy:'label' track by $index">
<div class="row"
title="{{env.description}}">
<div class="col-md-9">
<a href="{{env.url}}">
<h3>
<i class="{{env.iconClass}}"></i>
{{env.label}}
</h3>
</a>
</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="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title inline-block">
<a href="{{env.url}}" title="namespace: {{env.namespace}}">
<!-- <i class="{{env.iconClass}}"></i>&nbsp; -->
{{env.label}}
</a>
</h2>
</div>
<div class="panel-body">
<div class="environment-deploy-block"
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="(rcname, rc) in versionInfo.replicationControllers">
<div class="environment-deploy-version-and-pods">
<a href="{{rc.$viewLink}}" ng-show="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i>
{{rc.$name}}
: {{version}}
</a>
<span ng-hide="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i>
{{rc.$name}}
: {{version}}
</span>
<span class="pull-right" ng-show="rc.$serviceLink.href">
&nbsp;
&nbsp;
&nbsp;
<a target="test-service" href="{{rc.$serviceLink.href}}" title="Open this service in a new tab">
<i class="fa fa-external-link"></i>
</a>
</span>
&nbsp;
&nbsp;
&nbsp;
<span class="pull-right">
<a ng-show="rc.$podCounters.podsLink" href="{{rc.$podCounters.podsLink}}" title="View pods">
<span ng-show="rc.$podCounters.ready"
class="badge badge-success">{{rc.$podCounters.ready}}</span>
<span ng-show="rc.$podCounters.valid"
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.error"
class="badge badge-warning">{{rc.$podCounters.error}}</span>
</a>
</span>
</div>
<div class="environment-deploy-build-info">
<a href="{{rc.$buildUrl}}" target="builds" ng-show="rc.$buildUrl && rc.$buildId" class="="
title="View the build which created this Replication Controller">
<i class="fa fa-tasks"></i>
Build #{{rc.$buildId}}
</a>
&nbsp;
&nbsp;
&nbsp;
<a href="{{rc.$gitUrl}}" target="git" ng-show="rc.$gitUrl" class="pull-right"
title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}}
</a>
<span ng-hide="rc.$gitUrl || !rc.$gitCommit" class="pull-right"
title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}}
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="inline-block environment-row" ng-controller="Developer.EnvironmentPanelController">
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title inline-block">
<a href="{{env.url}}" title="namespace: {{env.namespace}}">
<!-- <i class="{{env.iconClass}}"></i>&nbsp; -->
{{env.label}}
</a>
</h2>
</div>
<div class="panel-body">
<div class="environment-deploy-block"
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="(rcname, rc) in versionInfo.replicationControllers">
<div class="environment-deploy-version-and-pods">
<a href="{{rc.$viewLink}}" ng-show="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i>
{{rc.$name}}
: {{version}}
</a>
<span ng-hide="rc.$viewLink"
title="View the Replication Controller from project {{project}} of version {{version}}">
<i class="fa fa-cubes"></i>
{{rc.$name}}
: {{version}}
</span>
<span class="pull-right" ng-show="rc.$serviceLink.href">
&nbsp;
&nbsp;
&nbsp;
<a target="test-service" href="{{rc.$serviceLink.href}}" title="Open this service in a new tab">
<i class="fa fa-external-link"></i>
</a>
</span>
&nbsp;
&nbsp;
&nbsp;
<span class="pull-right">
<a ng-show="rc.$podCounters.podsLink" href="{{rc.$podCounters.podsLink}}" title="View pods">
<span ng-show="rc.$podCounters.ready"
class="badge badge-success">{{rc.$podCounters.ready}}</span>
<span ng-show="rc.$podCounters.valid"
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.error"
class="badge badge-warning">{{rc.$podCounters.error}}</span>
</a>
</span>
</div>
<div class="environment-deploy-build-info">
<a href="{{rc.$buildUrl}}" target="builds" ng-show="rc.$buildUrl && rc.$buildId" class="="
title="View the build which created this Replication Controller">
<i class="fa fa-tasks"></i>
Build #{{rc.$buildId}}
</a>
&nbsp;
&nbsp;
&nbsp;
<a href="{{rc.$gitUrl}}" target="git" ng-show="rc.$gitUrl" class="pull-right"
title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}}
</a>
<span ng-hide="rc.$gitUrl || !rc.$gitCommit" class="pull-right"
title="{{rc.$gitCommit}}
{{rc.$gitCommitAuthor}}
{{rc.$gitCommitDate}}
{{rc.$gitCommitMessage}}">
<i class="fa fa-code-fork"></i>
Commit {{rc.$gitCommit | limitTo:7}}
</span>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,100 +1,100 @@
<div class="project-dashboard" ng-controller="Developer.ProjectController" hawtio-card-bg>
<div hawtio-breadcrumbs></div>
<div hawtio-tabs></div>
<!--
<div class="row filter-header">
<div class="col-md-12" ng-show="model.environments.length">
<span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge"
placeholder="Filter environments..."></hawtio-filter>
</span>
</div>
</div>
-->
<div ng-hide="model.fetched">
<div class="row">
<div class="col-md-12">
<div class="align-center">
<div class="spinner spinner-lg"></div>
</div>
</div>
</div>
</div>
<div ng-show="model.fetched" style="float: none; position: static;">
<!--
<div class="row page-header-row">
<div class="col-md-12">
<h1 class="inline-block">{{id}}</h1>
</div>
</div>
-->
<!--
<div class="pull-right">
<a href="{{entity.$build.url}}" class="btn btn-default" target="browse">
<i class="{{entity.$build.iconClass}}"></i>
{{entity.$build.label}}
</a>
</div>
-->
<div class="row row-cards-pf" title="{{env.description}}">
<div class="col-md-12 environment-rows">
<div class="card-pf">
<div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Environments Overview</h2>
</div>
<div class="card-pf-body">
<div ng-hide="entity.environments.length">
<div class="row">
<div class="col-md-12 align-center">
<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>
<a class="btn btn-primary" ng-href="{{settingsLink}}"><i class="fa fa-plus"></i> New Build</a>
</div>
</div>
</div>
<div ng-show="entity.environments.length">
<div ng-repeat="env in entity.environments | filter:filterTemplates track by $index"
class="inline-block environment-block" ng-include="'plugins/developer/html/environmentPanel.html'">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row row-cards-pf">
<div class="col-md-12">
<div class="card-pf pipeline">
<div class="card-pf-heading no-border">
<h2 class="card-pf-title inline-block">Active Pipelines</h4>
<a ng-href="{{$projectLink}}/jenkinsJob/{{jobId}}/pipelines">View All Pipelines >></a>
</div>
<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>
</div>
</div>
</div>
<div class="row row-cards-pf">
<div class="col-md-12">
<div class="card-pf">
<div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Commits</h2>
<a ng-href="{{$projectLink}}/wiki/history//">View All Commits >></a>
</div>
<div class="card-pf-body">
<div ng-include="'plugins/wiki/html/projectCommitsPanel.html'"></div>
</div>
</div>
</div>
</div>
</div>
<div class="project-dashboard" ng-controller="Developer.ProjectController" hawtio-card-bg>
<div hawtio-breadcrumbs></div>
<div hawtio-tabs></div>
<!--
<div class="row filter-header">
<div class="col-md-12" ng-show="model.environments.length">
<span ng-show="!id">
<hawtio-filter ng-model="tableConfig.filterOptions.filterText"
css-class="input-xxlarge"
placeholder="Filter environments..."></hawtio-filter>
</span>
</div>
</div>
-->
<div ng-hide="model.fetched">
<div class="row">
<div class="col-md-12">
<div class="align-center">
<div class="spinner spinner-lg"></div>
</div>
</div>
</div>
</div>
<div ng-show="model.fetched" style="float: none; position: static;">
<!--
<div class="row page-header-row">
<div class="col-md-12">
<h1 class="inline-block">{{id}}</h1>
</div>
</div>
-->
<!--
<div class="pull-right">
<a href="{{entity.$build.url}}" class="btn btn-default" target="browse">
<i class="{{entity.$build.iconClass}}"></i>
{{entity.$build.label}}
</a>
</div>
-->
<div class="row row-cards-pf" title="{{env.description}}">
<div class="col-md-12 environment-rows">
<div class="card-pf">
<div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Environments Overview</h2>
</div>
<div class="card-pf-body">
<div ng-hide="entity.environments.length">
<div class="row">
<div class="col-md-12 align-center">
<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>
<a class="btn btn-primary" ng-href="{{settingsLink}}"><i class="fa fa-plus"></i> New Build</a>
</div>
</div>
</div>
<div ng-show="entity.environments.length">
<div ng-repeat="env in entity.environments | filter:filterTemplates track by $index"
class="inline-block environment-block" ng-include="'plugins/developer/html/environmentPanel.html'">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row row-cards-pf">
<div class="col-md-12">
<div class="card-pf pipeline">
<div class="card-pf-heading no-border">
<h2 class="card-pf-title inline-block">Active Pipelines</h4>
<a ng-href="{{$projectLink}}/jenkinsJob/{{jobId}}/pipelines">View All Pipelines >></a>
</div>
<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>
</div>
</div>
</div>
<div class="row row-cards-pf">
<div class="col-md-12">
<div class="card-pf">
<div class="card-pf-heading">
<h2 class="card-pf-title inline-block">Commits</h2>
<a ng-href="{{$projectLink}}/wiki/history//">View All Commits >></a>
</div>
<div class="card-pf-body">
<div ng-include="'plugins/wiki/html/projectCommitsPanel.html'"></div>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,27 +1,27 @@
<div class="row" ng-controller="Developer.JenkinsMetricsController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="model.fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="metrics.builds.length" class="align-center">
<p class="alert alert-info">There are no completed builds in this job.</p>
</div>
<div ng-show="metrics.builds.length">
<nvd3 options="options" data="data" api="api"></nvd3>
</div>
</div>
</div>
</div>
</div>
<div class="row" ng-controller="Developer.JenkinsMetricsController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="model.fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="metrics.builds.length" class="align-center">
<p class="alert alert-info">There are no completed builds in this job.</p>
</div>
<div ng-show="metrics.builds.length">
<nvd3 options="options" data="data" api="api"></nvd3>
</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-inner" style="height: 25px;">
<p ng-repeat="log in log.logs track by $index" ng-bind-html="log | asTrustedHtml"></p>
</div>
</div>
<div class="log-panel" ng-controller="Developer.JenkinsLogController" scroll-glue>
<div class="log-panel-inner" style="height: 25px;">
<p ng-repeat="log in log.logs track by $index" ng-bind-html="log | asTrustedHtml"></p>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -1,22 +1,22 @@
/// <reference path="developerPlugin.ts"/>
module Developer {
_module.controller('Developer.EnvironmentPanelController', ($scope, $element, $location, $routeParams, KubernetesModel:Kubernetes.KubernetesModelService, $http, $timeout, KubernetesState, KubernetesApiURL) => {
$scope.envVersions = {};
$scope.model = KubernetesModel;
$scope.env = $scope.$eval('env');
$scope.buildConfig = $scope.$eval('entity');
$scope.open = true;
$scope.toggle = () => $scope.open = !$scope.open;
var caches = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
loadProjectVersions($scope, $element, $scope.buildConfig, $scope.env, $scope.env.namespace, $scope.envVersions, caches);
});
}
/// <reference path="developerPlugin.ts"/>
module Developer {
_module.controller('Developer.EnvironmentPanelController', ($scope, $element, $location, $routeParams, KubernetesModel:Kubernetes.KubernetesModelService, $http, $timeout, KubernetesState, KubernetesApiURL) => {
$scope.envVersions = {};
$scope.model = KubernetesModel;
$scope.env = $scope.$eval('env');
$scope.buildConfig = $scope.$eval('entity');
$scope.open = true;
$scope.toggle = () => $scope.open = !$scope.open;
var caches = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
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="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
module Developer {
export var HomeController = controller("HomeController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => {
$scope.namespace = Kubernetes.currentKubernetesNamespace();
}]);
}
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
module Developer {
export var HomeController = controller("HomeController",
["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
($scope, KubernetesModel:Kubernetes.KubernetesModelService, KubernetesState, KubernetesSchema,
$templateCache:ng.ITemplateCacheService, $location:ng.ILocationService, $routeParams, $http, $timeout, KubernetesApiURL) => {
$scope.namespace = Kubernetes.currentKubernetesNamespace();
}]);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,9 +1,9 @@
/// <reference path="../libs/hawtio-forms/defs.d.ts"/>
/// <reference path="../libs/hawtio-kubernetes-api/defs.d.ts"/>
/// <reference path="../libs/hawtio-oauth/defs.d.ts"/>
/// <reference path="../libs/hawtio-ui/defs.d.ts"/>
/// <reference path="../libs/hawtio-utilities/defs.d.ts"/>
declare var humandate;
declare var jsyaml:any;
/// <reference path="../libs/hawtio-forms/defs.d.ts"/>
/// <reference path="../libs/hawtio-kubernetes-api/defs.d.ts"/>
/// <reference path="../libs/hawtio-oauth/defs.d.ts"/>
/// <reference path="../libs/hawtio-ui/defs.d.ts"/>
/// <reference path="../libs/hawtio-utilities/defs.d.ts"/>
declare var humandate;
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'}}">
{{row.entity.$creationDate ? (row.entity.$creationDate | relativeTime) : ''}}
</div>
<div class="ngCellText" title="deployed at: {{row.entity.$creationDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}">
{{row.entity.$creationDate ? (row.entity.$creationDate | relativeTime) : ''}}
</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-header row">
<div class="col-md-4">
<span class="service-view-icon">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
<img ng-show="item.$iconUrl" ng-src="{{item.$iconUrl}}">
</a>
</span>
<span class="service-view-name" title="{{view.name}}">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
{{view.appName}}
</a>
</span>
</div>
<div class="col-md-6">
<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">
{{view.service.$host}}
</a>
<span ng-hide="view.service.$connectUrl">{{view.service.$host}}</span>
</span>
</div>
<div class="col-md-2 align-right">
<a class="service-view-header-delete" href="" ng-click="deleteSingleApp(item)" title="Delete this app"><i
class="fa fa-remove red"></i></a>
</div>
</div>
<div class="service-view-detail-rectangle">
<div class="service-view-detail-header row">
<div class="col-md-3">
<div class="service-view-detail-deployed" ng-show="view.createdDate"
title="deployed at: {{view.createdDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}">
deployed:
<span class="value">{{view.createdDate | relativeTime}}</span>
</div>
<div class="service-view-detail-deployed" ng-hide="view.createdDate">
not deployed
</div>
</div>
<div class="col-md-6">
<div class="service-view-detail-pod-template" ng-show="view.controllerId">
pod template:
<span class="value" title="Go to the replication controller detail page"><a
ng-href="{{view.replicationController | kubernetesPageLink}}">{{view.controllerId}}</a></span>
</div>
<div class="service-view-detail-pod-template" ng-hide="view.controllerId">
no pod template
</div>
</div>
<div class="col-md-3 service-view-detail-pod-counts align-right">
<span>
pods:
<a href="" ng-show="view.replicationController" class="badge badge-success"
ng-click="resizeDialog.open(view.replicationController)"
title="Resize the number of pods">
{{view.podCount}}
</a>
<span ng-hide="view.replicationController" class="badge badge-info">
{{view.podCount}}
</span>
</span>
</div>
</div>
<div class="service-view-detail-pod-box row">
<div class="col-md-12">
<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">
<table>
<tr>
<td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i>
</td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController">
<a class="clickable"
ng-click="doConnect(pod)"
title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i>
</a>
</td>
<td>
<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>
</div>
<div class="service-view-detail-pod-ip">
IP:
<span class="value">{{pod.status.podIP}}</span>
</div>
</td>
<td>
<div class="service-view-detail-pod-ports">
ports: <span class="value">{{pod.$containerPorts.join(", ")}}</span>
</div>
<div class="service-view-detail-pod-minion">
minion:
<span class="value">
<a ng-show="pod.$host" ng-href="{{baseUri}}/kubernetes/hosts/{{pod.$host}}">{{pod.$host}}</a>
</span>
</div>
</td>
<td class="service-view-detail-pod-expand" ng-click="collapsePod(pod)">
<i class="fa fa-chevron-left"></i>
</td>
</tr>
</table>
<!--
<div class="service-view-detail-pod-status">
status:
<span class="value">{{pod.status}}</span>
</div>
-->
</div>
<div ng-hide="podExpanded(pod)" class="service-view-detail-pod-summary">
<table>
<tr>
<td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i>
</td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController">
<a class="clickable"
ng-click="doConnect(pod)"
title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i>
</a>
</td>
<td>
<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>
</div>
<div class="service-view-detail-pod-ip">
IP:
<span class="value">{{pod.status.podIP}}</span>
</div>
</td>
<td class="service-view-detail-pod-expand" ng-click="expandPod(pod)">
<i class="fa fa-chevron-right"></i>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="service-view-rectangle" ng-repeat="view in item.$serviceViews" ng-hide="view.appName === 'kubernetes'">
<div class="service-view-header row">
<div class="col-md-4">
<span class="service-view-icon">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
<img ng-show="item.$iconUrl" ng-src="{{item.$iconUrl}}">
</a>
</span>
<span class="service-view-name" title="{{view.name}}">
<a ng-href="{{view.service | kubernetesPageLink}}" title="View the service detail page">
{{view.appName}}
</a>
</span>
</div>
<div class="col-md-6">
<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">
{{view.service.$host}}
</a>
<span ng-hide="view.service.$connectUrl">{{view.service.$host}}</span>
</span>
</div>
<div class="col-md-2 align-right">
<a class="service-view-header-delete" href="" ng-click="deleteSingleApp(item)" title="Delete this app"><i
class="fa fa-remove red"></i></a>
</div>
</div>
<div class="service-view-detail-rectangle">
<div class="service-view-detail-header row">
<div class="col-md-3">
<div class="service-view-detail-deployed" ng-show="view.createdDate"
title="deployed at: {{view.createdDate | date:'yyyy-MMM-dd HH:mm:ss Z'}}">
deployed:
<span class="value">{{view.createdDate | relativeTime}}</span>
</div>
<div class="service-view-detail-deployed" ng-hide="view.createdDate">
not deployed
</div>
</div>
<div class="col-md-6">
<div class="service-view-detail-pod-template" ng-show="view.controllerId">
pod template:
<span class="value" title="Go to the replication controller detail page"><a
ng-href="{{view.replicationController | kubernetesPageLink}}">{{view.controllerId}}</a></span>
</div>
<div class="service-view-detail-pod-template" ng-hide="view.controllerId">
no pod template
</div>
</div>
<div class="col-md-3 service-view-detail-pod-counts align-right">
<span>
pods:
<a href="" ng-show="view.replicationController" class="badge badge-success"
ng-click="resizeDialog.open(view.replicationController)"
title="Resize the number of pods">
{{view.podCount}}
</a>
<span ng-hide="view.replicationController" class="badge badge-info">
{{view.podCount}}
</span>
</span>
</div>
</div>
<div class="service-view-detail-pod-box row">
<div class="col-md-12">
<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">
<table>
<tr>
<td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i>
</td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController">
<a class="clickable"
ng-click="doConnect(pod)"
title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i>
</a>
</td>
<td>
<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>
</div>
<div class="service-view-detail-pod-ip">
IP:
<span class="value">{{pod.status.podIP}}</span>
</div>
</td>
<td>
<div class="service-view-detail-pod-ports">
ports: <span class="value">{{pod.$containerPorts.join(", ")}}</span>
</div>
<div class="service-view-detail-pod-minion">
minion:
<span class="value">
<a ng-show="pod.$host" ng-href="{{baseUri}}/kubernetes/hosts/{{pod.$host}}">{{pod.$host}}</a>
</span>
</div>
</td>
<td class="service-view-detail-pod-expand" ng-click="collapsePod(pod)">
<i class="fa fa-chevron-left"></i>
</td>
</tr>
</table>
<!--
<div class="service-view-detail-pod-status">
status:
<span class="value">{{pod.status}}</span>
</div>
-->
</div>
<div ng-hide="podExpanded(pod)" class="service-view-detail-pod-summary">
<table>
<tr>
<td class="service-view-detail-pod-status">
<i ng-class="pod.statusClass"></i>
</td>
<td class="service-view-detail-pod-connect" ng-show="pod.$jolokiaUrl"
ng-controller="Kubernetes.ConnectController">
<a class="clickable"
ng-click="doConnect(pod)"
title="Open a new window and connect to this container">
<i class="fa fa-sign-in"></i>
</a>
</td>
<td>
<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>
</div>
<div class="service-view-detail-pod-ip">
IP:
<span class="value">{{pod.status.podIP}}</span>
</div>
</td>
<td class="service-view-detail-pod-expand" ng-click="expandPod(pod)">
<i class="fa fa-chevron-right"></i>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,62 +1,62 @@
<div ng-init="mode='edit'">
<div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div ng-init="subTabConfig = tabs" ng-include="'plugins/kubernetes/html/tabs.html'"></div>
<div>
<div class="row">
<div class="col-md-12">
<button class="btn btn-primary pull-right"
title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name"
ng-click="save()">
Save Changes
</button>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="fetched">
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset>
<legend ng-show="config.label || config.description" ng-hide="config.hideLegend"
class="ng-binding"></legend>
<div class="row">
<div class="clearfix col-md-12">
<div class="form-group">
<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>
<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`
</p>
</div>
</div>
</div>
</fieldset>
</form>
<!--
<div hawtio-form-2="config" entity="entity"></div>
-->
<div hawtio-form-2="specConfig" entity="spec"></div>
</div>
</div>
</div>
</div>
</div>
<div ng-init="mode='edit'">
<div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div ng-init="subTabConfig = tabs" ng-include="'plugins/kubernetes/html/tabs.html'"></div>
<div>
<div class="row">
<div class="col-md-12">
<button class="btn btn-primary pull-right"
title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name"
ng-click="save()">
Save Changes
</button>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="fetched">
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset>
<legend ng-show="config.label || config.description" ng-hide="config.hideLegend"
class="ng-binding"></legend>
<div class="row">
<div class="clearfix col-md-12">
<div class="form-group">
<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>
<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`
</p>
</div>
</div>
</div>
</fieldset>
</form>
<!--
<div hawtio-form-2="config" entity="entity"></div>
-->
<div hawtio-form-2="specConfig" entity="spec"></div>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,58 +1,58 @@
<div ng-init="mode='create'">
<div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div class="col-md-12">
<button class="btn btn-primary pull-right"
title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name"
ng-click="save()">
Save Changes
</button>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="fetched">
<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.
</p>
<div hawtio-form-2="specConfig" entity="spec"></div>
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset>
<div class="row">
<div class="clearfix col-md-12">
<div class="form-group">
<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>
<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`
</p>
<p class="help-block">Name of this project</p>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
<div ng-init="mode='create'">
<div ng-controller="Kubernetes.BuildConfigEditController">
<div class="row">
<div hawtio-breadcrumbs></div>
</div>
<div class="row">
<div hawtio-tabs></div>
</div>
<div class="row">
<div class="col-md-12">
<button class="btn btn-primary pull-right"
title="Saves changes to this project configuration"
ng-disabled="!entity.metadata.name"
ng-click="save()">
Save Changes
</button>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div ng-hide="fetched">
<div class="align-center">
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<div ng-show="fetched">
<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.
</p>
<div hawtio-form-2="specConfig" entity="spec"></div>
<form name="nameForm" ng-disabled="config.mode == 0" class="form-horizontal">
<fieldset>
<div class="row">
<div class="clearfix col-md-12">
<div class="form-group">
<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>
<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`
</p>
<p class="help-block">Name of this project</p>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

@ -1,15 +1,15 @@
<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="centered scroll-indicator" ng-hide="atBottom" ng-click="atBottom = true">
<span class="fa fa-caret-down"></span>
</div>
<div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)">
<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-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>
</div>
<!--<div class="terminal-body" scroll-glue ng-model="atBottom" style="overflow-y:hidden"> -->
<textarea style="height:100%; width:100%" disabled="disabled">{{logs}}</textarea>
<!--</div>-->
</div>
<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="centered scroll-indicator" ng-hide="atBottom" ng-click="atBottom = true">
<span class="fa fa-caret-down"></span>
</div>
<div class="terminal-title" ng-mousedown="mouseDown($event)" ng-mouseup="mouseUp($event)" ng-mousemove="mouseMove($event)">
<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-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>
</div>
<!--<div class="terminal-body" scroll-glue ng-model="atBottom" style="overflow-y:hidden"> -->
<textarea style="height:100%; width:100%" disabled="disabled">{{logs}}</textarea>
<!--</div>-->
</div>

View File

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

View File

@ -1,20 +1,20 @@
<div class="pipeline-panel">
<div ng-hide="model.fetched">
<div class="align-center">
<div class="spinner spinner-lg"></div>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="model.job.builds.length" class="align-center">
<div>
<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>
</div>
</div>
<div ng-show="model.job.builds.length">
<div ng-repeat="build in model.job.builds | filter:model.filterText track by $index">
<div pipeline-view></div>
</div>
</div>
</div>
</div>
<div class="pipeline-panel">
<div ng-hide="model.fetched">
<div class="align-center">
<div class="spinner spinner-lg"></div>
</div>
</div>
<div ng-show="model.fetched">
<div ng-hide="model.job.builds.length" class="align-center">
<div>
<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>
</div>
</div>
<div ng-show="model.job.builds.length">
<div ng-repeat="build in model.job.builds | filter:model.filterText track by $index">
<div pipeline-view></div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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