增加获取集群文件列表界面

Web_Manager_Develope
wu ming 9 years ago
commit 562b55eb79

@ -1,139 +0,0 @@
function Recursion(node){
var count=0;
for (var key in node) {
count++;
var value = node[key];
delete node[key];
//如果node为叶子节点
if (key.toString() == '$') {
for (var attr in value)
node[attr] = value[attr];
} else {
if (value instanceof Array) {
if (value.length > 0) {
node["children"] = value;
for (var obj in value)
Recursion(value[obj]);
}
}
}
}
if(count==1)
node["children"]=[];
}
function randomString(len) {
len = len || 32;
var $chars = 'abcdefhijkmnprstwxyz'; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
var maxPos = $chars.length;
var pwd = '';
for (i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
function compArray(array1,array2){
if((array1&&typeof array1 ==="object"&&array1.constructor===Array)&&(array2&&typeof array2 ==="object"&&array2.constructor===Array)){
if(array1.length==array2.length){
for(var i=0;i<array1.length;i++){
var ggg=compObj(array1[i],array2[i]);
if(!ggg)
return false;
}
}else{
return false;
}
}else{
throw new Error("argunment is error ;");
}
return true;
};
function compObj(obj1,obj2){//比较两个对象是否相等,不包含原形上的属性计较
if((obj1&&typeof obj1==="object")&&((obj2&&typeof obj2==="object"))){
var count1=propertyLength(obj1);
var count2=propertyLength(obj2);
if(count1==count2){
for(var ob in obj1){
if(obj1.hasOwnProperty(ob)&&obj2.hasOwnProperty(ob)){
if(obj1[ob].constructor==Array&&obj2[ob].constructor==Array){//如果属性是数组
if(!compArray(obj1[ob],obj2[ob])){
return false;
};
}else if(typeof obj1[ob]==="string"&&typeof obj2[ob]==="string"){//纯属性
if(obj1[ob]!==obj2[ob]){
return false;
}
}else if(typeof obj1[ob]==="object"&&typeof obj2[ob]==="object"){//属性是对象
if(!compObj(obj1[ob],obj2[ob])){
return false;
};
}else{
return false;
}
}else{
return false;
}
}
}else{
return false;
}
}
return true;
};
function propertyLength(obj){//获得对象上的属性个数,不包含对象原形上的属性
var count=0;
if(obj&&typeof obj==="object") {
for(var ooo in obj) {
if(obj.hasOwnProperty(ooo)) {
count++;
}
}
return count;
}else {
throw new Error("argunment can not be null;");
}
};
function selectorMatches(selector,labels){
if(typeof(selector) === 'object'){
var answer = true;
var count = 0;
for(var key in selector){
count++;
if(answer && labels[key] !== selector[key])
answer = false;
}
return answer && count > 0;
}else{
return false;
}
}
Date.prototype.Format = function(fmt)
{ //author: meizz
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
exports.randomString = randomString;
exports.Recursion = Recursion;
exports.compObj = compObj;
exports.selectorMatches = selectorMatches;

File diff suppressed because one or more lines are too long

@ -1,213 +0,0 @@
var fs = require('fs'), path = require('path'), util = require('util'), Stream = require('stream').Stream;
module.exports = resumable = function(temporaryFolder){
var $ = this;
$.temporaryFolder = temporaryFolder;
$.maxFileSize = null;
$.fileParameterName = 'file';
try {
fs.mkdirSync($.temporaryFolder);
}catch(e){}
var cleanIdentifier = function(identifier){
return identifier.replace(/^0-9A-Za-z_-/img, '');
}
var getChunkFilename = function(chunkNumber, identifier){
// Clean up the identifier
identifier = cleanIdentifier(identifier);
// What would the file name be?
return path.join($.temporaryFolder, './resumable-'+identifier+'.'+chunkNumber);
}
var validateRequest = function(chunkNumber, chunkSize, totalSize, identifier, filename, fileSize){
// Clean up the identifier
identifier = cleanIdentifier(identifier);
// Check if the request is sane
if (chunkNumber==0 || chunkSize==0 || totalSize==0 || identifier.length==0 || filename.length==0) {
return 'non_resumable_request';
}
var numberOfChunks = Math.max(Math.floor(totalSize/(chunkSize*1.0)), 1);
if (chunkNumber>numberOfChunks) {
return 'invalid_resumable_request1';
}
// Is the file too big?
if($.maxFileSize && totalSize>$.maxFileSize) {
return 'invalid_resumable_request2';
}
if(typeof(fileSize)!='undefined') {
if(chunkNumber<numberOfChunks && fileSize!=chunkSize) {
// The chunk in the POST request isn't the correct size
return 'invalid_resumable_request3';
}
if(numberOfChunks>1 && chunkNumber==numberOfChunks && fileSize!=((totalSize%chunkSize)+chunkSize)) {
// The chunks in the POST is the last one, and the fil is not the correct size
return 'invalid_resumable_request4';
}
if(numberOfChunks==1 && fileSize!=totalSize) {
// The file is only a single chunk, and the data size does not fit
return 'invalid_resumable_request5';
}
}
return 'valid';
}
//'found', filename, original_filename, identifier
//'not_found', null, null, null
$.get = function(req, callback){
var chunkNumber = req.param('resumableChunkNumber', 0);
var chunkSize = req.param('resumableChunkSize', 0);
var totalSize = req.param('resumableTotalSize', 0);
var identifier = req.param('resumableIdentifier', "");
var filename = req.param('resumableFilename', "");
if(validateRequest(chunkNumber, chunkSize, totalSize, identifier, filename)=='valid') {
var chunkFilename = getChunkFilename(chunkNumber, identifier);
fs.exists(chunkFilename, function(exists){
if(exists){
callback('found', chunkFilename, filename, identifier);
} else {
callback('not_found', chunkFilename, filename, identifier);
}
});
} else {
callback('not_found2', chunkFilename, filename, identifier);
}
}
//'partly_done', filename, original_filename, identifier
//'done', filename, original_filename, identifier
//'invalid_resumable_request', null, null, null
//'non_resumable_request', null, null, null
$.post = function(req, callback){
var fields = req.body;
var files = req.files;
var chunkNumber = fields['resumableChunkNumber'];
var chunkSize = fields['resumableChunkSize'];
var totalSize = fields['resumableTotalSize'];
var identifier = cleanIdentifier(fields['resumableIdentifier']);
var filename = fields['resumableFilename'];
var original_filename = fields['resumableIdentifier'];
if(!files[$.fileParameterName] || !files[$.fileParameterName].size) {
callback('invalid_resumable_request', null, null, null);
return;
}
var validation = validateRequest(chunkNumber, chunkSize, totalSize, identifier, files[$.fileParameterName].size);
if(validation=='valid') {
var chunkFilename = getChunkFilename(chunkNumber, identifier);
// Save the chunk (TODO: OVERWRITE)
fs.rename(files[$.fileParameterName].path, chunkFilename, function(){
// Do we have all the chunks?
var currentTestChunk = 1;
var numberOfChunks = Math.max(Math.floor(totalSize/(chunkSize*1.0)), 1);
var testChunkExists = function(){
fs.exists(getChunkFilename(currentTestChunk, identifier), function(exists){
if(exists){
currentTestChunk++;
if(currentTestChunk>numberOfChunks) {
callback('done', filename, original_filename, identifier);
} else {
// Recursion
testChunkExists();
}
} else {
callback('partly_done', filename, original_filename, identifier);
}
});
}
testChunkExists();
});
} else {
callback(validation, filename, original_filename, identifier);
}
}
// Pipe chunks directly in to an existsing WritableStream
// r.write(identifier, response);
// r.write(identifier, response, {end:false});
//
// var stream = fs.createWriteStream(filename);
// r.write(identifier, stream);
// stream.on('data', function(data){...});
// stream.on('end', function(){...});
$.write = function(identifier, writableStream, options) {
options = options || {};
options.end = (typeof options['end'] == 'undefined' ? true : options['end']);
// Iterate over each chunk
var pipeChunk = function(number) {
var chunkFilename = getChunkFilename(number, identifier);
fs.exists(chunkFilename, function(exists) {
if (exists) {
// If the chunk with the current number exists,
// then create a ReadStream from the file
// and pipe it to the specified writableStream.
var sourceStream = fs.createReadStream(chunkFilename);
sourceStream.pipe(writableStream, {
end: false
});
sourceStream.on('end', function() {
// When the chunk is fully streamed,
// jump to the next one
pipeChunk(number + 1);
});
} else {
// When all the chunks have been piped, end the stream
if (options.end) writableStream.end();
if (options.onDone) options.onDone();
}
});
}
pipeChunk(1);
}
$.clean = function(identifier, options) {
options = options || {};
// Iterate over each chunk
var pipeChunkRm = function(number) {
var chunkFilename = getChunkFilename(number, identifier);
//console.log('removing pipeChunkRm ', number, 'chunkFilename', chunkFilename);
fs.exists(chunkFilename, function(exists) {
if (exists) {
console.log('exist removing ', chunkFilename);
fs.unlink(chunkFilename, function(err) {
if (err && options.onError) options.onError(err);
});
pipeChunkRm(number + 1);
} else {
if (options.onDone) options.onDone();
}
});
}
pipeChunkRm(1);
}
return $;
}

File diff suppressed because it is too large Load Diff

@ -1,216 +0,0 @@
/* 样式重置 */
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;}
body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#fff;}
div,img,tr,td,table{ border:0;}
table,tr,td{border:0;cellspacing:0; cellpadding:0;}
ol,ul,li{ list-style-type:none}
a:link,a:visited{color:#7f7f7f;text-decoration:none;}
a:hover,a:active{color:#000;}
.fl{ float:left;}
.fr{ float:right;}
.cl{ clear:both; overflow:hidden;}
/* 数据页面 */
.data_container{
width:100%;
margin:0 auto;
}
.data_heaer{
height:66px;
width:100%;
background-color:#3499db;
text-align:center;
}
.data_heaer h2{
font-size:30px;
font-weight:300;
color:#fff;
line-height:66px;
}
.data_content{
width:1280px;
height:838px;
margin:0 auto;
background-color:#fff;
border:1px solid #e0dede;
border-top:none;
}
.data_leftside{
width:612px;
border-right:1px solid #e0dede;
}
.data_h3{
width:100%;
text-align:center;
height:50px;
font-size:18px;
color:#444;
line-height:50px;
}
.data_leftside_files{
border-right:1px solid #e0dede;
border-bottom:1px solid #e0dede;
height:710px;
overflow :auto;
}
.data_leftside_files input{
margin-top:15px;
width:15px;
height:15px;
}
.data_leftside_files li{
height:40px;
line-height:40px;
border-bottom:1px solid #e0dede;
padding:0 10px;
}
.data_leftside_files li.data_title{
width:210px; height:36px;
line-height:36px;
text-align:center;
background-color:#e9f3fb;
border:none;
overflow:hidden;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
white-space:nowrap;
}
.date_label{
display:block;
width:168px;
overflow:hidden;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
white-space:nowrap;
}
.data_leftside_shu{
border-right:none;
}
.data_leftside_shu li{
border-bottom:none;
}
.data_conbar{ width:149px;
height:834px;
border-right:1px solid #e0dede;
border-left:1px solid #e0dede;
}
.date_btns{
width:260px;
margin:20px auto;
}
.date_btns_w{
width:390px;
}
.date_btns button{
margin:10px 20px;
}
.data_btn{
border:none;
width:108px;
height:35px;
line-height:35px;
text-align:center;
background-color:#3499db;
color:#fff;
font-size:14px;
-webkit-border-radius:5px;
-moz-border-radius:5px;
-o-border-radius:5px;
border-radius:5px;
}
.data_btn:hover{
background-color:#2989da;
}
.data_rightside{
width:667px;
}
.data_rightside_w{
width:407px;
}
.data_leftside_files li.data_title_w{
width:183px;
}
.date_label_w{
width:150px;
}
.data_leftside_shu li{
border-bottom:none;
}
a.data_file_btn{ display:block; position:relative; width:108px; height:35px; margin:15px auto; line-height:35px; font-size:14px; color: #fff; text-align:center;
background-color: #79b4e7;
background-image: -webkit-linear-gradient(#79b4e7, #1377cf);
background-image: linear-gradient(#79b4e7, #1377cf);
border-color: #076bc2;
-webkit-border-radius:5px;
-moz-border-radius:5px;
-o-border-radius:5px;
border-radius:5px;
vertical-align: middle;
cursor: pointer;
margin:0 10px;
}
a:hover.data_file_btn{
background-color: #076bc2;
background-image: -webkit-linear-gradient(#79b4e7, #076bc2);
background-image: linear-gradient(#79b4e7, #076bc2);
border-color: #076bc2;}
.data_file_btn input{ position:absolute; left:0px;opacity:0; filter:alpha(opacity=0); width:108px; height:35px;}
.data_conbox{
width:407px;
height:709px;
border-top:1px solid #e0dede;
border-bottom:1px solid #e0dede;
overflow: auto;
}
.data_con_title{
width:49.8%;
height:36px;
line-height:36px;
text-align:center;
background-color:#e9f3fb;
overflow:hidden;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
white-space:nowrap;
}
.data_con_line{
border-right:1px solid #e0dede;
}
.data_con_li{
width:49.8%;
height:36px;
line-height:36px;
overflow:hidden;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
white-space:nowrap;
border-bottom:1px solid #e0dede;
}
.mt15{ margin-top:15px;}
/* 树形结构 */
.data_rightside_tree{
width:259px;
height:709px;
border-right:1px solid #e0dede;
border-top:1px solid #e0dede;
border-bottom:1px solid #e0dede;
overflow: auto;
}
.tree { min-height:20px;padding:15px;padding-left:30px;border-bottom:1px dashed #ccc;}
.tree li {list-style-type:none;margin:0; padding:10px 5px 0 20px; position:relative}
.tree li::before, .tree li::after { content:'';left:-30px;position:absolute; right:auto}
.tree li::before { border-left:1px solid #999; bottom:50px;height:100%; top:0; width:0px}
.tree li::after {border-top:1px solid #999;height:20px; top:25px; width:35px}
.tree li p {display:inline-block;padding:3px 10px;border:1px solid #fff; margin-left:-15px; width:150px; }
.tree li.parent_li>p {cursor:pointer}
.tree>ul>li::before, .tree>ul>li::after {border:0}
.tree li:last-child::before { height:30px}
.tree li.parent_li>p:hover, .tree li.parent_li>p:hover+ul li p { }
.icon-plus-sign{ margin-left:-15px; background:url(../img/icons1.gif) -5px 10px no-repeat; }
.icon-minus-sign{ margin-left:-15px; background:url(../img/icons2.gif) -6px 9px no-repeat;}

@ -1,607 +0,0 @@
var fs = require('fs');
var dom = require("xmldom").DOMParser;
var select = require('xpath.js');
//var dataDetailPath = "/home/server_data/data-detail.xml"
//var dataPath = "/home/server_data/data.xml"
//var versionPath = "/home/server_data/version.txt"
var allDataPath = process.env.ALL_DATA || '/home/all_data';
var dataDetailPath = allDataPath + "/collecting_data/data-detail.xml"
var dataPath = allDataPath + "/collecting_data/data.xml"
var versionPath = allDataPath+ "/collecting_data/version.txt"
//<2F><><EFBFBD><EFBFBD>fileId<49><64><EFBFBD><EFBFBD>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ŵ<EFBFBD>λ<EFBFBD><CEBB>
function getVersionPath(fileId){
fileId = fileId.replace(/\"/g, "");
var item = "<item";
// fs<66><73>ȡ<EFBFBD><C8A1> xmldomת<6D><D7AA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
var filedata = fs.readFileSync(dataDetailPath, "utf-8");
var itemArray = filedata.split(item);
var itemsize = itemArray.length;
var version = {value:0};
// ͬһ<CDAC><D2BB>id,<2C><>Ӧ<EFBFBD><D3A6>item<65>ж<EFBFBD><D0B6>ٸ<EFBFBD><D9B8><EFBFBD>
for(var i = 1; i < itemsize; i++){
if(itemArray[i].indexOf(fileId)!= -1){
var oldBigVersion = itemArray[i].split("<version>")[1].split("</version>")[0];
if(version.value < oldBigVersion){
version.value = oldBigVersion;
}
}
}
version.value ++;
return version.value;
}
function mkdataForPage(collecttime, realtype, realpath, realbatch, realid, realname, version){
// var resultXmlData = "";
// var realpath = "/uplaods/";
// var realtype = "01";
// var realbatch = "01_A";
// var realid = "32550_111";
// var realname = "<22>Ͼ<EFBFBD><CFBE><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ϵͳ";
//json<6F><6E><EFBFBD>Եĸ<D4B5>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>@
var type ="id=\""+realtype+"\"";
var batch = "id=\""+realtype+"_"+realbatch+"\"";
var id = realtype+"_"+realbatch+"_"+realid+"\"";
var versionid = realtype+"_"+realbatch + "_"+realid + "_" + version +"\"";
var name = "name=\""+realname+"\"";
var path = "path=\""+realpath+"\"";
var versionstrutf = fs.readFileSync(versionPath, "utf-8");
console.log(typeof versionstrutf);
console.log("------------- mkdataForPage --------------");
fs.readFile(dataPath, "utf-8", function(err, data){
if(err){
console.log("<22><>ȡ<EFBFBD>ļ<EFBFBD> "+dataDetailPath+" fail " + err);
}
else{
var dataNodes = data.split("<node");
var istype ="0";
var isbatch ="0";
var isexist ="0";
var sizel = dataNodes.length;
for(var i=0; i < sizel; i++){
if(dataNodes[i].indexOf(type) != -1)
{
istype ="1";
}
if((istype == "1") && (dataNodes[i].indexOf(batch) != -1))
{
isbatch ="1";
}
//id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<CEA8>ģ<EFBFBD> <node id="32550_113"
if(isbatch == "1")
{//<2F><><EFBFBD><EFBFBD><EFBFBD>ӵİ汾
var nodestr = "";
if(dataNodes[i].indexOf(id) != -1){
nodestr = nodestr + "<node id=\""+ versionid + " name=\"" + realname+"\("+ versionstrutf + version + ")\"";
nodestr = nodestr + " path=\""+ realpath +"\"" + " time=\""+collecttime+ "\"></node>\n";
isexist = "1";
dataNodes[i] = dataNodes[i] + nodestr;
}
}
}
if(isexist.indexOf("1") == -1){
var nodestr = "";
for(var i=0; i < sizel; i++){
if(dataNodes[i].indexOf(batch) != -1){
var items = dataNodes[i].split("</");
if(items.length == 1){
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ϵͳ<CFB5><CDB3>---<2D><EFBFBD><E6B1BE>Ϣ<EFBFBD><CFA2>
nodestr = nodestr + "<node id=\"" + id +" "+ name + ">\n";
nodestr = nodestr + "<node id=\""+ versionid + " name=\"" + realname +"\(" + versionstrutf + version + ")\"";
nodestr = nodestr + " path=\""+ realpath +"\"" + " time=\""+collecttime+ "\"></node>\n</node>\n";
isexist = "1";
dataNodes[i] = dataNodes[i] + nodestr;
break;
}
else{
var items = dataNodes[i].split("</node");
nodestr = nodestr + "<node id=\"" + id +" "+ name + ">\n";
nodestr = nodestr + "<node id=\""+ versionid + " name=\"" + realname+"\(" + versionstrutf + version + ")\"";
nodestr = nodestr + " path=\""+ realpath +"\"" + " time=\""+collecttime+ "\"></node>\n</node>\n";
isexist = "1";
nodestr = items[0] +"\n" + nodestr +"\n</node>\n";
dataNodes[i] = nodestr;
break;
}
}
}
}
var resultdatastr = "";
for(var j=0; j < sizel-1; j++){
resultdatastr = resultdatastr + dataNodes[j] + "<node";
}
resultdatastr = resultdatastr + dataNodes[sizel-1]+"";
console.log("--------22222222-----------------");
console.log(resultdatastr);
console.log(typeof resultdatastr);
fs.writeFile(dataPath, resultdatastr, function(err){
if(err)
console.log(err);
else
console.log('has finished');
});
}
});
}
//saveByIdToXml("01", "B", "321200_0", "̩<><CCA9><EFBFBD><EFBFBD>_<EFBFBD><5F>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ϵͳ2","<22><><EFBFBD><EFBFBD>" , "̩<><CCA9>2", "<22>б<EFBFBD><D0B1><EFBFBD>", "<22><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ϵͳ", "321200_0", "0000", "lim", "13323225656",5);
function saveByIdToXml(collecttime, type, dataTimes, id, name, province, city, county, system, areacode, systemcode, contacts, phone, version, realpath){
var dataTimetemstr = "batch=\""+ type +"_" + dataTimes + "\"";
typestr = "type=\""+type+"\"";
var datatype = "<datatype";
var dataTimestr = "<dataTimes";
var dataTimeEndstr = "</dataTimes>";
var item = "<item";
var itemEnd = "</item>";
var dataEnd = "</data>";
id = type +"_" + dataTimes + "_" + id;
// <20><>ȡ
// var data = fs.readFileSync(dataDetailPath, "utf-8");
// <20><>ȡ
fs.readFile(dataDetailPath, "utf-8", function(err, data){
//fs.readFile("data.txt", function(err, data){
if(err){
console.log("<22><>ȡ<EFBFBD>ļ<EFBFBD> "+dataDetailPath+" fail " + err);
}
else{
console.log(data);
var resultStr = "";
// gbk <20><><EFBFBD><EFBFBD> linux<75><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//var str = iconv.decode(data,'gbk');
//data = str;
var typeArray = data.split(datatype);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7B1A3>{typeArray[0]:ͷ<><CDB7> typeArray[1]:<3A><EFBFBD><E7B1A3> typeArray[2]:<3A><><EFBFBD><EFBFBD>}
if(typeArray[1].indexOf(typestr)== -1){
resultStr += typeArray[0];
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7B1A3>
resultStr += datatype;
resultStr += typeArray[1];
//<2F><><EFBFBD><EFBFBD> <20><>typeArray[2]
var timesArray = typeArray[2].split(dataTimestr);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>εģ<CEB5><C4A3>ǵ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>; {timesArray[0]:ͷ<><CDB7> timesArray[1]:1<><31><EFBFBD>Σ<EFBFBD> timesArray[2]:2<><32><EFBFBD><EFBFBD>}
if(timesArray[1].indexOf(dataTimetemstr)== -1){
resultStr += datatype;
resultStr += timesArray[0];
// <20><><EFBFBD>ϵ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
resultStr += dataTimestr;
resultStr += timesArray[1];
var itemArray = timesArray[2].split(item);
var itemsize = itemArray.length;
var nowDate = new Date();
// itemԪ<6D><D4AA>
var itemStr = "<item id=\""+id+"_"+version+"\">\n";
itemStr += "\t\t\t\t<name>"+name+"</name>\n";
itemStr += "\t\t\t\t<collecttime>"+collecttime+"</collecttime>\n";
itemStr += "\t\t\t\t<time>"+nowDate.getFullYear()+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+"</time>\n";
itemStr += "\t\t\t\t<province>"+province+"</province>\n";
itemStr += "\t\t\t\t<city>"+city+"</city>\n";
itemStr += "\t\t\t\t<county>"+county+"</county>\n";
itemStr += "\t\t\t\t<system>"+system+"</system>\n";
itemStr += "\t\t\t\t<version>"+version+"</version>\n";
itemStr += "\t\t\t\t<path>"+realpath+"</path>\n";
itemStr += "\t\t\t\t<areacode>"+areacode+"</areacode>\n";
itemStr += "\t\t\t\t<systemcode>"+systemcode+"</systemcode>\n";
itemStr += "\t\t\t\t<contacts>"+contacts+"</contacts>\n";
itemStr += "\t\t\t\t<phone>"+phone+"</phone>\n";
itemStr += "\t\t\t\t<type>"+type+"</type>\n\t\t\t"+itemEnd+"\n\t\t";
// <20><><EFBFBD> <20><> resultStr
// û<><C3BB> item<65><6D> itemsize ==1
if(itemsize ==1){
var dataTimebeginstr = itemArray[0].split(dataTimeEndstr);
resultStr += dataTimestr;
resultStr += dataTimebeginstr[0];
resultStr += "\t" + itemStr;
resultStr += dataTimeEndstr;
for(var i = 1; i < dataTimebeginstr.length;i++){
resultStr += dataTimebeginstr[i];
}
}
// <20><> item<65><6D>
else{
resultStr += dataTimestr;
resultStr += itemArray[0];
if(version == 1){
for(var i=1; i < itemsize-1; i++){
resultStr += item;
resultStr += itemArray[i];
}
resultStr += itemStr + "\t";
resultStr += item;
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += itemArray[itemsize-1];
}
else{
var addtimes = 0;
var isadd = 0;
for(var i=1; i < itemsize-1; i++){
isadd++;
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
resultStr += item;
resultStr += itemArray[i];
}
if(isadd == 0){
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
}
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += item;
resultStr += itemArray[itemsize-1];
}
}
}
// <20><>1<EFBFBD><31><EFBFBD><EFBFBD>ʱ
else{
resultStr += datatype;
resultStr += timesArray[0];
resultStr += dataTimestr;
// item Ԫ<><D4AA>
var itemArray = timesArray[1].split(item);
var itemsize = itemArray.length;
var nowDate = new Date();
// itemԪ<6D><D4AA>
var itemStr = "<item id=\""+id+"_"+version+"\">\n";
itemStr += "\t\t\t\t<name>"+name+"</name>\n";
itemStr += "\t\t\t\t<collecttime>"+collecttime+"</collecttime>\n";
itemStr += "\t\t\t\t<time>"+nowDate.getFullYear()+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+"</time>\n";
itemStr += "\t\t\t\t<province>"+province+"</province>\n";
itemStr += "\t\t\t\t<city>"+city+"</city>\n";
itemStr += "\t\t\t\t<county>"+county+"</county>\n";
itemStr += "\t\t\t\t<system>"+system+"</system>\n";
itemStr += "\t\t\t\t<version>"+version+"</version>\n";
itemStr += "\t\t\t\t<path>"+realpath+"</path>\n";
itemStr += "\t\t\t\t<areacode>"+areacode+"</areacode>\n";
itemStr += "\t\t\t\t<systemcode>"+systemcode+"</systemcode>\n";
itemStr += "\t\t\t\t<contacts>"+contacts+"</contacts>\n";
itemStr += "\t\t\t\t<phone>"+phone+"</phone>\n";
itemStr += "\t\t\t\t<type>"+type+"</type>\n\t\t\t"+itemEnd+"\n\t\t";
// <20><><EFBFBD> <20><> resultStr
// û<><C3BB> item<65><6D> itemsize ==1
if(itemsize ==1){
var dataTimebeginstr = itemArray[0].split(dataTimeEndstr);
resultStr += dataTimebeginstr[0];
resultStr += "\t" + itemStr;
resultStr += dataTimeEndstr;
for(var i = 1; i < dataTimebeginstr.length;i++){
resultStr += dataTimebeginstr[i];
}
}
// <20><> item<65><6D>
else{
resultStr += itemArray[0];
if(version == 1){
for(var i=1; i < itemsize-1; i++){
resultStr += item;
resultStr += itemArray[i];
}
resultStr += itemStr + "\t";
resultStr += item;
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += itemArray[itemsize-1];
}
else{
var addtimes = 0;
var isadd = 0;
for(var i=1; i < itemsize-1; i++){
isadd++;
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
resultStr += item;
resultStr += itemArray[i];
}
if(isadd == 0){
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
}
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += item;
resultStr += itemArray[itemsize-1];
}
}
//Ȼ<><C8BB><EFBFBD><EFBFBD>ϵ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
resultStr += dataTimestr;
resultStr += timesArray[2];
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else{
resultStr += typeArray[0];
//<2F><20><>typeArray[1]
var timesArray = typeArray[1].split(dataTimestr);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>εģ<CEB5><C4A3>ǵ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>; {timesArray[0]:ͷ<><CDB7> timesArray[1]:1<><31><EFBFBD>Σ<EFBFBD> timesArray[2]:2<><32><EFBFBD><EFBFBD>}
if(timesArray[1].indexOf(dataTimetemstr)== -1){
resultStr += datatype;
resultStr += timesArray[0];
// <20><><EFBFBD>ϵ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
resultStr += dataTimestr;
resultStr += timesArray[1];
var itemArray = timesArray[2].split(item);
var itemsize = itemArray.length;
var nowDate = new Date();
// itemԪ<6D><D4AA>
var itemStr = "<item id=\""+id+"_"+version+"\">\n";
itemStr += "\t\t\t\t<name>"+name+"</name>\n";
itemStr += "\t\t\t\t<collecttime>"+collecttime+"</collecttime>\n";
itemStr += "\t\t\t\t<time>"+nowDate.getFullYear()+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+"</time>\n";
itemStr += "\t\t\t\t<province>"+province+"</province>\n";
itemStr += "\t\t\t\t<city>"+city+"</city>\n";
itemStr += "\t\t\t\t<county>"+county+"</county>\n";
itemStr += "\t\t\t\t<system>"+system+"</system>\n";
itemStr += "\t\t\t\t<version>"+version+"</version>\n";
itemStr += "\t\t\t\t<path>"+realpath+"</path>\n";
itemStr += "\t\t\t\t<areacode>"+areacode+"</areacode>\n";
itemStr += "\t\t\t\t<systemcode>"+systemcode+"</systemcode>\n";
itemStr += "\t\t\t\t<contacts>"+contacts+"</contacts>\n";
itemStr += "\t\t\t\t<phone>"+phone+"</phone>\n";
itemStr += "\t\t\t\t<type>"+type+"</type>\n\t\t\t"+itemEnd+"\n\t\t";
// <20><><EFBFBD> <20><> resultStr
// û<><C3BB> item<65><6D> itemsize ==1
if(itemsize ==1){
var dataTimebeginstr = itemArray[0].split(dataTimeEndstr);
resultStr += dataTimestr;
resultStr += dataTimebeginstr[0];
resultStr = resultStr + "\t" + itemStr;
resultStr += dataTimeEndstr;
for(var i = 1; i < dataTimebeginstr.length;i++){
resultStr += dataTimebeginstr[i];
}
}
// <20><> item<65><6D>
else{
resultStr += dataTimestr;
resultStr += itemArray[0];
if(version == 1){
for(var i=1; i < itemsize-1; i++){
resultStr += item;
resultStr += itemArray[i];
}
resultStr += itemStr + "\t";
resultStr += item;
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += itemArray[itemsize-1];
}
else{
var addtimes = 0;
var isadd = 0;
for(var i=1; i < itemsize-1; i++){
isadd++;
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
resultStr += item;
resultStr += itemArray[i];
}
if(isadd == 0){
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
}
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += item;
resultStr += itemArray[itemsize-1];
}
}
}
// <20><>1<EFBFBD><31><EFBFBD><EFBFBD>ʱ
else{
resultStr += datatype;
resultStr += timesArray[0];
resultStr += dataTimestr;
// item Ԫ<><D4AA>
var itemArray = timesArray[1].split(item);
var itemsize = itemArray.length;
var nowDate = new Date();
// itemԪ<6D><D4AA>
var itemStr = "<item id=\""+id+"_"+version+"\">\n";
itemStr += "\t\t\t\t<name>"+name+"</name>\n";
itemStr += "\t\t\t\t<collecttime>"+collecttime+"</collecttime>\n";
itemStr += "\t\t\t\t<time>"+nowDate.getFullYear()+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate()+" "+nowDate.getHours()+":"+nowDate.getMinutes()+"</time>\n";
itemStr += "\t\t\t\t<province>"+province+"</province>\n";
itemStr += "\t\t\t\t<city>"+city+"</city>\n";
itemStr += "\t\t\t\t<county>"+county+"</county>\n";
itemStr += "\t\t\t\t<system>"+system+"</system>\n";
itemStr += "\t\t\t\t<version>"+version+"</version>\n";
itemStr += "\t\t\t\t<path>"+realpath+"</path>\n";
itemStr += "\t\t\t\t<areacode>"+areacode+"</areacode>\n";
itemStr += "\t\t\t\t<systemcode>"+systemcode+"</systemcode>\n";
itemStr += "\t\t\t\t<contacts>"+contacts+"</contacts>\n";
itemStr += "\t\t\t\t<phone>"+phone+"</phone>\n";
itemStr += "\t\t\t\t<type>"+type+"</type>\n\t\t\t"+itemEnd+"\n\t\t";
// <20><><EFBFBD> <20><> resultStr
// û<><C3BB> item<65><6D> itemsize ==1
if(itemsize ==1){
var dataTimebeginstr = itemArray[0].split(dataTimeEndstr);
resultStr += dataTimebeginstr[0];
resultStr = resultStr + "\t" + itemStr;
resultStr += dataTimeEndstr;
for(var i = 1; i < dataTimebeginstr.length;i++){
resultStr += dataTimebeginstr[i];
}
}
// <20><> item<65><6D>
else{
resultStr += itemArray[0];
if(version == 1){
for(var i=1; i < itemsize-1; i++){
resultStr += item;
resultStr += itemArray[i];
}
resultStr += itemStr+"\t";
resultStr += item;
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += itemArray[itemsize-1];
}
else{
var addtimes = 0;
var isadd = 0;
for(var i=1; i < itemsize-1; i++){
isadd++;
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
resultStr += item;
resultStr += itemArray[i];
}
if(isadd == 0){
if(addtimes == 0){
if(itemArray[i].indexOf(id)!= -1){
resultStr += itemStr + "\t";
addtimes = 1;
}
}
}
// itemArray[itemsize-1]: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></dataTimes>
resultStr += item;
resultStr += itemArray[itemsize-1];
}
}
//Ȼ<><C8BB><EFBFBD><EFBFBD>ϵ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
resultStr += dataTimestr;
resultStr += timesArray[2];
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
resultStr += datatype;
resultStr += typeArray[2];
}
console.log("-----------------------------------------------");
console.log(resultStr);
console.log(typeof resultStr);
// д<><D0B4><EFBFBD>ļ<EFBFBD>
fs.writeFile(dataDetailPath, resultStr, function(err){
if(err)
console.log(err);
else
console.log('has finished');
});
}
});
}
function savehuizong(collecttime, type, id, name, realpath, fakename){
var typestr = "id=\""+type+"\"";
var data = fs.readFileSync(dataPath, "utf-8");
data = data.toString();
var node_arr = data.split("<node");
var node_arr_size = node_arr.length;
//遍历每个节点
for (var i = 1; i < node_arr_size; i++) {
if(node_arr[i] == undefined ){
continue;
}
if(node_arr[i].indexOf(typestr) != -1){
var tem_arr = node_arr[i].split("</node");
var nodeData = "\t<node id=\""+type+"_"+id+"\" name=\""+name+"\" fakename=\""+fakename+"\" path=\""+realpath+"\" time=\""+collecttime+"\"></node>\n\t";
var temhuizonglastSize = tem_arr.length ;
//判断有多少</node>
if (temhuizonglastSize <= 2) {
if(temhuizonglastSize == 2 && tem_arr[1].indexOf(">") != -1){
node_arr[i] = tem_arr[0]+nodeData + "</node>";
}
else{
node_arr[i] = tem_arr[0]+nodeData;
}
}
else{
node_arr[i] = tem_arr[0]+nodeData;
var nodestrtem = "";
for (var k = 1; k < temhuizonglastSize; k++) {
nodestrtem = nodestrtem + "\n</node>";
}
node_arr[i] = node_arr[i] + nodestrtem;
}
break;
}
}
var result_str = node_arr[0];
for (var j = 1; j < node_arr_size; j++) {
result_str = result_str +"<node"+ node_arr[j];
}
fs.writeFileSync(dataPath, result_str);
}
exports.getVersionPath = getVersionPath;
exports.mkdataForPage = mkdataForPage;
exports.saveByIdToXml = saveByIdToXml;
exports.savehuizong = savehuizong;

@ -0,0 +1,10 @@
/// <reference path="../../includes.d.ts" />
/// <reference path="developerHelpers.d.ts" />
declare module Developer {
var _module: ng.IModule;
var controller: (name: string, inlineAnnotatedConstructor: any[]) => ng.IModule;
var route: (templateName: string, reloadOnSearch?: boolean) => {
templateUrl: string;
reloadOnSearch: boolean;
};
}

@ -0,0 +1,10 @@
/// <reference path="../../includes.d.ts" />
/// <reference path="developerHelpers.d.ts" />
declare module Developer {
var _module: ng.IModule;
var controller: (name: string, inlineAnnotatedConstructor: any[]) => ng.IModule;
var route: (templateName: string, reloadOnSearch?: boolean) => {
templateUrl: string;
reloadOnSearch: boolean;
};
}

@ -0,0 +1,10 @@
/// <reference path="../../includes.d.ts" />
/// <reference path="developerHelpers.d.ts" />
declare module Developer {
var _module: ng.IModule;
var controller: (name: string, inlineAnnotatedConstructor: any[]) => ng.IModule;
var route: (templateName: string, reloadOnSearch?: boolean) => {
templateUrl: string;
reloadOnSearch: boolean;
};
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}
}

@ -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;
}

@ -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;
}

5
defs.d.ts vendored

@ -8,6 +8,9 @@
/// <reference path="d.ts/developer/ts/dataManagerHelper.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.d.ts"/>
/// <reference path="d.ts/developer/ts/dataManagerModel.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.ts.BASE.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.ts.LOCAL.d.ts"/>
/// <reference path="d.ts/developer/ts/developerPlugin.ts.REMOTE.d.ts"/>
/// <reference path="d.ts/developer/ts/environmentPanel.d.ts"/>
/// <reference path="d.ts/developer/ts/home.d.ts"/>
/// <reference path="d.ts/developer/ts/jenkinsJob.d.ts"/>
@ -25,7 +28,6 @@
/// <reference path="d.ts/developer/ts/projects.d.ts"/>
/// <reference path="d.ts/developer/ts/workspace.d.ts"/>
/// <reference path="d.ts/developer/ts/workspaces.d.ts"/>
/// <reference path="d.ts/navigation/ts/navigationPlugin.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/apps.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/breadcrumbs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/build.d.ts"/>
@ -70,3 +72,4 @@
/// <reference path="d.ts/kubernetes/ts/sharedControllers.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/tabs.d.ts"/>
/// <reference path="d.ts/kubernetes/ts/templates.d.ts"/>
/// <reference path="d.ts/navigation/ts/navigationPlugin.d.ts"/>

@ -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;
}

File diff suppressed because one or more lines are too long

632
dist/img/host.svg vendored

@ -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

@ -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

@ -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.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']);

@ -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>

@ -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

@ -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

@ -25,6 +25,13 @@
<!-- 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" />
<<<<<<< .mine
=======
<link rel="stylesheet" type="text/css" href="new/sj_style.css">
>>>>>>> .theirs
<!-- bower:js -->
<script src="libs/jquery/dist/jquery.js"></script>
<script src="libs/angular/angular.js"></script>
@ -128,14 +135,30 @@
</style>
</head>
<<<<<<< .mine
<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>
=======
</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>
>>>>>>> .theirs
</nav>
<platform-sub-tabs-outlet></platform-sub-tabs-outlet>
<<<<<<< .mine
<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">
=======
<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()" >
>>>>>>> .theirs
<hawtio-breadcrumbs-outlet></hawtio-breadcrumbs-outlet>
</div>
<div class="row" ng-class="getClass()">

24
my.js

@ -1,24 +0,0 @@
function Recursion(node){
var count=0;
for (var key in node) {
count++;
var value = node[key];
delete node[key];
//如果node为叶子节点
if (key.toString() == '$') {
for (var attr in value)
node[attr] = value[attr];
} else {
if (value instanceof Array) {
if (value.length > 0) {
node["children"] = value;
for (var obj in value)
Recursion(value[obj]);
}
}
}
}
if(count==1)
node["children"]=[];
}
exports.Recursion=Recursion;

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

@ -0,0 +1,85 @@
/* 样式重置 */
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;}
body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#fff;}
div,img,tr,td,table{ border:0;}
table,tr,td{border:0;cellspacing:0; cellpadding:0;}
ol,ul,li{ list-style-type:none}
a:link,a:visited{color:#7a7a7a;text-decoration:none;}
a:hover,a:active{color:#333;}
/* 清除 */
.clear{ zoom:1;}
.clear:after {content:".";height:0;visibility:hidden;display:block;clear:both;}
.fl{ float:left;}
.fr{ float:right;}
.cl{ clear:both; overflow:hidden;}
/* public*/
.ml5{ margin-top: 5px;}.ml10{ margin-top: 10px;}
.ml5{ margin-left:5px;}.ml10{ margin-left:10px;}
.mr5{ margin-right:5px;}.mr10{ margin-right:10px;}
a.sj_btn_grey{ display:inline-block; padding:0px 15px; height:30px; line-height:30px; -webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; background-image:-webkit-linear-gradient(top, #fdfdfd,#e8e8e8);background-image:linear-gradient(top,#fdfdfd,#e8e8e8); border:1px solid #cecece; color:#505050;}
a:hover.sj_btn_grey{ background-image:-webkit-linear-gradient(top, #eeeeee,#d3d3d3);background-image:linear-gradient(top,#eeeeee,#d3d3d3);}
.sj_btn_grey{ display:inline-block; padding:0px 15px; height:30px; line-height:30px; -webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; background-image:-webkit-linear-gradient(top, #fdfdfd,#e8e8e8);background-image:linear-gradient(top,#fdfdfd,#e8e8e8); border:1px solid #cecece; color:#505050;}
.sj_btn_grey:hover{ background-image:-webkit-linear-gradient(top, #eeeeee,#d3d3d3);background-image:linear-gradient(top,#eeeeee,#d3d3d3);}
/* sj_header */
.sj_header{ height:70px; width:100%; background:#1d1d1d;}
.sj_header a.sj_logo{ display:block; height:41px; width:146px; padding:14px 20px 0 12px;}
.sj_topnav{ height:70px; width:100%; padding-left: 180px; }
.sj_topnav li a{ height:70px; line-height:70px; font-size:14px; color:#fff; padding:0 20px;}
.sj_topnav li a:hover,.sj_topnav li a.sj_topnav_active{ background-image:-webkit-linear-gradient(top, #424242,#323232);background-image:linear-gradient(top,#424242,#323232); }
/* sj_content */
.sj_content{ width:100%; position:relative; color:#505050;}
.sj_leftnav{ width:170px; min-height:800px; max-height:985px; background:#1d1d1d; position:absolute; left:0; top:0px;}
.sj_leftnav_i{ background:#717171; padding:0 5px;;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; margin-left:80px; }
.sj_menu {margin-top:12px;background:#1d1d1d; }
.sj_menu_nav { background-image:-webkit-linear-gradient(top, #404040,#353535);background-image:linear-gradient(top,#404040,#353535); color: #fff; height:40px; line-height:38px; padding-left:15px; border: none; border-top: 2px solid #4d4d4d; border-bottom: 2px solid #1d1d1d;}
.sj_menu_nav:hover{ background-image:-webkit-linear-gradient(top, #535353,#353535);background-image:linear-gradient(top,#535353,#353535);}
.sj_menu_nav i{ font-style: normal;}
.sj_menu_nav a{ color: #fff;}
.sj_menu .sj_menu_nav ul{background: #1d1d1d; color: #fff;padding-left: 20px; border:none;}
.sj_menu_ul{ }
.sj_menu_ul li a{ display: block; background: #1d1d1d; color: #fff;padding-left: 30px; height: 40px; line-height: 40px; }
.sj_menu_ul li a:hover{background: #fff; color:#1d1d1d;}
#menu li a:hover { background-image:-webkit-linear-gradient(top, #535353,#353535);background-image:linear-gradient(top,#535353,#353535);}
#menu li ul li a { background: #1d1d1d; color: #fff;padding-left: 20px; border:none;}
#menu li ul li a:hover,.sj_leftnav ul#menu li ul li .leftnavact { background: #fff; color:#1d1d1d;}
.sj_menu_01{ background:url(../new/images/sj_icons.png) 0 0px no-repeat; padding-left:20px;}
.sj_menu_02{ background:url(../new/images/sj_icons.png) 0 -29px no-repeat; padding-left:20px;}
.sj_menu_03{ background:url(../new/images/sj_icons.png) 0 -112px no-repeat; padding-left:20px;}
.sj_menu_04{ background:url(../new/images/sj_icons.png) 0 -133px no-repeat; padding-left:20px;}
.sj_contentbox{ width:100%; background:#fff; min-height:800px; }
.sj_icons_home{ background:url(../new/images/sj_icons.png) 0 -60px no-repeat; width:15px; height:15px; margin-top:10px; margin-right:3px;}
.sj_content_position{ background:#eee; height:35px; line-height:35px; color:#7a7a7a; margin:2px 0 0 170px; padding-left:20px;}
.sj_content_position ul li{ float:left;}
.sj_filter li{ float:left;}
.sj_filter li a{ display: inline-block; border:1px solid #cecece;background-image:-webkit-linear-gradient(top, #fcfcfc,#e9e9e9);background-image:linear-gradient(top, #fcfcfc,#e9e9e9); padding:5px 15px; color:#505050; margin-right:5px;}
.sj_filter li a:hover,.sj_filter li a.active{ background:#cdcdcd; border:1px solid #9e9e9e;}
.sj_content_top{ margin:20px 20px 0 190px;}
.sj_searchbox{position:relative;}
.sj_search_input{-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px; border:1px solid #d3d3d3; background:#fff; padding-left:5px; color:#888; height:28px; width:210px;box-shadow: inset 0px 0px 5px #dcdcdc; }
.sj_searchbox a.sj_search_btn{ position:absolute; top:5px; right:5px; background:url(../new/images/sj_icons.png) 0 -82px no-repeat; display:block; width:20px; height:20px; }
/* table */
.sj_content_table{ }
.sj_content_table > tbody > tr > td{ height:36px; line-height:36px;}
.sj_content_table tr td.tl{ text-align:left;}
.sj_content_table .table-header{background-image:-webkit-linear-gradient(top, #f7f7f7,#dfdfdf);background-image:linear-gradient(top, #f7f7f7,#dfdfdf); border-bottom:1px solid #a6a6a6;}
.sj_content_table > thead > tr > th{ height:36px; line-height:36px;}
.sj_content_table .sj_tr_grey{ background:#f3f3f3;}
.sj_table_td01{ width:2%;}
.sj_table_td02{ width:9%;}
.sj_table_td03{ width:22%;}
.sj_table_td04{ width:14%;}
.sj_table_td05{ width:13%;}
.sj_table_td06{ width:10%;}
.sj_table_td07{ width:30%;}
.sj_table_td08{ width:60%;}
.sj_table_td09{ width:70%;}
.sj_over_hid{ display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sj_content_table table tr td input{ margin-top:15px;}
.sj_content_table .sj_table_top td{ border-bottom:1px solid #a6a6a6; font-weight:bold; border-right:1px solid #ccc;}
.sj_table_bottom{ height:30px; line-height:30px; }
.sj_table_bottom li{ float:left;}
.sj_table_select{ background:#fff; border:1px solid #b1b1b1; height:25px; margin:0 5px;}

@ -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: "",
}
};

@ -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"
}
}

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -1,4 +1,4 @@
<div ng-controller="Developer.WorkspacesController" hawtio-card-bg>
<div ng-controller="Developer.WorkspacesController" hawtio-card-bg style="margin-top:100px;">
<div hawtio-breadcrumbs></div>
<div hawtio-tabs></div>
<div class="container-content">
@ -12,6 +12,7 @@
<p class="alert alert-info">当前没有可以查看的数据.</p>
</div>
<div ng-show="model.data.length">
<<<<<<< .mine
<table class="table table-striped table-bordered" hawtio-simple-table="tableConfig"></table>
<div class="row">
<div class="col-xs-6 col-sm-2">
@ -39,6 +40,35 @@
</div>
</div>
</div>
=======
<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>
>>>>>>> .theirs
</div>
</div>
</div>

@ -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;
}

@ -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;
}
}
}
}
}

@ -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;
}
}

@ -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;
}

@ -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;
}
}

@ -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);
}
}
}
}
}
}

@ -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();
}
});
}
}

@ -12,12 +12,10 @@ module Developer {
.when("/data-manager", route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/:type/data-type/all'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/:type/data-type/financial'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'Overview/:type/data-type/social-security'), route('workspaces.html', false))
.when(UrlHelpers.join(context, 'task'), route('apps.html', false))
.otherwise(context);
}]);
.when(UrlHelpers.join(context, 'Overview/:type/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");

@ -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);
});
}

@ -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();
}]);
}

@ -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);
}
}
}]);
}

@ -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);
});
}
}
}]);
}

@ -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;
}
});
}

@ -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);
});
}
}
}]);
}

@ -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;
}
}]);
}

@ -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);
}
}
}]);
}

@ -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'
};
});
}

@ -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();
});
}

@ -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);
}
}]);
}

@ -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);
}
}]);
}

@ -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();
*/
}]);
}

@ -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();
}]);
}

@ -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;

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

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

Loading…
Cancel
Save