new version compass-web

Change-Id: I51065cd45e80b6bd1fc69ed7cc7d09f81fdb81c1
This commit is contained in:
chi zhang 2015-02-17 16:43:02 -08:00
parent 94130baa44
commit e1df1a5c5a
176 changed files with 47946 additions and 0 deletions

101
v2.5/Gruntfile.coffee Normal file
View File

@ -0,0 +1,101 @@
module.exports = (grunt)->
#config
grunt.initConfig
clean:
main:
src: 'target'
coffee:
glob_to_multiple:
expand: true
flatten: false
src: ["src/**/*.coffee"]
dest: 'target'
ext: ".js"
copy:
static:
files: [
{
src: 'index.html'
dest: 'target/index.html'
}
]
testServer:
files: [
src: 'src/app/server/appDev.js'
dest: 'target/src/app/server/appDev.js'
]
vendor:
files: [
expand: true
flatten: false
src: 'vendor/**/*'
dest: 'target/'
]
data:
files: [
expand: true
flatten: true
src: 'data/*.json'
dest: 'target/data/'
]
assets:
files: [
expand: true
src: ['assets/font/*','assets/img/**/*']
dest: 'target/'
]
cssmin:
options:
rebase: false
target:
files:
'target/assets/css/compass.min.css':['assets/css/ace.min.css',
'assets/css/ace-skins.min.css',
'assets/css/ace-fonts.css',
'assets/css/style.css',
'assets/css/chart.css',
'assets/css/chosen.css',
'assets/css/shelf.css']
uglify:
target:
files: [
expand: true
cwd: 'target/src/app'
src: '**/*.js'
dest: 'target/src/app'
]
# files:
# 'target/src/app/app.js': ['target/src/app/app.js']
htmlmin:
target:
options:
removeComments: true
collapseWhitespace: true
files: [
expand: true
src: 'src/app/partials/*'
dest: 'target/'
]
watch:
build:
files: ["**/*.{css,coffee,html}"]
tasks: ['build']
options:
spawn: false
#dependencis
grunt.loadNpmTasks('grunt-contrib-clean')
grunt.loadNpmTasks('grunt-contrib-copy')
grunt.loadNpmTasks('grunt-contrib-coffee')
grunt.loadNpmTasks('grunt-contrib-uglify')
grunt.loadNpmTasks('grunt-contrib-cssmin')
grunt.loadNpmTasks('grunt-contrib-htmlmin')
grunt.loadNpmTasks('grunt-contrib-watch')
#Alias tasks
grunt.registerTask('build', ['copy','coffee','cssmin', 'htmlmin','uglify'])
grunt.registerTask('watcher', ['watch'])
grunt.registerTask('default',['clean', 'build','watcher'])

View File

@ -0,0 +1,13 @@
/* included only when we don't want to use fonts from google server */
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 300;
src: local('Open Sans Light'), local('OpenSans-Light'), url(../font/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans'), local('OpenSans'), url(../font/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
}

2636
v2.5/assets/css/ace-skins.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

15663
v2.5/assets/css/ace.min.css vendored Normal file

File diff suppressed because it is too large Load Diff

2
v2.5/assets/css/angular-ui-tree.min.css vendored Executable file
View File

@ -0,0 +1,2 @@
/* angular-ui-tree css file */
.angular-ui-tree-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.angular-ui-tree-nodes{display:block;position:relative;margin:0;padding:0;list-style:none}.angular-ui-tree-nodes .angular-ui-tree-nodes{padding-left:20px}.angular-ui-tree-node,.angular-ui-tree-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.angular-ui-tree-hidden{display:none}.angular-ui-tree-placeholder{margin:5px 0;padding:0;min-height:30px}.angular-ui-tree-handle{cursor:move;text-decoration:none;font-weight:700;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;min-height:20px;line-height:20px}.angular-ui-tree-drag{position:absolute;pointer-events:none;z-index:999;opacity:.8}

170
v2.5/assets/css/chart.css Normal file
View File

@ -0,0 +1,170 @@
/* circle packing */
text {
font-size: 14px !important;
font-family: "Arial, Helvetica, sans-serif";
pointer-events: none;
}
text.parent {
fill: #1f77b4;
}
circle {
fill: #ccc;
stroke: #999;
fill-opacity: .8;
pointer-events: all;
}
circle.parent {
fill: #1f77b4;
fill-opacity: .3;
stroke: steelblue;
}
circle.parent:hover {
stroke: #ff7f0e;
stroke-width: 5px;
}
circle.child {
pointer-events: none;
}
circlepacking circle.parent {
fill-opacity: 1 !important;
//stroke: none !important;
fill: #E6F7FF!important;
}
circlepacking circle {
fill-opacity: 1 !important;
//stroke: none !important;
}
circle[depth='1'] {
fill: #85D6FF !important;
}
circle[depth='2'] {
fill: #70B8FF !important;
}
circle[depth='3'] {
fill: #3399FF !important;
}
circle[depth='4'] {
fill: #005CE6 !important;
}
circle.node {
cursor: pointer;
}
circle.node:hover {
stroke: #000;
stroke-width: 1.5px;
}
circle.node--leaf {
fill: white;
}
.chartLabel {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
text-anchor: middle;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
}
.chartLabel-hover{
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
text-anchor: middle;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
font-size: 30px !important;
}
.chartLabel,
.node--root,
.node--leaf {
pointer-events: none;
}
.red-border {
border-color: red !important;
}
/* tree chart*/
.node circle {
cursor: pointer;
fill: #fff;
stroke: steelblue;
stroke-width: 1.5px;
}
.node text {
font-size: 11px;
}
path.link {
fill: none;
stroke: #ccc;
stroke-width: 1.5px;
}
treechart rect {
fill: none;
cursor: pointer;
}
treechart rect:hover {
stroke: #222;
stroke-width: 3px;
}
treechart rect[data-state='ok'] {
fill: green;
}
treechart rect[data-state='warning'] {
fill: yellow;
}
treechart rect[data-state='error'] {
fill: red;
}
treechart text.info {
background-color: #ffffff;
width: 200px;
height: 200px;
border: 2px dashed #dddddd;
}
treechart .tip {
border: 2px dashed #aaaaaa;
border-radius: 8px;
opacity: 0.9;
padding: 8px 10px;
background-color: #eeeeee;
}
/* gantt chart */
ganttchart .chart {
font-family: Arial, sans-serif;
font-size: 12px;
margin-top: 30px;
}
ganttchart text {
font-family: "Lucida Grande","Lucida Sans Unicode",Helvetica,Arial,Verdana,sans-serif !important;
font-size: 14px;
}
ganttchart .axis path, ganttchart .axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
ganttchart .bar {
fill: #B8B8B8; /*grey*/
}
ganttchart .bar-failed {
fill: #CC0000; /*red*/
}
ganttchart .bar-warning {
fill: #ffbb33; /*yellow*/
}
ganttchart .bar-successful {
fill: #669900; /*green*/
}
ganttchart .bar-unknown {
fill: #33b5e5; /*blue*/
}
ganttchart .x text {
text-anchor: end !important;
transform: rotate(-65deg);
}

430
v2.5/assets/css/chosen.css Executable file
View File

@ -0,0 +1,430 @@
/* @group Base */
.chosen-container {
position: relative;
display: inline-block;
vertical-align: middle;
font-size: 13px;
zoom: 1;
*display: inline;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.chosen-container .chosen-drop {
position: absolute;
top: 100%;
left: -9999px;
z-index: 1010;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
width: 100%;
border: 1px solid #aaa;
border-top: 0;
background: #fff;
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
}
.chosen-container.chosen-with-drop .chosen-drop {
left: 0;
}
.chosen-container a {
cursor: pointer;
}
/* @end */
/* @group Single Chosen */
.chosen-container-single .chosen-single {
position: relative;
display: block;
overflow: hidden;
padding: 0 0 0 8px;
height: 23px;
border: 1px solid #aaa;
border-radius: 5px;
background-color: #fff;
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
background-clip: padding-box;
box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
color: #444;
text-decoration: none;
white-space: nowrap;
line-height: 24px;
}
.chosen-container-single .chosen-default {
color: #999;
}
.chosen-container-single .chosen-single span {
display: block;
overflow: hidden;
margin-right: 26px;
text-overflow: ellipsis;
white-space: nowrap;
}
.chosen-container-single .chosen-single-with-deselect span {
margin-right: 38px;
}
.chosen-container-single .chosen-single abbr {
position: absolute;
top: 6px;
right: 26px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-single .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single .chosen-single div {
position: absolute;
top: 0;
right: 0;
display: block;
width: 18px;
height: 100%;
}
.chosen-container-single .chosen-single div b {
display: block;
width: 100%;
height: 100%;
background: url('chosen-sprite.png') no-repeat 0px 2px;
}
.chosen-container-single .chosen-search {
position: relative;
z-index: 1010;
margin: 0;
padding: 3px 4px;
white-space: nowrap;
}
.chosen-container-single .chosen-search input[type="text"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin: 1px 0;
padding: 4px 20px 4px 5px;
width: 100%;
height: auto;
outline: 0;
border: 1px solid #aaa;
background: white url('chosen-sprite.png') no-repeat 100% -20px;
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
font-size: 1em;
font-family: sans-serif;
line-height: normal;
border-radius: 0;
}
.chosen-container-single .chosen-drop {
margin-top: -1px;
border-radius: 0 0 4px 4px;
background-clip: padding-box;
}
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
position: absolute;
left: -9999px;
}
/* @end */
/* @group Results */
.chosen-container .chosen-results {
position: relative;
overflow-x: hidden;
overflow-y: auto;
margin: 0 4px 4px 0;
padding: 0 0 0 4px;
max-height: 240px;
-webkit-overflow-scrolling: touch;
}
.chosen-container .chosen-results li {
display: none;
margin: 0;
padding: 5px 6px;
list-style: none;
line-height: 15px;
}
.chosen-container .chosen-results li.active-result {
display: list-item;
cursor: pointer;
}
.chosen-container .chosen-results li.disabled-result {
display: list-item;
color: #ccc;
cursor: default;
}
.chosen-container .chosen-results li.highlighted {
background-color: #3875d7;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
color: #fff;
}
.chosen-container .chosen-results li.no-results {
display: list-item;
background: #f4f4f4;
}
.chosen-container .chosen-results li.group-result {
display: list-item;
font-weight: bold;
cursor: default;
}
.chosen-container .chosen-results li.group-option {
padding-left: 15px;
}
.chosen-container .chosen-results li em {
font-style: normal;
text-decoration: underline;
}
/* @end */
/* @group Multi Chosen */
.chosen-container-multi .chosen-choices {
position: relative;
overflow: hidden;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin: 0;
padding: 0;
width: 100%;
height: auto !important;
height: 1%;
border: 1px solid #aaa;
background-color: #fff;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
cursor: text;
}
.chosen-container-multi .chosen-choices li {
float: left;
list-style: none;
}
.chosen-container-multi .chosen-choices li.search-field {
margin: 0;
padding: 0;
white-space: nowrap;
}
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
margin: 1px 0;
padding: 5px;
height: 15px;
outline: 0;
border: 0 !important;
background: transparent !important;
box-shadow: none;
color: #666;
font-size: 100%;
font-family: sans-serif;
line-height: normal;
border-radius: 0;
}
.chosen-container-multi .chosen-choices li.search-field .default {
color: #999;
}
.chosen-container-multi .chosen-choices li.search-choice {
position: relative;
margin: 3px 0 3px 5px;
padding: 3px 20px 3px 5px;
border: 1px solid #aaa;
border-radius: 3px;
background-color: #e4e4e4;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-clip: padding-box;
box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
color: #333;
line-height: 13px;
cursor: default;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
position: absolute;
top: 4px;
right: 3px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-choices li.search-choice-disabled {
padding-right: 5px;
border: 1px solid #ccc;
background-color: #e4e4e4;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
color: #666;
}
.chosen-container-multi .chosen-choices li.search-choice-focus {
background: #d4d4d4;
}
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-results {
margin: 0;
padding: 0;
}
.chosen-container-multi .chosen-drop .result-selected {
display: list-item;
color: #ccc;
cursor: default;
}
/* @end */
/* @group Active */
.chosen-container-active .chosen-single {
border: 1px solid #5897fb;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active.chosen-with-drop .chosen-single {
border: 1px solid #aaa;
-moz-border-radius-bottomright: 0;
border-bottom-right-radius: 0;
-moz-border-radius-bottomleft: 0;
border-bottom-left-radius: 0;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
box-shadow: 0 1px 0 #fff inset;
}
.chosen-container-active.chosen-with-drop .chosen-single div {
border-left: none;
background: transparent;
}
.chosen-container-active.chosen-with-drop .chosen-single div b {
background-position: -18px 2px;
}
.chosen-container-active .chosen-choices {
border: 1px solid #5897fb;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
color: #111 !important;
}
/* @end */
/* @group Disabled Support */
.chosen-disabled {
opacity: 0.5 !important;
cursor: default;
}
.chosen-disabled .chosen-single {
cursor: default;
}
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
cursor: default;
}
/* @end */
/* @group Right to Left */
.chosen-rtl {
text-align: right;
}
.chosen-rtl .chosen-single {
overflow: visible;
padding: 0 8px 0 0;
}
.chosen-rtl .chosen-single span {
margin-right: 0;
margin-left: 26px;
direction: rtl;
}
.chosen-rtl .chosen-single-with-deselect span {
margin-left: 38px;
}
.chosen-rtl .chosen-single div {
right: auto;
left: 3px;
}
.chosen-rtl .chosen-single abbr {
right: auto;
left: 26px;
}
.chosen-rtl .chosen-choices li {
float: right;
}
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
direction: rtl;
}
.chosen-rtl .chosen-choices li.search-choice {
margin: 3px 5px 3px 0;
padding: 3px 5px 3px 19px;
}
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
right: auto;
left: 4px;
}
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
.chosen-rtl .chosen-drop {
left: 9999px;
}
.chosen-rtl.chosen-container-single .chosen-results {
margin: 0 0 4px 4px;
padding: 0 4px 0 0;
}
.chosen-rtl .chosen-results li.group-option {
padding-right: 15px;
padding-left: 0;
}
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
border-right: none;
}
.chosen-rtl .chosen-search input[type="text"] {
padding: 4px 5px 4px 20px;
background: white url('chosen-sprite.png') no-repeat -30px -20px;
background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
direction: rtl;
}
.chosen-rtl.chosen-container-single .chosen-single div b {
background-position: 6px 2px;
}
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
background-position: -12px 2px;
}
/* @end */
/* @group Retina compatibility */
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
.chosen-rtl .chosen-search input[type="text"],
.chosen-container-single .chosen-single abbr,
.chosen-container-single .chosen-single div b,
.chosen-container-single .chosen-search input[type="text"],
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
.chosen-container .chosen-results-scroll-down span,
.chosen-container .chosen-results-scroll-up span {
background-image: url('chosen-sprite@2x.png') !important;
background-size: 52px 37px !important;
background-repeat: no-repeat !important;
}
}
/* @end */

View File

@ -0,0 +1,284 @@
/*!
* Stylesheet for the Date Range Picker, for use with Bootstrap 3.x
*
* Copyright 2013 Dan Grossman ( http://www.dangrossman.info )
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Built for http://www.improvely.com
*/
.daterangepicker.dropdown-menu {
max-width: none;
z-index: 3000;
}
.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar {
float: left;
margin: 4px;
}
.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar {
float: right;
margin: 4px;
}
.daterangepicker .ranges {
width: 160px;
text-align: left;
}
.daterangepicker .ranges .range_inputs>div {
float: left;
}
.daterangepicker .ranges .range_inputs>div:nth-child(2) {
padding-left: 11px;
}
.daterangepicker .calendar {
display: none;
max-width: 270px;
}
.daterangepicker.show-calendar .calendar {
display: block;
}
.daterangepicker .calendar.single .calendar-date {
border: none;
}
.daterangepicker .calendar th, .daterangepicker .calendar td {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
white-space: nowrap;
text-align: center;
min-width: 32px;
}
.daterangepicker .daterangepicker_start_input label,
.daterangepicker .daterangepicker_end_input label {
color: #333;
display: block;
font-size: 11px;
font-weight: normal;
height: 20px;
line-height: 20px;
margin-bottom: 2px;
text-shadow: #fff 1px 1px 0px;
text-transform: uppercase;
width: 74px;
}
.daterangepicker .ranges input {
font-size: 11px;
}
.daterangepicker .ranges .input-mini {
border: 1px solid #ccc;
border-radius: 4px;
color: #555;
display: block;
font-size: 11px;
height: 30px;
line-height: 30px;
vertical-align: middle;
margin: 0 0 10px 0;
padding: 0 6px;
width: 74px;
}
.daterangepicker .ranges ul {
list-style: none;
margin: 0;
padding: 0;
}
.daterangepicker .ranges li {
font-size: 13px;
background: #f5f5f5;
border: 1px solid #f5f5f5;
color: #08c;
padding: 3px 12px;
margin-bottom: 8px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
cursor: pointer;
}
.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover {
background: #08c;
border: 1px solid #08c;
color: #fff;
}
.daterangepicker .calendar-date {
border: 1px solid #ddd;
padding: 4px;
border-radius: 4px;
background: #fff;
}
.daterangepicker .calendar-time {
text-align: center;
margin: 8px auto 0 auto;
line-height: 30px;
}
.daterangepicker {
position: absolute;
background: #fff;
top: 100px;
left: 20px;
padding: 4px;
margin-top: 1px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.daterangepicker.opensleft:before {
position: absolute;
top: -7px;
right: 9px;
display: inline-block;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-left: 7px solid transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: '';
}
.daterangepicker.opensleft:after {
position: absolute;
top: -6px;
right: 10px;
display: inline-block;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent;
content: '';
}
.daterangepicker.opensright:before {
position: absolute;
top: -7px;
left: 9px;
display: inline-block;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-left: 7px solid transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: '';
}
.daterangepicker.opensright:after {
position: absolute;
top: -6px;
left: 10px;
display: inline-block;
border-right: 6px solid transparent;
border-bottom: 6px solid #fff;
border-left: 6px solid transparent;
content: '';
}
.daterangepicker table {
width: 100%;
margin: 0;
}
.daterangepicker td, .daterangepicker th {
text-align: center;
width: 20px;
height: 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
cursor: pointer;
white-space: nowrap;
}
.daterangepicker td.off {
color: #999;
}
.daterangepicker td.disabled {
color: #999;
}
.daterangepicker td.available:hover, .daterangepicker th.available:hover {
background: #eee;
}
.daterangepicker td.in-range {
background: #ebf4f8;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.daterangepicker td.available + td.start-date {
-webkit-border-radius: 4px 0 0 4px;
-moz-border-radius: 4px 0 0 4px;
border-radius: 4px 0 0 4px;
}
.daterangepicker td.in-range + td.end-date{
-webkit-border-radius: 0 4px 4px 0;
-moz-border-radius: 0 4px 4px 0;
border-radius: 0 4px 4px 0;
}
.daterangepicker td.start-date.end-date{
-webkit-border-radius: 4px !important;
-moz-border-radius: 4px !important;
border-radius: 4px !important;
}
.daterangepicker td.active, .daterangepicker td.active:hover {
background-color: #357ebd;
border-color: #3071a9;
color: #fff;
}
.daterangepicker td.week, .daterangepicker th.week {
font-size: 80%;
color: #ccc;
}
.daterangepicker select.monthselect, .daterangepicker select.yearselect {
font-size: 12px;
padding: 1px;
height: auto;
margin: 0;
cursor: default;
}
.daterangepicker select.monthselect {
margin-right: 2%;
width: 56%;
}
.daterangepicker select.yearselect {
width: 40%;
}
.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect {
width: 50px;
margin-bottom: 0;
}
.daterangepicker_start_input {
float: left;
}
.daterangepicker_end_input {
float: left;
padding-left: 11px
}
.daterangepicker th.month {
width: auto;
}

4
v2.5/assets/css/font-awesome.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
v2.5/assets/css/nv.d3.min.css vendored Normal file

File diff suppressed because one or more lines are too long

249
v2.5/assets/css/shelf.css Normal file
View File

@ -0,0 +1,249 @@
footer.copyright {
color: #777777;
float: left;
font-family: Open Sans, Helvetica,sans-serif;
font-size: 80%;
font-style: italic;
margin: 1em;
text-align: center;
width: 100%;
}
div .description {
color: #777777;
float: left;
font-family: Open Sans, Helvetica,sans-serif;
font-size: 80%;
line-height: 1.3;
margin: 1em;
text-align: center;
width: 100%;
}
div.logo-nav .compass_logo {
background: url("compass-logo.png") no-repeat scroll left bottom / contain rgba(0, 0, 0, 0);
float: left;
height: 3em;
width: 12em;
}
div.container {
margin: 2em auto;
overflow: hidden;
width: 880px;
}
div.logo-nav {
margin: 0 10px;
}
div.logo-nav h1 {
color: #777;
font-family: Open Sans, verdana;
font-size: 250%;
font-weight: normal;
}
div.toc {
float: left;
}
div.toc ul li {
display: block;
float: left;
padding: 5px;
height: 200px;
overflow: hidden;
width: 860px;
}
div.toc ul li a {
background-color: rgb(18, 191, 119);
background-position: 50% 60%;
background-repeat: no-repeat;
color: white;
display: block;
padding: 5px;
float: left;
font-family: Open Sans, Helvetica,sans-serif;
font-size: 120%;
font-weight: bold;
height: 100%;
text-decoration: none;
width: 100%;
}
div.toc ul li a em {
font-size: 500%;
}
div.toc ul li:hover {
opacity: 0.7;
}
address, caption, cite, code, dfn, em, strong, th, var {
font-style: normal;
font-weight: bold;
letter-spacing: -0.1em;
opacity: 0.5;
padding-right: 0.2em;
}
.toc .tiles li:nth-child(1) {
width: 600px;
}
.toc .tiles li:nth-child(1) a {
background-color: #6C9842;
}
.toc .tiles li:nth-child(2) {
width: 200px;
}
.toc .tiles li:nth-child(2) a {
background-color: #D6487E;
}
.toc .tiles li:nth-child(3) {
height: 400px;
width: 200px;
}
.toc .tiles li:nth-child(3) a {
background-color: #FFB752;
}
.toc .tiles li:nth-child(4), .toc .tiles li:nth-child(5) {
width: 300px;
}
.toc .tiles li:nth-child(4) a, .toc .tiles li:nth-child(5) a {
background-color: #7B68AF;
}
.toc .tiles li:nth-child(6), .toc .tiles li:nth-child(7), .toc .tiles li:nth-child(8) {
width: 200px;
}
.toc .tiles li:nth-child(6) a, .toc .tiles li:nth-child(7) a, .toc .tiles li:nth-child(8) a {
background-color: #A0A0A0;
}
.toc .tiles li:nth-child(9), .toc .tiles li:nth-child(10), .toc .tiles li:nth-child(11), .toc .tiles li:nth-child(12) {
width: 200px;
}
.toc .tiles li:nth-child(9) a, .toc .tiles li:nth-child(10) a, .toc .tiles li:nth-child(11) a, .toc .tiles li:nth-child(12) a {
background-color: #6FB3E0;
}
@media (max-width: 915px) {
div.container {
max-width: 720px;
}
div.logo-nav {
margin: 0 5px;
}
div.logo-nav h1 {
font-size: 180%;
}
div.logo-nav .compass_logo {
height: 2.2em;
width: 9em;
}
div.toc {
float: left;
max-width: 720px;
}
div.toc ul li {
height: 160px;
overflow: hidden;
padding: 8px;
width: 704px;
}
div.toc ul li a {
font-size: 110%;
padding: 10px 8px;
}
.toc .tiles li:nth-child(1) {
width: 704px;
}
.toc .tiles li:nth-child(2) {
float: right;
width: 464px;
}
.toc .tiles li:nth-child(3), .toc .tiles li:nth-child(4), .toc .tiles li:nth-child(5), .toc .tiles li:nth-child(6), .toc .tiles li:nth-child(7), .toc .tiles li:nth-child(8) {
width: 224px;
}
.toc .tiles li:nth-child(9), .toc .tiles li:nth-child(10), .toc .tiles li:nth-child(11), .toc .tiles li:nth-child(12) {
width: 164px;
}
.toc .tiles li:nth-child(3) {
height: 335px;
}
}
@media (max-width: 755px) {
div.container {
max-width: 600px;
}
div.logo-nav h1 {
font-size: 150%;
}
div.logo-nav .compass_logo {
height: 2em;
width: 8em;
}
div.toc ul li {
height: 100px;
overflow: hidden;
padding: 7px;
width: 586px;
}
div.toc ul li a {
font-size: 100%;
padding: 7px 6px;
}
div.toc ul li a em {
font-size: 300%;
}
.toc .tiles li:nth-child(1) {
width: 586px;
}
.toc .tiles li:nth-child(2) {
width: 586px;
}
.toc .tiles li:nth-child(3), .toc .tiles li:nth-child(4), .toc .tiles li:nth-child(5) {
width: 286px;
}
.toc .tiles li:nth-child(6), .toc .tiles li:nth-child(7), .toc .tiles li:nth-child(8) {
width: 186px;
}
.toc .tiles li:nth-child(9), .toc .tiles li:nth-child(10), .toc .tiles li:nth-child(11), .toc .tiles li:nth-child(12) {
width: 286px;
}
.toc .tiles li:nth-child(3) {
height: 213px;
}
}
@media (max-width: 635px) {
div.container {
margin: 2em auto;
max-width: 314px;
}
div.logo-nav .compass_logo {
height: 2em;
width: 15em;
}
div.toc ul li {
height: 100px;
overflow: hidden;
padding: 3px;
width: 308px;
}
div.toc ul li a {
font-size: 80%;
padding: 3px;
}
.toc .tiles li:nth-child(1) {
width: 308px;
}
.toc .tiles li:nth-child(2) {
width: 308px;
}
.toc .tiles li:nth-child(3), .toc .tiles li:nth-child(4), .toc .tiles li:nth-child(5) {
width: 151px;
}
.toc .tiles li:nth-child(6), .toc .tiles li:nth-child(7), .toc .tiles li:nth-child(8) {
width: 98.33px;
}
.toc .tiles li:nth-child(9), .toc .tiles li:nth-child(10), .toc .tiles li:nth-child(11), .toc .tiles li:nth-child(12) {
width: 151px;
}
.toc .tiles li:nth-child(3) {
height: 205px;
}
}
.chosen-container-multi .chosen-choices{
border-radius: 5px;
}
.chosen-container-active .chosen-choices{
border: 1px solid orange;
border-radius: 5px;
}

1068
v2.5/assets/css/style.css Normal file

File diff suppressed because it is too large Load Diff

BIN
v2.5/assets/img/README.md Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
v2.5/assets/img/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
v2.5/assets/img/header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
v2.5/assets/img/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
v2.5/assets/img/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
v2.5/assets/img/network.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
v2.5/assets/img/review.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
v2.5/assets/img/router.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
v2.5/assets/img/server.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
v2.5/assets/img/server1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
v2.5/assets/img/switch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
v2.5/assets/img/switch1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

148
v2.5/data/adapter_config Normal file
View File

@ -0,0 +1,148 @@
{
"os_config": {
"centos" : {
"global": {
"general": {
"_self": {
"display": "General"
},
"http_proxy": {
"display": "HTTP Proxy",
"ftype": "string",
"description": "help text"
},
"local_repo": {
"display": "Local Repo",
"ftype": "string",
"description": "help text"
},
"ntp_proxy": {
"display": "NTP Server",
"ftype": "string",
"description": "help text"
},
"dns_servers": {
"display": "DNS Servers",
"ftype": "string",
"description": "help text"
},
"search_path": {
"display": "Search Path",
"ftype": "string",
"description": "help text"
},
"domain": {
"display": "Domain",
"ftype": "string",
"description": "help text"
},
"gateway": {
"display": "Gateway",
"ftype": "string",
"description": "help text"
},
"timezone": {
"display": "Timezone",
"ftype": "string",
"description": "help text"
},
"language": {
"display": "Language",
"ftype": "string",
"description": "help text"
}
},
"subnetwork": {
"_self": {
"display": "Subnetwork"
}
},
"routing_table": {
"_self": {
"display": "Routing Table"
}
}
},
"security": {
"_self": {
"display": "Server Credentials",
"description": "The default administrator user name and password for each server",
"type": "table"
},
"columns": {
"1": {
"name": "username",
"display": "Username"
},
"2": {
"name": "password",
"display": "Password",
"type": "password"
}
}
},
"partition": {
},
"server_credentials": {
}
}
},
"adapter_config": {
"security": {
"_self": {
"display": "Security"
},
"service_credentials": {
"_self": {
"display": "OpenStack Service Credentials",
"description": "Username and password for all of the OpenStack services",
"type": "table"
},
"fields": [{
"name": "service",
"display": "Service",
"ftype": "string",
"is_required": true
}, {
"name": "username",
"display": "Username",
"ftype": "string",
"is_required": true
}, {
"name": "password",
"display": "Password",
"ftype": "password",
"is_required": true
}]
},
"management_console_credentials": {
"_self": {
"display": "OpenStack Management Console Credentials",
"description": "Username and password for the OpenStack management console",
"type": "table"
},
"fields": [{
"name": "service",
"display": "Service",
"ftype": "string",
"is_required": true
}, {
"name": "username",
"display": "Username",
"ftype": "string",
"is_required": true
}, {
"name": "password",
"display": "Password",
"ftype": "password",
"is_required": true
}]
}
},
"network_mapping": {
}
}
}

474
v2.5/data/config.json Normal file
View File

@ -0,0 +1,474 @@
{
"openstack": {
"cluster": {
"id": 1,
"name": "demo",
"adapter_id": 1,
"os_id": 1
},
"partition": {
"/var": {
"percentage": 30,
"max_size": "10G"
},
"/usr": {
"percentage": 30,
"max_size": "20G"
}
},
"interface": {
"eth0": {
"subnet_id": 1,
"is_mgmt": true,
"is_promiscuous": false
},
"eth1": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": true
},
"eth2": {
"subnet_id": 1,
"is_mgmt": false,
"is_promiscuous": false
},
"eth3": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": false
}
},
"general": {
"timezone": "America/Los_Angeles",
"language": "en",
"http_proxy": "",
"https_proxy": "",
"no_proxy": [""],
"ntp_server": "",
"dns_servers": [""],
"search_path": ["ods.com"],
"domain": "ods.com",
"default_gateway": "10.145.88.1",
"local_repo": ""
},
"server_credentials": {
"username": "",
"password": ""
},
"service_credentials": {
"rabbitmq": {
"username": "guest",
"password": "guest"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"identity": {
"username": "keystone",
"password": "keystone"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"mysql": {
"username": "root",
"password": "root"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"console_credentials": {
"admin": {
"username": "admin",
"password": "admin"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"network": {
"username": "quantum",
"password": "quantum"
},
"object-store": {
"username": "swift",
"password": "swift"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"network_mapping": {
"management": "",
"tenant": "",
"storage": "",
"external": ""
}
},
"openstack_ceph": {
"cluster": {
"id": 1,
"name": "demo",
"adapter_id": 1,
"os_id": 1
},
"partition": {
"/var": {
"percentage": 30,
"max_size": "10G"
},
"/usr": {
"percentage": 30,
"max_size": "20G"
}
},
"interface": {
"eth0": {
"subnet_id": 1,
"is_mgmt": true,
"is_promiscuous": false
},
"eth1": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": true
},
"eth2": {
"subnet_id": 1,
"is_mgmt": false,
"is_promiscuous": false
},
"eth3": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": false
}
},
"general": {
"timezone": "America/Los_Angeles",
"language": "en",
"http_proxy": "",
"https_proxy": "",
"no_proxy": [""],
"ntp_server": "",
"dns_servers": [""],
"search_path": ["ods.com"],
"domain": "ods.com",
"default_gateway": "10.145.88.1",
"local_repo": ""
},
"server_credentials": {
"username": "",
"password": ""
},
"service_credentials": {
"rabbitmq": {
"username": "guest",
"password": "guest"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"identity": {
"username": "keystone",
"password": "keystone"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"mysql": {
"username": "root",
"password": "root"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"console_credentials": {
"admin": {
"username": "admin",
"password": "admin"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"network": {
"username": "quantum",
"password": "quantum"
},
"object-store": {
"username": "swift",
"password": "swift"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"network_mapping": {
"management": "",
"tenant": "",
"storage": "",
"external": "",
"public_network": "",
"cluster_network": ""
},
"ceph_config": {
"global_config": {
"osd_pool_pg_num": "1024",
"osd_pool_pgp_num": "1024",
"osd_pool_size": "3"
},
"osd_config": {
"journal_size": "10000",
"op_threads": 10
}
}
},
"os_only": {
"cluster": {
"id": 1,
"name": "demo",
"adapter_id": 1,
"os_id": 1
},
"partition": {
"/var": {
"percentage": 30,
"max_size": "10G"
},
"/usr": {
"percentage": 30,
"max_size": "20G"
}
},
"interface": {
"eth0": {
"subnet_id": 1,
"is_mgmt": true,
"is_promiscuous": false
},
"eth1": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": true
},
"eth2": {
"subnet_id": 1,
"is_mgmt": false,
"is_promiscuous": false
},
"eth3": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": false
}
},
"general": {
"timezone": "America/Los_Angeles",
"language": "en",
"http_proxy": "",
"https_proxy": "",
"no_proxy": [""],
"ntp_server": "",
"dns_servers": [""],
"search_path": ["ods.com"],
"domain": "ods.com",
"default_gateway": "10.145.88.1",
"local_repo": ""
},
"server_credentials": {
"username": "",
"password": ""
}
},
"ceph_firefly": {
"cluster": {
"id": 1,
"name": "demo",
"adapter_id": 1,
"os_id": 1
},
"partition": {
"/var": {
"percentage": 30,
"max_size": "10G"
},
"/usr": {
"percentage": 30,
"max_size": "20G"
}
},
"interface": {
"eth0": {
"subnet_id": 1,
"is_mgmt": true,
"is_promiscuous": false
},
"eth1": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": true
},
"eth2": {
"subnet_id": 1,
"is_mgmt": false,
"is_promiscuous": false
},
"eth3": {
"subnet_id": 2,
"is_mgmt": false,
"is_promiscuous": false
}
},
"general": {
"timezone": "America/Los_Angeles",
"language": "en",
"http_proxy": "",
"https_proxy": "",
"no_proxy": [""],
"ntp_server": "",
"dns_servers": [""],
"search_path": ["ods.com"],
"domain": "ods.com",
"default_gateway": "10.145.88.1",
"local_repo": ""
},
"server_credentials": {
"username": "",
"password": ""
},
"service_credentials": {
"rabbitmq": {
"username": "guest",
"password": "guest"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"identity": {
"username": "keystone",
"password": "keystone"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"mysql": {
"username": "root",
"password": "root"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"console_credentials": {
"admin": {
"username": "admin",
"password": "admin"
},
"compute": {
"username": "nova",
"password": "nova"
},
"dashboard": {
"username": "dashboard",
"password": "dashboard"
},
"image": {
"username": "glance",
"password": "glance"
},
"metering": {
"username": "ceilometer",
"password": "ceilometer"
},
"network": {
"username": "quantum",
"password": "quantum"
},
"object-store": {
"username": "swift",
"password": "swift"
},
"volume": {
"username": "cinder",
"password": "cinder"
}
},
"network_mapping": {
"public_network": "",
"cluster_network": ""
},
"ceph_config": {
"global_config": {
"osd_pool_pg_num": "1024",
"osd_pool_pgp_num": "1024",
"osd_pool_size": "3"
},
"osd_config": {
"journal_size": "10000",
"op_threads": 10
}
}
}
}

View File

@ -0,0 +1,237 @@
{
"showall": [{
"title": "Host MAC Addr",
"field": "mac",
"visible": true
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Clusters",
"field": "clusters",
"visible": true
}, {
"title": "OS",
"field": "os_name",
"visible": true
}, {
"title": "OS Reinstall",
"field": "os_installed",
"visible": true
}, {
"title": "State",
"field": "state",
"visible": true
}],
"showless": [{
"title": "Host MAC Addr",
"field": "mac",
"visible": true
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Clusters",
"field": "clusters",
"visible": false
}, {
"title": "OS",
"field": "os_name",
"visible": false
}, {
"title": "State",
"field": "state",
"visible": false
}],
"review": [{
"title": "Host MAC Addr",
"field": "mac",
"visible": true
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Clusters",
"field": "clusters",
"visible": false
}, {
"title": "OS",
"field": "os_name",
"visible": false
}, {
"title": "OS Reinstall",
"field": "os_installed",
"visible": false
}, {
"title": "Roles",
"field": "roles",
"visible": true
}, {
"title": "State",
"field": "state",
"visible": false
}],
"progress": [{
"title": "Host MAC Addr",
"field": "mac",
"visible": false
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "Mgmt IP",
"field": "ip",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Clusters",
"field": "clusters",
"visible": false
}, {
"title": "OS",
"field": "os_name",
"visible": false
}, {
"title": "Roles",
"field": "roles",
"visible": false
}],
"machines_hosts": [{
"title": "Host MAC Addr",
"field": "mac",
"visible": true
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Clusters",
"field": "clusters",
"visible": false
}, {
"title": "OS",
"field": "os_name",
"visible": true
}, {
"title": "State",
"field": "state",
"visible": false
}, {
"title": "Date Created",
"field": "created_at",
"visible": true
}, {
"title": "Date Updated",
"field": "updated_at",
"visible": true
}],
"machines": [{
"title": "MAC Addr",
"field": "mac",
"visible": true
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "VLAN",
"field": "vlan",
"visible": false
}, {
"title": "Date Created",
"field": "created_at",
"visible": true
}, {
"title": "Date Updated",
"field": "updated_at",
"visible": true
}],
"roles": [{
"title": "MAC Addr",
"field": "mac",
"visible": false
}, {
"title": "Switch IP",
"field": "switch_ip",
"visible": true
}, {
"title": "Port",
"field": "port",
"visible": true
}, {
"title": "Hostname",
"field": "hostname",
"visible": true
}, {
"title": "Roles",
"field": "roles",
"visible": true
}]
}

View File

@ -0,0 +1,31 @@
[{
"name": "cluster.monitoring.overview",
"url": "/overview",
"display": "Overview",
"controller": "",
"templateUrl": ""
}, {
"name": "cluster.monitoring.topology",
"url": "/topology",
"display": "Topologies",
"controller": "",
"templateUrl": ""
}, {
"name": "cluster.monitoring.alerts",
"url": "/alerts",
"display": "Alerts",
"controller": "",
"templateUrl": ""
}, {
"name": "cluster.monitoring.metrics",
"url": "/metrics",
"display": "Metrics",
"controller": "",
"templateUrl": ""
}, {
"name": "cluster.monitoring.charts",
"url": "/charts",
"display": "Dashboards",
"controller": "",
"templateUrl": ""
}]

34
v2.5/data/timezone.json Normal file
View File

@ -0,0 +1,34 @@
[{
"value": "America/New_York",
"timezone": "New York"
}, {
"value": "America/Chicago",
"timezone": "Chicago"
}, {
"value": "America/Los_Angeles",
"timezone": "Los Angeles"
}, {
"value": "Asia/Shanghai",
"timezone": "Beijing, Guangdong, Shanghai"
}, {
"value": "Asia/Tokyo",
"timezone": "Tokyo"
}, {
"value": "Europe/Paris",
"timezone": "Paris"
}, {
"value": "Europe/London",
"timezone": "London"
}, {
"value": "Europe/Moscow",
"timezone": "Moscow"
}, {
"value": "Europe/Rome",
"timezone": "Rome"
}, {
"value": "Europe/Madrid",
"timezone": "Madrid"
}, {
"value": "Europe/Berlin",
"timezone": "Berlin"
}]

121
v2.5/data/wizard_steps.json Normal file
View File

@ -0,0 +1,121 @@
{
"os_and_ts": [{
"id": 1,
"name": "sv_selection",
"title": "Server Selection",
"state": "active",
"template": "src/app/partials/server_selection.tpl.html",
"description": "Select the servers you want to use for your target system(s)"
}, {
"id": 2,
"name": "os_global",
"title": "OS Global Config",
"state": "",
"template": "src/app/partials/global.tpl.html",
"description": ""
}, {
"id": 3,
"name": "network",
"title": "Network",
"state": "",
"template": "src/app/partials/network.tpl.html",
"description": ""
}, {
"id": 4,
"name": "partition",
"title": "Partition",
"state": "",
"template": "src/app/partials/partition.tpl.html",
"description": ""
}, {
"id": 5,
"name": "package_config",
"title": "Target System Config",
"state": "",
"template": "src/app/partials/package_config.tpl.html",
"description": ""
}, {
"id": 6,
"name": "role_assign",
"title": "Role Assignment",
"state": "",
"template": "src/app/partials/role_assignment.tpl.html",
"description": ""
}, {
"id": 7,
"name": "network_mapping",
"title": "Network Mapping",
"state": "",
"template": "src/app/partials/network_mapping.tpl.html",
"description": ""
}, {
"id": 8,
"name": "review",
"title": "Review",
"state": "",
"template": "src/app/partials/review.tpl.html",
"description": "Click a section title to navigate back to that page."
}],
"os": [{
"id": 1,
"name": "sv_selection",
"title": "Server Selection",
"state": "active",
"template": "src/app/partials/server_selection.tpl.html",
"description": "Select the servers you want to use for your targer system(s)"
}, {
"id": 2,
"name": "os_global",
"title": "OS Global Config",
"state": "",
"template": "src/app/partials/global.tpl.html",
"description": ""
}, {
"id": 3,
"name": "network",
"title": "Network",
"state": "",
"template": "src/app/partials/network.tpl.html",
"description": ""
}, {
"id": 4,
"name": "partition",
"title": "Partition",
"state": "",
"template": "src/app/partials/partition.tpl.html",
"description": ""
}, {
"id": 5,
"name": "review",
"title": "Review",
"state": "",
"template": "src/app/partials/review.tpl.html",
"description": "Click a section title to navigate back to that page."
}],
"ts": [{
"id": 1,
"title": "Server Selection",
"state": "active",
"template": "templates/server_selection.html"
}, {
"id": 2,
"title": "Security",
"state": "",
"template": "templates/security.html"
}, {
"id": 3,
"title": "Role Assignment",
"state": "",
"template": "templates/role_assignment.html"
}, {
"id": 4,
"title": "Network Mapping",
"state": "",
"template": "templates/network_mapping.html"
}, {
"id": 5,
"title": "Review",
"state": "",
"template": "templates/review.html"
}]
}

42
v2.5/index.html Normal file
View File

@ -0,0 +1,42 @@
<!doctype html>
<html11>
<head>
<title>Compass</title>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0" name="viewport">
<link rel="stylesheet" type="text/css" href="vendor/bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="vendor/font-awesome/css/font-awesome.min.css" />
<link rel="stylesheet" type="text/css" href="vendor/nvd3/nv.d3.min.css">
<link rel="stylesheet" type="text/css" href="vendor/angular-ui-tree/angular-ui-tree.min.css">
<link rel="stylesheet" type="text/css" href="assets/css/compass.min.css">
<!-- <link rel="stylesheet" type="text/css" href="assets/css/ace.min.css">
<link rel="stylesheet" type="text/css" href="assets/css/ace-skins.min.css">
<link rel="stylesheet" type="text/css" href="assets/css/ace-fonts.css" />
<link rel="stylesheet" type="text/css" href="assets/css/style.css">
<link rel="stylesheet" type="text/css" href="assets/css/chart.css">
<link rel="stylesheet" type="text/css" href="assets/css/chosen.css">
<link rel="stylesheet" type="text/css" href="assets/css/shelf.css"> -->
<link rel="stylesheet" type="text/css" href="vendor/angular-daterangepicker/daterangepicker-bs3.css">
<script data-main="src/main.js" src="vendor/require.js"></script>
</head>
<body ng-controller="appController">
<div ng-if="isAuthenticated">
<div ng-controller="topnavCtrl">
<div ng-include="'src/app/partials/topnav.tpl.html'"></div>
</div>
</div>
<div class="main-container no-skin">
<div ui-view></div>
</div>
</body>
</html>

23
v2.5/package.json Normal file
View File

@ -0,0 +1,23 @@
{
"name": "compass-web",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {},
"devDependencies": {
"coffee-script": "^1.8.0",
"grunt": "^0.4.5",
"grunt-coffeelint": "0.0.13",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-coffee": "^0.12.0",
"grunt-contrib-copy": "^0.7.0",
"grunt-contrib-cssmin": "^0.12.1",
"grunt-contrib-htmlmin": "^0.4.0",
"grunt-contrib-uglify": "^0.7.0",
"grunt-contrib-watch": "^0.6.1"
}
}

168
v2.5/src/app/app.coffee Executable file
View File

@ -0,0 +1,168 @@
define(['angular'
'uiRouter'
'angularTable'
'uiBootstrap'
'angularDragDrop'
'app/controllers/all'
'app/services/all'
# 'app/server/appDev'
'app/factory/all'
'app/directives/all'
],
(ng)->
'use strict'
ng.module "compass",['ui.router'
'ngTable'
'ui.bootstrap'
'ngDragDrop'
'compass.controllers'
'compass.services'
'compass.factories'
'compass.directives'
# 'compassAppDev'
]
.config ['$stateProvider','$urlRouterProvider', '$httpProvider', ($stateProvider, $urlRouterProvider, $httpProvider) ->
$stateProvider
.state 'login',
url:'/login'
controller: 'loginCtrl'
templateUrl:'src/app/partials/login.tpl.html'
requireAuthenticated: false
.state 'clusterList',
url:'/clusterList'
controller: 'clustersListCtrl'
templateUrl:'src/app/partials/cluster-all.tpl.html'
requireAuthenticated: true
resolve:
allClusterData: ['$q', 'clusterService', ($q, clusterService) ->
deferred = $q.defer()
clusterService.getClusters().success (data) ->
deferred.resolve(data)
return deferred.promise
]
.state 'wizard',
url: '/wizard/{id}?config'
controller: 'wizardCtrl'
templateUrl: 'src/app/partials/wizard.tpl.html'
requireAuthenticated: true
resolve:
clusterData: ['$stateParams', '$q', 'wizardService', ($stateParams, $q, wizardService) ->
clusterId = $stateParams.id
deferred = $q.defer()
wizardService.getClusterById(clusterId).success (data) ->
deferred.resolve(data)
return deferred.promise;
]
machinesHostsData: ['$q', 'wizardService', ($q, wizardService) ->
deferred = $q.defer()
wizardService.getAllMachineHosts().success (data) ->
deferred.resolve(data)
return deferred.promise
]
wizardStepsData: ['$q', 'wizardService', ($q, wizardService) -> # get the create-cluster-wizard steps
deferred = $q.defer()
wizardService.getWizardSteps().success((data) ->
deferred.resolve(data)
);
return deferred.promise
]
clusterConfigData: ['$stateParams', '$q', 'wizardService', ($stateParams, $q, wizardService) ->
clusterId = $stateParams.id
deferred = $q.defer()
wizardService.getClusterConfig(clusterId).success((data) ->
deferred.resolve(data)
)
return deferred.promise
]
adaptersData: ['$q', 'wizardService', ($q, wizardService) ->
deferred = $q.defer();
wizardService.getAdapters().success((data) ->
deferred.resolve(data);
)
return deferred.promise;
]
.state 'cluster',
url: '/cluster/{id}'
templateUrl: 'src/app/partials/cluster.tpl.html'
requireAuthenticated: true
resolve:
clusterhostsData: ['$stateParams', '$q', 'clusterService', ($stateParams, $q, clusterService) ->
clusterId = $stateParams.id
deferred = $q.defer()
clusterService.getClusterHosts(clusterId).success (data) ->
deferred.resolve(data)
return deferred.promise
]
.state 'cluster.overview',
url: '/overview'
controller: 'clusterProgressCtrl'
templateUrl: 'src/app/partials/cluster-overview.tpl.html'
requireAuthenticated: true
.state 'cluster.config',
url: '/config'
controller: 'configurationCtrl'
templateUrl: 'src/app/partials/cluster-config.tpl.html'
requireAuthenticated: true
.state 'cluster.config.security',
url: '/security'
templateUrl: 'src/app/partials/cluster-security.tpl.html'
requireAuthenticated: true
.state 'cluster.config.network',
url: '/network'
templateUrl: 'src/app/partials/cluster-network.tpl.html'
requireAuthenticated: true
.state 'cluster.config.partition',
url: '/partition'
templateUrl: 'src/app/partials/cluster-partition.tpl.html'
requireAuthenticated: true
.state 'cluster.config.roles',
url: '/roles'
templateUrl: 'src/app/partials/cluster-roles.tpl.html'
requireAuthenticated: true
.state 'serverList',
url: '/serverlist'
controller: 'serverCtrl'
templateUrl: 'src/app/partials/server-list.tpl.html'
requireAuthenticated: true
resolve:
machinesHostsData: ['$q', 'dataService', ($q, dataService) ->
deferred = $q.defer()
dataService.getAllMachineHosts().success (data) ->
deferred.resolve(data)
return deferred.promise
]
.state 'userSetting',
url: '/userSetting'
controller: 'userSettingCtrl'
templateUrl: 'src/app/partials/user-setting.html'
requireAuthenticated: true
resolve:
userSettingData:['$q', 'userService', ($q, userService) ->
deferred = $q.defer()
userService.getUserSetting().success (data) ->
deferred.resolve(data)
return deferred.promise
]
userLogData:['$q', 'userService', ($q, userService) ->
deferred = $q.defer()
userService.getUserLog().success (data) ->
deferred.resolve(data)
return deferred.promise
]
$urlRouterProvider.otherwise('/clusterList')
$httpProvider.interceptors.push('errorhandlingInterceptor')
]
.run ['$rootScope', '$state', 'userFactory', 'authService', ($rootScope, $state, userFactory, authService) ->
$rootScope.$on "$stateChangeStart", (event, toState, toParams, fromState, fromParams) ->
if toState.requireAuthenticated and !userFactory.getAuthenticationStatus()
if authService.getCookie("isAuthenticated")
userFactory.login()
else
$state.transitionTo("login")
event.preventDefault()
]
)

View File

@ -0,0 +1,10 @@
define([
'./appController'
'./loginController'
'./clusterController'
'./wizardController'
'./topnavController'
'./serverController'
'./modalControllers'
'./userController'
])

View File

@ -0,0 +1,26 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'appController', ['$scope', '$state', 'authService', 'userFactory',
($scope, $state, authService, userFactory) ->
$scope.isAuthenticated = false
$scope.$watch( ->
return userFactory.isAuthenticated
,(val) ->
$scope.isAuthenticated = userFactory.isAuthenticated
)
$scope.logout = ->
authService.logout().success (data) ->
authService.setCookies("isAuthenticated", false, -30)
userFactory.logout()
$state.transitionTo("login")
# $scope.$on "newClusters", (event, data) ->
# $scope.$broadcast('newClusters', data)
]
);

View File

@ -0,0 +1,12 @@
define(['angular'
'uiRouter'
'angularTable'
'uiBootstrap'
'angularDragDrop'
'ngSpinner'
'ngBsDaterangepicker'
], (ng)->
'use strict';
ng.module('compass.controllers', ['ui.router','ngTable','ui.bootstrap','ngDragDrop', 'angularSpinner', 'ngBootstrap']);
);

View File

@ -0,0 +1,94 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'clustersListCtrl', ['$scope', 'clusterService', '$state', '$filter', 'ngTableParams', '$modal', 'allClusterData',
($scope, clusterService, $state, $filter, ngTableParams, $modal, allClusterData) ->
$scope.state = $state
clusterService.getClustersProgress(allClusterData)
$scope.clusters = allClusterData
data = $scope.clusters
$scope.tableParams = new ngTableParams({
page: 1
count: 10
},
{
total: data.length
getData: ($defer, params) ->
orderedData = if params.sorting() then $filter('orderBy')(data, params.orderBy()) else data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
)
$scope.goToCluster = (id, state) -> clusterService.goToCluster(id, state)
]
.controller 'createClusterCtrl', ['$scope','clusterService','$modal',
($scope, clusterService, $modal)->
clusterService.getAdapters($scope)
$scope.open = () ->
$scope.cluster = {}
modalInstance = $modal.open(
templateUrl: 'src/app/partials/modalClusterCreate.tpl.html'
controller: 'newClusterModalCtrl'
resolve:
allAdapters: ->
return $scope.allAdapters
cluster: ->
return $scope.cluster
)
modalInstance.result.then( (cluster)->
$scope.cluster = cluster
postClusterData =
"name": cluster.name
"adapter_id": cluster.adapter.id
"os_id": cluster.os.id
postClusterData.flavor_id = cluster.flavor.id if cluster.flavor
clusterService.createCluster($scope, postClusterData)
->
console.log("dismiss")
)
]
.controller 'newClusterModalCtrl', ['$scope', '$log','$modalInstance','allAdapters','cluster',
($scope, $log, $modalInstance, allAdapters, cluster)->
$scope.allAdapters = allAdapters
$scope.cluster = cluster
$scope.updateSelectedAdapter = ->
for adapter in $scope.allAdapters
if adapter.id == $scope.cluster.adapter.id
$scope.supported_oses = adapter.supported_oses
$scope.flavors = adapter.flavors
$scope.cancel = ->
$modalInstance.dismiss('cancel')
$scope.ok = ->
$scope.result = 'ok'
$modalInstance.close($scope.cluster)
]
.controller 'clusterProgressCtrl', ['$scope','clusterService', '$stateParams', 'clusterhostsData',
($scope, clusterService, $stateParams, clusterhostsData) ->
clusterService.clusterProgressInit($scope, clusterhostsData, $stateParams)
clusterService.displayDataInTable($scope, $scope.hosts)
$scope.selectAllServers = (flag) ->
if flag
sv.selected = true for sv in $scope.hosts
else
sv.selected = false for sv in $scope.hosts
]
.controller 'configurationCtrl', ['$scope','clusterService','$modal', '$stateParams', 'clusterhostsData',
($scope, clusterService, $modal, $stateParams, clusterhostsData) ->
clusterService.configurationInit($scope, $stateParams, clusterhostsData)
clusterService.displayDataInTable($scope, $scope.hosts)
# clusterService.getClusterConfig(clusterId).success (data) ->
# console.log(data)
]
)

View File

@ -0,0 +1,20 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'loginCtrl', ['$scope', '$state', 'authService', 'userFactory',
($scope, $state, authService, userFactory) ->
$scope.alerts = []
$scope.login = ->
credentials =
"email": $scope.email
"password": $scope.password
"remember": Boolean($scope.remember)
authService.login(credentials).success (data) ->
authService.setCookies("isAuthenticated", true,0.0833,Boolean($scope.remember))
userFactory.login()
$state.transitionTo("clusterList")
.error (response) ->
$scope.alerts.push(response)
]
)

View File

@ -0,0 +1,67 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'modifySwitchModalCtrl', ['$scope','$modalInstance','wizardService', 'targetSwitch', ($scope, $modalInstance, wizardService, targetSwitch) ->
$scope.targetSwitch = angular.copy(targetSwitch)
$scope.ok = ->
$scope.alerts = []
updatedSwitch =
ip : $scope.targetSwitch.ip
filters: $scope.targetSwitch.filters
credentials: $scope.targetSwitch.credentials
wizardService.putSwitches(targetSwitch.id, updatedSwitch).success (data) ->
$modalInstance.close(data)
.error (response)->
$scope.alerts[0] = response
$scope.cancel = ->
$modalInstance.dismiss('cancel')
]
.controller 'addSubnetModalInstanceCtrl',['$scope','$modalInstance','wizardService','subnets',
($scope, $modalInstance, wizardService, subnets) ->
$scope.subnetworks = angular.copy(subnets)
$scope.subnetAllValid = true
subnet['valid'] = true for subnet in $scope.subnetworks
if $scope.subnetworks.length is 0
$scope.subnetworks.push({valid:false})
$scope.addSubnetwork = ->
$scope.subnetworks.push({valid:false})
wizardService.validateAllSubnets($scope)
$scope.removeSubnetwork = (index) ->
wizardService.deleteSubnet($scope, index, $scope.subnetworks[index].id)
wizardService.validateAllSubnets($scope)
$scope.subnet_change = (index, subnet) ->
subnetRegExp = /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(\/){1}([0-9]|[0-2][0-9]|3[0-2])$/
$scope.subnetworks[index]['valid'] = subnetRegExp.test(subnet)
wizardService.validateAllSubnets($scope)
$scope.ok = ->
wizardService.subnetCommit($scope, $modalInstance)
$scope.cancel = ->
$modalInstance.dismiss('cancel')
]
.controller 'errorMessageCtrl', ['$scope','$modalInstance','title', 'content', ($scope, $modalInstance, title, content) ->
$scope.title = title
$scope.content = content
$scope.cancel = ->
$modalInstance.dismiss('cancel')
]
.controller 'userModalCtrl', ['$scope', '$modalInstance','newUser', ($scope, $modalInstance, newUser) ->
$scope.newUser = newUser
$scope.ok = ->
$scope.result = 'ok'
$modalInstance.close($scope.newUser)
$scope.cancel = ->
$modalInstance.dismiss('cancel')
]
);

View File

@ -0,0 +1,30 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'serverCtrl', [ '$scope', 'dataService', '$filter', 'machinesHostsData', 'wizardService',
($scope, dataService, $filter, machinesHostsData, wizardService) ->
$scope.hideunselected = ''
$scope.search = {}
$scope.allservers = machinesHostsData
wizardService.getServerColumns().success (data) ->
$scope.server_columns = data.machines_hosts
wizardService.displayDataInTable($scope, $scope.allservers)
wizardService.watchingTriggeredStep($scope)
$scope.hideUnselected = ->
if $scope.hideunselected then $scope.search.selected = true else delete $scope.search.selected
$scope.ifPreSelect = (server) ->
server.disable = false
if server.clusters
server.disabled = true if server.clusters.length > 0
for svCluster in server.clusters
if svCluster.id == $scope.cluster.id
server.selected = true
server.disabled = false
wizardService.watchAndAddNewServers($scope)
]
)

View File

@ -0,0 +1,17 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'topnavCtrl', [ '$scope', '$state', '$http', 'dataService', '$rootScope', 'wizardFactory'
($scope, $state, $http, dataService, $rootScope, wizardFactory) ->
dataService.getClusters().success (data) ->
$scope.clusters = data
$rootScope.$on 'newClusters', (event, data) ->
$scope.clusters = data
$scope.gotoCluster = (id) ->
dataService.getClusterProgress(id).success (data) ->
if data.state == "UNINITIALIZED" then $state.go("wizard",{"id":id, "config": "true"}) else $state.go("cluster.overview",{"id": id})
]
)

View File

@ -0,0 +1,47 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'userSettingCtrl', ['$scope', '$state', '$filter','$modal','clusterService','userService', 'userSettingData', 'userLogData'
($scope, $state, $filter, $modal, clusterService, userService, userSettingData, userLogData) ->
$scope.userSetting = userSettingData
clusterService.displayDataInTable($scope, userSettingData)
clusterService.displayDataInTable($scope, userLogData, 'userParams')
$scope.newUser = {}
$scope.edit = ->
alert("Edit User?")
$scope.delete = ->
alert("Delete User?")
$scope.open = (size) ->
modalInstance = $modal.open(
templateUrl: 'src/app/partials/modalCreateUserSetting.html'
controller: 'userModalCtrl'
resolve:
newUser: ->
return $scope.newUser
)
modalInstance.result.then( (newUser) ->
$scope.newUser = newUser
userService.createUser(newUser).success (data, status) ->
$scope.userSetting.push(newUser)
$scope.tableParams.reload()
$scope.newUser = {}
, ->
console.log("dismiss")
)
]
.filter 'timeStampFilter', ->
return (items, dateRange) ->
if items != undefined
filtered = []
startDate = dateRange.startDate
endDate = dateRange.endDate
for item in items
standardTime = moment(item.timestamp)
filtered.push(item) if moment(standardTime).isAfter(startDate) and moment(standardTime).isBefore(endDate)
return filtered
)

View File

@ -0,0 +1,271 @@
define(['./baseController'], ()->
'use strict';
angular.module('compass.controllers')
.controller 'wizardCtrl',['$scope', 'wizardService', '$state', '$stateParams', 'clusterData', 'adaptersData', 'machinesHostsData', 'wizardStepsData', 'clusterConfigData',
($scope, wizardService, $state, $stateParams, clusterData, adaptersData, machinesHostsData, wizardStepsData, clusterConfigData) ->
wizardService.wizardInit($scope, $stateParams.id, clusterData, adaptersData, wizardStepsData, machinesHostsData, clusterConfigData)
$scope.skipForward = (nextStepId) ->
console.log("next", nextStepId)
if $scope.currentStep != nextStepId
$scope.pendingStep = nextStepId
wizardService.triggerCommitByStepById($scope,$scope.currentStep ,nextStepId)
$scope.stepControl = (goToPrevious) ->
wizardService.stepControl($scope, goToPrevious)
$scope.stepForward = ->
$scope.pendingStep = $scope.currentStep + 1
wizardService.triggerCommitByStepById($scope,$scope.currentStep ,$scope.pendingStep)
$scope.stepBackward = ->
$scope.pendingStep = $scope.currentStep - 1
wizardService.triggerCommitByStepById($scope,$scope.currentStep ,$scope.pendingStep)
$scope.deploy = ->
wizardService.deploy($scope)
$scope.$on 'loading', (event, data) ->
$scope.loading = data
wizardService.setSubnetworks()
wizardService.watchingCommittedStatus($scope)
]
.controller 'svSelectCtrl', ['$scope', 'wizardService', '$filter', 'ngTableParams'
($scope, wizardService, $filter, ngTableParams) ->
$scope.hideunselected = ''
$scope.search = {}
$scope.cluster = wizardService.getClusterInfo()
$scope.allservers = wizardService.getAllMachinesHost()
wizardService.getServerColumns().success (data) ->
$scope.server_columns = data.showall
wizardService.displayDataInTable($scope, $scope.allservers)
wizardService.watchingTriggeredStep($scope)
$scope.hideUnselected = ->
if $scope.hideunselected then $scope.search.selected = true else delete $scope.search.selected
$scope.ifPreSelect = (server) ->
server.disable = false
if server.clusters
server.disabled = true if server.clusters.length > 0
for svCluster in server.clusters
if svCluster.id == $scope.cluster.id
server.selected = true
server.disabled = false
$scope.selectAllServers = (flag) ->
if flag
sv.selected = true for sv in $scope.allservers when !sv.disabled
else
sv.selected = false for sv in $scope.allservers
#watch and add newly found servers to allservers array
wizardService.watchAndAddNewServers($scope)
$scope.commit = (sendRequest) ->
wizardService.svSelectonCommit($scope)
]
.controller 'globalCtrl', ['$scope', 'wizardService', '$q',
($scope, wizardService, $q) ->
wizardService.globalConfigInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.addValue = (key) ->
$scope.general[key].push("")
$scope.commit = (sendRequest) ->
wizardService.globalCommit($scope,sendRequest)
]
.controller 'networkCtrl', ['$scope', 'wizardService', 'ngTableParams', '$filter', '$modal',
($scope, wizardService, ngTableParams, $filter, $modal) ->
wizardService.networkInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.autoFillManage = ->
$scope.autoFill = !$scope.autoFill;
if $scope.autoFill then $scope.autoFillButtonDisplay = "Disable Autofill" else $scope.autoFillButtonDisplay = "Enable Autofill"
$scope.autofill = (alertFade) ->
for key, value of $scope.interfaces
ip_start = $("#" + key + "-ipstart").val()
interval = parseInt($("#" + key + "-increase-num").val())
wizardService.fillIPBySequence($scope, ip_start, interval, key)
hostname_rule = $("#hostname-rule").val()
wizardService.fillHostname($scope, hostname_rule)
$scope.addInterface = (newInterface) ->
wizardService.addInterface($scope, newInterface)
$scope.deleteInterface = (delInterface) ->
delete $scope.interfaces[delInterface]
delete sv.networks[delInterface] for sv in $scope.servers
$scope.openAddSubnetModal = ->
modalInstance = $modal.open(
templateUrl: "src/app/partials/modalAddSubnet.tpl.html"
controller: "addSubnetModalInstanceCtrl"
resolve:
subnets: ->
return $scope.subnetworks
)
modalInstance.result.then( (subnets) ->
$scope.subnetworks = subnets
wizardService.setSubnetworks($scope.subnetworks)
->
console.log("modal dismissed")
)
$scope.commit = (sendRequest) ->
wizardService.networkCommit($scope, sendRequest)
# display data in the table
wizardService.getClusterHosts($scope.cluster.id).success (data) ->
$scope.servers = data
if $scope.servers[0].networks and Object.keys($scope.servers[0].networks).length != 0
$scope.interfaces = $scope.servers[0].networks
wizardService.setInterfaces($scope.interfaces)
wizardService.displayDataInTable($scope, $scope.servers)
]
.controller 'partitionCtrl', ['$scope', 'wizardService',
($scope, wizardService) ->
wizardService.partitionInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.addPartition = ->
wizardService.addPartition($scope)
$scope.deletePartition = (index) ->
wizardService.deletePartition($scope, index)
$scope.commit = (sendRequest) ->
wizardService.partitionCommit($scope, sendRequest)
$scope.mount_point_change = (index, name) ->
wizardService.mount_point_change($scope, index, name)
$scope.$watch('partitionInforArray', ->
$scope.partitionarray = []
total = 0
for partitionInfo in $scope.partitionInforArray
total += parseFloat(partitionInfo.percentage)
$scope.partitionarray.push(
"name": partitionInfo.name
"number": partitionInfo.percentage
)
$scope.partitionarray.push(
"name": "others"
"number": 100 - total
)
,true
)
]
.controller 'packageConfigCtrl', ['$scope', 'wizardService',
($scope, wizardService) ->
wizardService.targetSystemConfigInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.mSave = ->
$scope.originalMangementData = angular.copy($scope.console_credentials)
$scope.sSave = ->
$scope.originalServiceData = angular.copy($scope.service_credentials)
$scope.mSave()
$scope.sSave()
console.log($scope.console_credentials)
$scope.mEdit = (index) ->
for em, i in $scope.editMgntMode
if i != index
$scope.editMgntMode[i] = false
else
$scope.editMgntMode[i] = true
$scope.mReset()
$scope.mReset = ->
$scope.console_credentials = angular.copy($scope.originalMangementData)
$scope.commit = (sendRequest) ->
wizardService.targetSystemConfigCommit($scope, sendRequest)
]
.controller 'roleAssignCtrl', ['$scope', 'wizardService', '$filter', 'ngTableParams',
($scope, wizardService, $filter, ngTableParams) ->
wizardService.roleAssignInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.selectAllServers = (flag) ->
if flag
sv.checked = true for sv in $scope.servers
else
sv.checked = false for sv in $scope.servers
$scope.assignRole = (role) ->
wizardService.assignRole($scope, role)
$scope.removeRole = (server, role) ->
serverIndex = $scope.servers.indexOf(server)
roleIndex = $scope.servers[serverIndex].roles.indexOf(role)
$scope.servers[serverIndex].roles.splice(roleIndex, 1)
$scope.existingRoles[serverIndex].splice(role_key, 1, role_key) for role_value, role_key in $scope.roles when role.name == $scope.roles[role_key].name
$scope.servers[serverIndex].dropChannel = $scope.existingRoles[serverIndex].toString()
$scope.onDrop = ($event, server) ->
$scope.dragKey = $scope.servers.indexOf(server)
$scope.dropSuccessHandler = ($event, role_value, key) ->
roleExist = wizardService.checkRoleExist($scope.servers[$scope.dragKey].roles, role_value)
if !roleExist
$scope.servers[$scope.dragKey].roles.push(role_value)
else
console.log("role exists")
wizardService.checkExistRolesDrag($scope)
$scope.autoAssignRoles = ->
wizardService.autoAssignRoles($scope)
$scope.commit = (sendRequest)->
wizardService.roleAssignCommit($scope, sendRequest)
wizardService.displayDataInTable($scope, $scope.servers)
]
.controller 'networkMappingCtrl', ['$scope', 'wizardService',
($scope, wizardService) ->
wizardService.networkMappingInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.onDrop = ($event, key) ->
$scope.pendingInterface = key
$scope.dropSuccessHandler = ($event, key, dict) ->
dict[key].mapping_interface = $scope.pendingInterface
$scope.commit = (sendRequest) ->
wizardService.networkMappingCommit($scope, sendRequest)
]
.controller 'reviewCtrl', ['$scope', 'wizardService', 'ngTableParams', '$filter',
($scope, wizardService, ngTableParams, $filter) ->
wizardService.reviewInit($scope)
wizardService.watchingTriggeredStep($scope)
$scope.commit = (sendRequest) ->
wizardService.reviewCommit(sendRequest)
wizardService.displayDataInTable($scope, $scope.servers)
]
)

View File

@ -0,0 +1,7 @@
define([
'./findServerDirective'
'./clusterNavDirective'
'./pieChartDirective'
'./enterDirective'
'./hostprogressbarDirective'
])

View File

@ -0,0 +1,7 @@
define(['angular'
'd3'
], (ng)->
'use strict';
ng.module('compass.directives', []);
);

View File

@ -0,0 +1,23 @@
define(['./baseDirective'], ->
'use strict';
angular.module('compass.directives')
.directive 'clusternav', ['$timeout',
($timeout) ->
return {
restrict: 'EAC'
templateUrl: "src/app/partials/cluster-nav.tpl.html"
# link: (scope, element, attrs) ->
# console.log("inside")
# $timeout( ->
# $('.nav-list ul a').on 'click touchend', (e) ->
# el = $(this)
# link = el.attr('href')
# window.location = link
# ,0)
# element.bind '$destroy', ->
# $('.nav-list ul a').off('click touchend')
}
]
)

View File

@ -0,0 +1,10 @@
define ['./baseDirective'], ->
'use strict';
angular.module('compass.directives')
.directive 'ngEnter', ->
return (scope, element, attrs) ->
element.bind "keydown keypress", (event) ->
if event.which is 13
scope.$eval(attrs.ngEnter) if scope.email.trim() != "" and scope.password.trim() != ""
event.preventDefault()

View File

@ -0,0 +1,115 @@
define(['./baseDirective'], ->
'use strict';
angular.module('compass.directives')
.directive 'findservers', ['wizardService','$modal', (wizardService, $modal) ->
return {
restrict: 'E'
scope: {
newFoundServers: '=results'
}
templateUrl: "src/app/partials/find-new-servers.tpl.html"
link: (scope, element, attrs) ->
scope.switches = []
scope.newFoundServers = []
scope.isFindingNewServers = false
wizardService.getSwitches().success (data) ->
scope.switches = data
scope.findServers = ->
swSelection = false
swSelection = true for sw in scope.switches when sw.selected
triggerToFindServers = (sw) ->
sw.result = ""
sw.finished = false
sw.polling = true
if !swSelection
alert("Please select at least one switch") if !swSelection
else
scope.isFindingNewServers = true
scope.newfoundServers = []
triggerToFindServers sw for sw in scope.switches when sw.selected
scope.$watch('switches', (val) ->
totalResultReady = true
if scope.isFindingNewServers
for sw in scope.switches
if sw.selected and !sw.finished
if sw.result is "success"
scope.newFoundServers = scope.newFoundServers.concat(angular.copy(sw.machines))
sw.finished = true
else if sw.result == "error"
sw.finished = true
else
totalResultReady = false
scope.isFindingNewServers = false if totalResultReady
,true)
scope.newswitch = {}
scope.newswitch.credentials = {}
scope.alerts = []
scope.addSwitch = ->
wizardService.postSwitches(scope.newswitch).success (switchData) ->
scope.switches.push(switchData)
scope.modifySwitchModal = (index) ->
modalInstance = $modal.open(
templateUrl: 'src/app/partials/modalModifySwitch.html'
controller: 'modifySwitchModalCtrl'
resolve:
targetSwitch: ->
return scope.switches[index]
)
modalInstance.result.then (targetSwitch) ->
scope.switches[index] = targetSwitch
, ->
console.log("Modal dismissed")
}
]
.directive 'switchrow', ['wizardService', '$timeout', (wizardService, $timeout) ->
return {
restrict: 'A'
scope:
polling: '='
switchinfo: '='
result: '='
machines: '='
link: (scope, element, attrs) ->
checkSwitchCount = 0
fireTimer = true
getMachines = ->
wizardService.getSwitchMachines(scope.switchinfo.id).success (data) ->
scope.polling = false
scope.result = "success"
scope.machines = data
.error (data)->
scope.polling = false
scope.result = "error"
checkSwitchState = ->
checkSwitchCount++
wizardService.getSwitchById(scope.switchinfo.id).success (data) ->
if data.state is "under_monitoring"
getMachines()
else if data.state is "initialized" or data.state is "repolling"
if fireTimer and checkSwitchCount < 15
checkSwitchTimer = $timeout(checkSwitchState, 2000)
else
scope.polling = false
scope.result = "error"
scope.$watch 'polling', (newval, oldval) ->
if newval is not oldval
if newval is true
checkSwitchCount = 0
wizardService.postSwitchAction(scope.switchinfo.id, {"find_machines": null}).success (data) ->
checkSwitchState()
}
]
)

View File

@ -0,0 +1,45 @@
define ['./baseDirective'], ->
'use strict';
angular.module('compass.directives')
.directive 'hostprogressbar', ['dataService','$timeout', (dataService, $timeout) ->
return {
restrict: 'E'
scope:
hostid: '='
clusterid: '='
clusterstate: '='
progressdata: '@'
templateUrl: "src/app/partials/progressbar.tpl.html"
link: (scope, element, attrs) ->
hostId = scope.hostid
clusterId = scope.clusterid
clusterState = scope.clusterstate
progress = 0
progressTimer = null
fireTimer = true
scope.progressdata = 0
scope.progressSeverity = "INFO"
num = 0
getProgress = ->
dataService.getClusterHostProgress(clusterId, hostId).success (progressData)->
progress = parseInt(eval(progressData.percentage * 100))
scope.progressdata = progress
if fireTimer and progress < 100 and num != 1
progressTimer = $timeout(getProgress, 5000)
scope.message = progressData.message
scope.progressSeverity = progressData.severity
scope.$watch 'clusterstate', (val) ->
if clusterState != "SUCCESSFUL" and clusterState != "ERROR"
$timeout(getProgress, 1000)
else
num = 1
getProgress()
element.bind '$destroy', ->
fireTimer = false
$timeout.cancel(progressTimer)
}
]

View File

@ -0,0 +1,57 @@
define(['./baseDirective'], ->
'use strict';
angular.module('compass.directives')
.directive 'piechart', () ->
return {
restrict: 'E'
scope:
piedata: '='
link: (scope, element, attrs) ->
piedata = scope.piedata
width = 300
height = 250
radius = Math.min(width, height) / 2
color = d3.scale.ordinal().range ["#fee188", "#cb6fd7", "#9abc32", "#f79263", "#6fb3e0", "#d53f40", "#1F77B4"]
svg = d3.select("piechart").append("svg")
.attr("width", width)
.attr("height",height)
.append("g")
.attr("transform","translate(" + width / 2 + "," + height / 2 + ")")
arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(0)
scope.$watch('piedata', (val) ->
piedata = val
svg.selectAll('g.arc').remove()
pie = d3.layout.pie()
.sort(null)
.value (d) ->
return d.number
for d in piedata
d.number = +d.number
g = svg.selectAll(".arc")
.data(pie(piedata))
.enter().append("g")
.attr("class", "arc")
g.append("path")
.attr("d", arc)
.attr('stroke', '#fff')
.attr('stroke-width', '3')
.style("fill", (d) ->
return color(d.data.name)
)
g.append("text")
.attr("transform", (d) ->
return "translate(" + arc.centroid(d) + ")"
)
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text (d) ->
return d.data.name
,true
)
}
)

View File

@ -0,0 +1,5 @@
define([
'./wizardFactory'
'./userFactory'
'./errorHandlingFactory'
])

View File

@ -0,0 +1,6 @@
define(['angular'
], (ng)->
'use strict';
ng.module('compass.factories', [])
);

View File

@ -0,0 +1,19 @@
define(['./baseFactory'], ($q, $location, $injector) ->
'use strict'
angular.module('compass.factories').factory('errorhandlingInterceptor',[ '$q', '$location','$injector', ($q, $location, $injector) ->
return {
response: (response) ->
return response
responseError: (rejection) ->
if rejection.status is 401
console.log("Response Error 401", rejection)
$location.path('/login')
else
if rejection.config.url and rejection.config.url != "/api/users/login"
wizardService = $injector.get('wizardService')
$modal = $injector.get('$modal')
wizardService.showErrorMessage($modal, "ERROR " + rejection.status, rejection.data)
return $q.reject(rejection)
}
])
)

View File

@ -0,0 +1,19 @@
define(['./baseFactory'], () ->
'use strict'
class UserFactory
constructor: () ->
# @username = ""
# @password = ""
@isAuthenticated = false
login: ->
@isAuthenticated = true
logout: ->
@isAuthenticated = false
getAuthenticationStatus: ->
return @isAuthenticated
angular.module('compass.factories').factory('userFactory',[ () -> new UserFactory()])
)

View File

@ -0,0 +1,133 @@
define(['./baseFactory'], () ->
'use strict'
class WizardFactory
constructor: () ->
@cluster = {}
@steps = []
@commit = {}
@servers = []
@allServers = []
@generalConfig = {}
@subnetworks = []
@routingtable = []
@generalConfig = {}
@interfaces = {}
@partition = {}
@server_credentials = {}
@service_credentials = {}
@console_credentials = {}
@network_mapping = {}
@ceph_config = {}
clean: ->
@cluster = {}
@steps = []
@commit = {}
@servers = []
@allServers = []
@generalConfig = {}
@subnetworks = []
@routingtable = []
@generalConfig = {}
@interfaces = {}
@partition = {}
@server_credentials = {}
@service_credentials = {}
@console_credentials = {}
@network_mapping = {}
@ceph_config = {}
preConfig: (config) ->
@setInterfaces(config.interface)
@setGeneralConfig(config.general)
@setPartition(config.partition)
@setServerCredentials(config.server_credentials)
@setServiceCredentials(config.service_credentials)
@setConsoleCredentials(config.console_credentials)
@setNetworkMapping(config.network_mapping)
@setCephConfig(config.ceph_config) if config.ceph_config
setClusterInfo: (cluster) ->
@cluster = cluster
setInterfaces: (interfaces) ->
@interfaces = interfaces
setGeneralConfig: (config) ->
@generalConfig = config
getGeneralConfig: ->
return @generalConfig
setPartition: (partition) ->
@partition = partition
setServerCredentials: (credentials) ->
@server_credentials = credentials
getServerCredentials: ->
return @server_credentials
setServiceCredentials: (credentials) ->
@service_credentials = credentials
setConsoleCredentials: (credentials) ->
@console_credentials = credentials
setNetworkMapping: (mapping) ->
@network_mapping = mapping
setCephConfig: (cephConfig) ->
@ceph_config = cephConfig
getClusterInfo: ->
return @cluster
getAllMachinesHost: ->
return @allServers
setAllMachinesHost: (server) ->
@allServers = server
setSubnetworks: (subnetworks) ->
@subnetworks = subnetworks
getSubnetworks: ->
return @subnetworks
getInterfaces: ->
return @interfaces
getPartition: ->
return @partition
getServiceCredentials: ->
return @service_credentials
getConsoleCredentials: ->
return @console_credentials
getServers: ->
return @servers
getNetworkMapping: ->
return @network_mapping
getCephConfig: ->
return @ceph_config
setCommitState: (commitState) ->
@commit = commitState
getCommitState: ->
return @commit
setServers: (servers) ->
return @servers = servers
angular.module('compass.factories').factory('wizardFactory',[ () -> new WizardFactory()])
)

View File

@ -0,0 +1,72 @@
<div class="col-sm-12 no-padding">
<!--div class="col-lg-3 col-md-4 col-sm-4 col-xs-6 no-padding" style="margin-top:10px" ng-repeat="cluster in clusters | filter:search"-->
<div ng-repeat="cluster in clusters | filter:search" class="pull-left">
<div class="infobox infobox-dark1 action" ng-mouseover="hoverView=true" ng-mouseleave="hoverView=false" ng-class="{'infobox-green': cluster.state == 'SUCCESSFUL', 'infobox-blue': cluster.state == 'INITIALIZED', 'infobox-red': cluster.state == 'ERROR', 'infobox-orange': cluster.state == 'INSTALLING', 'infobox-grey': cluster.state == 'UNINITIALIZED'}" ng-click="goToCluster(cluster.id, cluster.state)">
<div class="infobox-icon pull-left">
<i class="ace-icon fa" ng-class="{'fa-check': cluster.state == 'SUCCESSFUL', ' fa-times': cluster.state == 'ERROR', 'fa-spinner': cluster.state == 'INSTALLING', ' fa-circle-o': cluster.state == 'INITIALIZED', 'fa-gear': cluster.state == 'UNINITIALIZED'}"></i>
</div>
<div class="pull-left">
<span style="font-size: 22px; padding-left: 20px; text-transform: uppercase;font-family:Impact,'Arial Black','Open-Sans', sans-serif; width:200px; overflow: hidden; display:block; white-space: nowrap" tooltip="{{cluster.name}}">{{cluster.name}}</span>
</div>
<div class="clearfix"></div>
<div class="infobox-data">
<span class="infobox-data-number"></span>
<div class="infobox-content">
<table ng-hide="hoverView">
<tr>
<td class="pull-right">State</td>
<td class="padding-left-15">{{cluster.state}}</td>
</tr>
<tr>
<td class="pull-right">System</td>
<td class="padding-left-15">{{cluster.distributed_system_name}}</td>
</tr>
<tr>
<td class="pull-right">OS</td>
<td class="padding-left-15">{{cluster.os_name}}</td>
</tr>
<tr>
<td class="pull-right">Updated</td>
<td class="padding-left-15">{{cluster.updated_at}}</td>
</tr>
</table>
<table ng-show="hoverView">
<tr>
<td class="pull-right">
Total Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-info">{{cluster.progress.total_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Installing Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-warning">{{cluster.progress.installing_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Completed Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-success">{{cluster.progress.completed_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Failed Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-danger">{{cluster.progress.failed_hosts}}</span>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,106 @@
<div class="table-responsive">
<table ng-table="tableParams" class="ng-table table table-striped table-hover nowrap">
<thead>
<tr>
<th class="sortable" ng-class="{
'sort-asc': tableParams.isSortBy('name', 'asc'),
'sort-desc': tableParams.isSortBy('name', 'desc')}" ng-click="tableParams.sorting({'name' : tableParams.isSortBy('name', 'asc') ? 'desc' : 'asc'})">
<div>
Cluster Name
</div>
</th>
<!-- With icons doesn't make sense to have sorting
class="sortable" ng-class="{
'sort-asc': tableParams.isSortBy('state', 'asc'),
'sort-desc': tableParams.isSortBy('state', 'desc')
}" ng-click="tableParams.sorting({'state' : tableParams.isSortBy('state', 'asc') ? 'desc' : 'asc'})"
-->
<th>
State
</th>
<th>
Deployment Details
</th>
<th class="sortable" ng-class="{
'sort-asc': tableParams.isSortBy('distributed_system_name', 'asc'),
'sort-desc': tableParams.isSortBy('distributed_system_name', 'desc')
}" ng-click="tableParams.sorting({'distributed_system_name' : tableParams.isSortBy('distributed_system_name', 'asc') ? 'desc' : 'asc'})">
<div>
Target System
</div>
</th>
<th class="sortable" ng-class="{
'sort-asc': tableParams.isSortBy('os_name', 'asc'),
'sort-desc': tableParams.isSortBy('os_name', 'desc')
}" ng-click="tableParams.sorting({'os_name' : tableParams.isSortBy('os_name', 'asc') ? 'desc' : 'asc'})">
<div>
OS
</div>
</th>
<th class="sortable" ng-class="{
'sort-asc': tableParams.isSortBy('updated_at', 'asc'),
'sort-desc': tableParams.isSortBy('updated_at', 'desc')
}" ng-click="tableParams.sorting({'updated_at' : tableParams.isSortBy('updated_at', 'asc') ? 'desc' : 'asc'})">
<div>
Date Modified
</div>
</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="cluster in $data | filter:search">
<td sortable="'name'">
<span ng-if="cluster.state=='UNINITIALIZED'">
<a ui-sref="wizard({ id: cluster.id, config: true })">{{cluster.name}}</a>
</span>
<span ng-if="cluster.state!='UNINITIALIZED'">
<a ui-sref="cluster.overview({ id: cluster.id })">{{cluster.name}}</a>
</span>
</td>
<td sortable="'state'">
<span ng-if="cluster.state == 'SUCCESSFUL'">
<i class="ace-icon fa fa fa-check bigger-160 green"></i>
</span>
<span ng-if="cluster.state == 'ERROR'">
<i class="ace-icon fa fa-times bigger-160 red"></i>
</span>
<span ng-if="cluster.state == 'INSTALLING'">
<i class="ace-icon fa fa-spinner fa-spin bigger-160 orange"></i>
</span>
<span ng-if="cluster.state == 'INITIALIZED'">
<i class="ace-icon fa fa-circle-o bigger-160 blue"></i>
</span>
<span ng-if="cluster.state == 'UNINITIALIZED'">
<i class="ace-icon fa fa-gear bigger-160 grey"></i>
</span>
</td>
<td>
<span ng-if="cluster.progress">
<span>Total: {{cluster.progress.total_hosts}}&nbsp;&nbsp;</span>
<span>Installing: {{cluster.progress.installing_hosts}}&nbsp;&nbsp;</span>
<span>Completed: {{cluster.progress.completed_hosts}}&nbsp;&nbsp;</span>
<span>Failed: {{cluster.progress.failed_hosts}}</span>
</span>
</td>
<td sortable="'distributed_system_name'">
{{cluster.distributed_system_name}}
</td>
<td sortable="'os_name'">
{{cluster.os_name}}
</td>
<td sortable="'updated_at'">
{{cluster.updated_at}}
</td>
<td>
<button ng-click="export()" class="btn btn-xs btn-black-white btn-clte btn-export-hover border-radius-4">
<i class="glyphicon glyphicon-export bigger-130"></i>
</button>
<button ng-click="alert()" class="btn btn-xs btn-black-white btn-trash-hover border-radius-4">
<span class="glyphicon glyphicon-trash bigger-130"></span>
</button>
</td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,55 @@
<div class="main-content">
<div class="side-padding-40 top-padding-10">
<div class="row margin-bottom-15">
<div class="col-md-5 no-padding-left search-badge-adjustment">
<h1 class="blue-header margin-right-7">
My Clusters
</h1>
<div class="badge-adjustment">
<span class="badge badge-yellow skinny-badge">{{clusters.length}}</span>
<span class="no-border-search search-small">
<span class="input-icon">
<input class="no-border" type="text" placeholder="Search" ng-model="search.$">
<i class="ace-icon fa fa-search"></i>
</span>
</span>
</div>
</div>
<div class="col-md-7 no-padding-right">
<div class="pull-right">
<span ng-controller="createClusterCtrl" class="pull-right">
<button ng-click="open()" class="btn btn-app btn-sm btn-primary radius-4 btn-create">
<i class="glyphicon glyphicon-plus"></i>
New Cluster
</button>
</span>
</div>
<div class="pull-right clusters-view top-padding-5" ng-init="view = 'grid'">
<span class="action grey" ng-click="view = 'grid'">
<span class="glyphicon glyphicon-th-large" ng-class="{'blue': view == 'grid'}"></span>
</span>
<span class="action grey" ng-click="view = 'list'">
<span class="glyphicon glyphicon-align-justify" ng-class="{'blue': view == 'list'}"></span>
</span>
</div>
</div>
</div>
<div class="row" ng-controller="createClusterCtrl">
<div ng-if="clusters.length == 0" class="dashed-panel no-cluster-panel" ng-click="open()">
<div class="top-padding-10 light-grey">
<i class="ace-icon fa fa-sitemap bigger-300"></i>
</div>
<h4 class="top-padding-10 grey">
No clusters yet. Please click <b class="">New Cluster</b> button to create a new cluster.
</h4>
</div>
<div ng-if="clusters.length != 0">
<div ng-show="view == 'grid'" ng-include="'src/app/partials/cluster-all-grid.tpl.html'"></div>
<div ng-show="view == 'list'" ng-include="'src/app/partials/cluster-all-list.tpl.html'"></div>
</div>
</div>
</div>
<!-- <span ng-include="'src/app/partials/cluster-create.tpl.html'"></span> -->
</div>

View File

@ -0,0 +1,3 @@
<div>
<div ui-view></div>
</div>

View File

@ -0,0 +1,91 @@
<ul class="nav nav-list">
<li ng-class="{active:state.includes('cluster.overview')}">
<a ui-sref="cluster.overview">
<i class="menu-icon fa fa-tachometer"></i>
<span class="menu-text">Overview</span>
</a>
</li>
<!-- <li ng-class="{'active open':state.includes('cluster.monitoring')}">
<a href ng-click="isMonitoringNavOpen = !isMonitoringNavOpen">
<i class="menu-icon fa fa-bar-chart-o"></i>
<span class="menu-text">Monitoring</span>
<b class="arrow fa fa-angle-down"></b>
</a>
<ul class="submenu" ng-show="isMonitoringNavOpen" style="display: block">
<li ng-class="{active:state.includes('cluster.monitoring.overview')}">
<a ui-sref="cluster.monitoring.overview">
<i class="menu-icon fa fa-caret-right"></i>
Overview
</a>
</li>
<li ng-class="{active:state.includes('cluster.monitoring.topology')}">
<a ui-sref="cluster.monitoring.topology">
<i class="menu-icon fa fa-caret-right"></i>
Topology
</a>
</li>
<li ng-class="{active:state.includes('cluster.monitoring.alerts')}">
<a ui-sref="cluster.monitoring.alerts">
<i class="menu-icon fa fa-caret-right"></i>
Alerts
</a>
</li>
<li ng-class="{active:state.includes('cluster.monitoring.metrics')}">
<a ui-sref="cluster.monitoring.metrics">
<i class="menu-icon fa fa-caret-right"></i>
Metrics
</a>
</li>
<li ng-class="{active:state.includes('cluster.monitoring.charts')}">
<a ui-sref="cluster.monitoring.charts">
<i class="menu-icon fa fa-caret-right"></i>
Dashboards
</a>
</li>
</ul>
</li> -->
<li ng-class="{'active open':state.includes('cluster.config')}">
<a href ng-click="isConfigNavOpen = !isConfigNavOpen">
<i class="menu-icon fa fa-cog"></i>
<span class="menu-text">Configurations</span>
<b class="arrow fa fa-angle-down"></b>
</a>
<ul class="submenu" ng-show="isConfigNavOpen" style="display: block">
<li ng-class="{active:state.includes('cluster.config.security')}">
<a ui-sref="cluster.config.security">
<i class="menu-icon fa fa-caret-right"></i>
Security
</a>
</li>
<li ng-class="{active:state.includes('cluster.config.network')}">
<a ui-sref="cluster.config.network">
<i class="menu-icon fa fa-caret-right"></i>
Network
</a>
</li>
<li ng-class="{active:state.includes('cluster.config.partition')}">
<a ui-sref="cluster.config.partition">
<i class="menu-icon fa fa-caret-right"></i>
Partition
</a>
</li>
<li ng-class="{active:state.includes('cluster.config.roles')}">
<a ui-sref="cluster.config.roles">
<i class="menu-icon fa fa-caret-right"></i>
Roles
</a>
</li>
</ul>
</li>
<li ng-class="{active:state.includes('cluster.log')}">
<a ui-sref="cluster.log">
<i class="menu-icon fa fa-list-alt"></i>
<span class="menu-text">Log</span>
</a>
</li>
</ul>
<div class="sidebar-toggle sidebar-collapse" ng-click="sidebarCollapse = !sidebarCollapse">
<i class="ace-icon fa fa-angle-double-left" ng-class="{'fa-angle-double-right': sidebarCollapse}"></i>
</div>

View File

@ -0,0 +1,23 @@
<div class="page-header">
<h1>
Network
</h1>
</div>
<div class="row side-padding-10 padding-top-30">
<div class="col-xs-12">
<table class="table table-striped">
<thead>
<tr>
<th>Network</th>
<th>Interface</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="(key, value) in configuration.package_config.network_mapping">
<td class="capitalize">{{key}} Network</td>
<td>{{value}}</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -0,0 +1,189 @@
<div class="page-header">
<h1>
{{clusterInfo.name}}
<small>
<span class="badge" ng-class="{'badge-info':clusterProgress.state==='INITIALIZED',
'badge-warning':clusterProgress.state==='INSTALLING',
'badge-danger':clusterProgress.state==='ERROR',
'badge-success':clusterProgress.state==='SUCCESSFUL'}">
{{clusterProgress.state}}
</span>
</small>
</h1>
<!--<i class="ace-icon fa fa-angle-double-right"></i>&nbsp;
<a href="">OpenStack Dashboard Link</a>-->
</div>
<div class="row">
<div class="col-xs-12">
<div class="row">
<div class="pull-right align-right">
<div class="cluster-progress">
<table>
<tr>
<td class="pull-right">
Total Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-info">{{clusterProgress.status.total_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Installing Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-warning">{{clusterProgress.status.installing_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Completed Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-success">{{clusterProgress.status.completed_hosts}}</span>
</td>
</tr>
<tr>
<td class="pull-right">
Failed Hosts
</td>
<td class="padding-left-15">
<span class="badge badge-danger">{{clusterProgress.status.failed_hosts}}</span>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div>
<div class="pull-left">
<span class="input-icon">
<input type="text" placeholder="Search" ng-model="search">
<i class="ace-icon fa fa-search blue"></i>
</span>
<div class="btn-group" dropdown>
<button type="button" class="btn btn-default dropdown-toggle" dropdown-toggle ng-disabled="disabled">
Column Show / Hide
<span class="ace-icon fa fa-caret-down icon-on-right"></span>
</button>
<ul class="dropdown-menu" role="menu" dropdown>
<li ng-repeat="column in server_columns" ng-click="column.visible=!column.visible">
<a class="action">
<span ng-class="{'opacity-zero': !column.visible}">
<i class="ace-icon fa fa-check blue"></i>
</span>
{{column.title}}
</a>
</li>
</ul>
</div>
</div>
<div class="pull-right">
<div class="btn-group" dropdown>
<button type="button" class="btn btn-info dropdown-toggle" ng-disabled="clusterProgress.state == 'INSTALLING'" dropdown-toggle>
Actions
<span class="ace-icon fa fa-caret-down icon-on-right"></span>
</button>
<ul class="dropdown-menu dropdown-info dropdown-menu-right" role="menu" dropdown>
<li>
<a class="action">
Add Hosts
</a>
</li>
<li class="divider"></li>
<li>
<a class="action" ng-click="assignRole(role)">
IPMI Power on
</a>
</li>
<li>
<a class="action" ng-click="assignRole(role)">
IPMI Power off
</a>
</li>
<li>
<a class="action" ng-click="assignRole(role)">
IPMI Reset
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="clearfix"></div>
<div class="space-6"></div>
<div class="table-responsive">
<table ng-table="tableParams" class="table table-hover table-striped">
<thead>
<tr>
<th>
<label>
<input type="checkbox" ng-model="selectall" ng-change="selectAllServers(selectall)" class="ace">
<span class="lbl"></span>
</label>
</th>
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable" ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}" ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
<div>{{column.title}}</div>
</th>
<th>Progress</th>
<th class="align-right"></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="host in $data | filter:search" ng-class="{'hightlight': host.selected}">
<td>
<label>
<input type="checkbox" ng-model="host.selected" class="ace">
<span class="lbl"></span>
</label>
</td>
<td ng-repeat="column in server_columns" ng-show="column.visible" sortable="column.field">
<span ng-switch on="column.field">
<span ng-switch-when="clusters">
<span ng-repeat="cluster in host.clusters">
{{cluster.name}}&nbsp;
</span>
</span>
<span ng-switch-when="roles">
<span ng-repeat="role in host['roles']" class="badge">
{{role.display_name}}&nbsp;
</span>
</span>
<span ng-switch-default>
{{host[column.field]}}
</span>
</span>
</td>
<td>
<hostprogressbar hostid="host.host_id" clusterid="clusterId" clusterstate="clusterProgress.state" progressdata="">
</hostprogressbar>
</td>
<td class="align-right">
<button class="btn border-radius-4 btn-xs" ng-click="openDeleteHostModal($index)" ng-disabled="clusterProgress.state == 'INSTALLING'">
<i class="ace-icon fa fa-trash-o bigger-120"></i>
</button>
</td>
</tr>
</tbody>
</table>
<script type="text/ng-template" id="deleteHostConfirm.html">
<div class="modal-header ng-scope">
<h3 class="modal-title">Create Cluster</h3>
</div>
<div class="modal-body" style="padding-top: 30px; padding-bottom: 20px;" >
Are you sure to delete
<strong>{{host.hostname}}</strong>?
</div>
<div class="modal-footer">
<button class="btn btn-default" ng-click="cancel()">Cancel</button>
<button class="btn btn-primary" ng-click="ok()">OK</button>
</div>
</script>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,39 @@
<div class="page-header">
<h1>
Partition
</h1>
</div>
<div class="row side-padding-10 padding-top-30">
<div class="col-xs-12">
<div class="col-lg-8">
<table class="table table-hover table-striped nowrap">
<thead>
<tr>
<th>Mount Point</th>
<th>Size Percentage (%)</th>
<th>Max Size (G)</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="(key, data) in configuration.os_config.partition">
<td>
<span>{{key}}</span>
</td>
<td>
<span>{{data.percentage}}</span>
</td>
<td>
<span>{{data.max_size}}</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-lg-4 text-center partition-chart">
<piechart piedata="partitionarray"></piechart>
</div>
</div>
</div>

View File

@ -0,0 +1,50 @@
<div class="page-header">
<h1>
Roles
</h1>
</div>
<div class="row side-padding-10 padding-top-30">
<div class="col-xs-12">
<div class="table-responsive">
<table ng-table="tableParams" class="table table-hover table-striped">
<thead>
<tr>
<!--th>
<label>
<input type="checkbox" ng-model="selectall" ng-change="selectAllServers(selectall)" class="ace">
<span class="lbl"></span>
</label>
</th-->
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable" ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}" ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
<div>{{column.title}}</div>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="host in $data | filter:search">
<!--td>
<label>
<input type="checkbox" ng-model="host.selected" class="ace">
<span class="lbl"></span>
</label>
</td-->
<td ng-repeat="column in server_columns" ng-show="column.visible" sortable="column.field">
<span ng-switch on="column.field">
<span ng-switch-when="roles">
<span ng-repeat="role in host['roles']" class="badge">
{{role.display_name}}&nbsp;
</span>
</span>
<span ng-switch-default>
{{host[column.field]}}
</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>

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