Merge branch 'develop' into Evan

This commit is contained in:
Yoggzo 2016-03-08 17:30:26 +01:00
commit 89f2c4ac8c
19 changed files with 260 additions and 107 deletions

View file

@ -11,27 +11,28 @@
<link rel="stylesheet" href="./css/style.css">
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<!-- Overlay -->
<div ng-include="'./partials/login.html'"></div>
<div ng-include="'./partials/home/machineDetails.html'"></div>
<div ng-include="'./partials/loading.html'"></div>
<!-- MAIN GRID -->
<div class="container-lg">
<!-- Status bar -->
<div class="row" ng-controller="statusCtrl">
<div class="col-lg-12">
<!-- Login Overlay -->
<div ng-include="'./partials/login.html'"></div>
<!-- Machine Details Overlay -->
<div ng-include="'./partials/home/machineDetails.html'"></div>
<div ng-include="'./partials/loading.html'"></div>
<!-- Nav -->
<div ng-include="'./partials/nav.html'"></div>
<!-- Status bar -->
<div ng-include="'./partials/status.html'"></div>
</div>
</div>
<!-- Page content -->
@ -56,7 +57,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@ -85,9 +86,10 @@
<!-- Include controller -->
<script src="./js/controllers/login.js"></script>
<script src="./js/controllers/status.js"></script>
<script src="./js/controllers/home/main.js"></script>
<script src="./js/controllers/home/home.js"></script>
<script src="./js/controllers/home/machineDetails.js"></script>
<script src="./js/controllers/network/main.js"></script>
<script src="./js/controllers/network/network.js"></script>
<script src="./js/controllers/image/image.js"></script>

View file

@ -13,12 +13,16 @@ mainApp.config(['$routeProvider', function($routeProvider){
$routeProvider.
when('/home',{
templateUrl: 'partials/home/main.html',
templateUrl: 'partials/home/home.html',
controller: 'homeCtrl'
}).
when('/network',{
templateUrl: 'partials/network/main.html',
templateUrl: 'partials/network/network.html',
controller: 'networkCtrl'
}).
when('/image',{
templateUrl: 'partials/image/image.html',
controller: 'imageCtrl'
}).otherwise({
redirectTo: '/home'
});

View file

@ -3,7 +3,7 @@
*
* @param {$scope} $scope The $scope service from angular
*/
mainApp.controller('homeCtrl', [ '$scope', 'Compute', '$rootScope', 'Loading','Identity', function ($scope, Compute, $rootScope, Loading, Identity)
mainApp.controller('homeCtrl', [ '$scope', 'Compute', '$rootScope', 'Loading','Identity', 'Image', function ($scope, Compute, $rootScope, Loading, Identity, Image)
{
var callMeAfterPullData=function(data){
@ -16,8 +16,14 @@ mainApp.controller('homeCtrl', [ '$scope', 'Compute', '$rootScope', 'Loading','I
Loading.start();
Compute.pullData(callMeAfterPullData);
}
else{
if(Identity.isAlreadyLogin()){
callMeAfterPullData();
}
}
Image.getImages(function(){});
$scope.raiseShowMachineDetailsEvent=function(id){

View file

@ -6,23 +6,25 @@
mainApp.controller('machineDetailsCtrl', [ '$scope', 'Compute', '$rootScope', '$timeout', function ($scope, Compute, $rootScope, $timeout)
{
// Init scope
$scope.machine={};
$("#waitingForToggleMachine").hide();
$scope.machineIsStarting=false; // For loading icon
$scope.$on('showMachineDetailsEvent', function(eventName ,machine, axioms){
$scope.machine=machine;
$scope.axioms=axioms;
console.log(machine);
$('#machineDetailsModal').modal({backdrop: false, keyboard: true});
});
$scope.toggleMachineState=function(){
$("#waitingForToggleMachine").show();
// Display gif
$scope.machineIsStarting=true;
// Fake timeout
$timeout(function(){
$("#waitingForToggleMachine").hide();
$scope.machineIsStarting=false;
}, 3000);
$timeout(function(){
$scope.machine.online=!$scope.machine.online;

View file

@ -0,0 +1,21 @@
/**
* The image controller
*
* @param {$scope} $scope The $scope service from angular
*/
mainApp.controller('imageCtrl', ['$scope', 'Image', 'Loading', function ($scope, Image, Loading)
{
var callbackTest=function(){
$scope.images=Image.getData().images;
Loading.stop();
};
if(Image.getData().images==null){
Loading.start();
Image.getImages(callbackTest);
}
else{
callbackTest();
}
}]);

View file

@ -16,10 +16,11 @@ mainApp.controller('loginCtrl', ['$scope','$sce','Identity', function ($scope,$s
// Manager logout event
$scope.$on('logoutEvent', function(){
Identity.logout();
$('#loginModal').modal({backdrop: 'static', keyboard: false});
});
// Hide loading button and message alert
$('#loadingLoginButton').hide();
$('#failedToLoginAlert').hide();

View file

@ -11,10 +11,10 @@ mainApp.controller('statusCtrl', ['$scope','Identity', '$rootScope', function ($
// Give profile to model
$scope.profile=Identity.getProfile();
// Function to logout
$scope.raiseLogoutEvent=function(){
$rootScope.$broadcast('logoutEvent');
$scope.logout=function(){
Identity.logout();
};
}]);

View file

@ -1,5 +1,5 @@
mainApp.factory('Identity',[ '$http', '$cookies', function($http, $cookies){
mainApp.factory('Identity',[ '$http', '$cookies', function($http, $cookies){
/* Create profile structure to store informations
* about current session
@ -51,6 +51,9 @@ mainApp.factory('Identity',[ '$http', '$cookies', function($http, $cookies){
token=null;
profile.username=null;
profile.projectname=null;
// Reload Page
location.reload();
}
@ -95,6 +98,7 @@ mainApp.factory('Identity',[ '$http', '$cookies', function($http, $cookies){
else{
requestParserResult.failReason="Please check your username, password and project name !";
}
return requestParserResult;
};

View file

@ -1,27 +1,58 @@
mainApp.factory('Image',[ '$http', 'Identity', function($http, Identity){
var data={};
data.images=null;
var parseUploadImageAnswer=function(response, failedToSendRequest){
// Defined return object
var requestParserResult={};
requestParserResult.status=1;
requestParserResult.failReason=null;
if (typeof response.data.Images !== 'undefined') {
// Set status code
requestParserResult.status=0;
data.images=response.data.Images;
}
else if(failedToSendRequest){
requestParserResult.failReason="Failed to send request";
}
else{
requestParserResult.failReason="Error";
}
return requestParserResult;
};
var getImages=function(callback){
var result=$http.post('../server/index.php',
$.param({"token" : Identity.profile.token, "task" : "Image"}));
$.param({"token" : Identity.getToken(), "task" : "image", 'action':'listImage'}));
// Wait and handle the response
result.then(function (response){
callback(parseUploadImageAnswer(response, false));
},function(response){
callback(parseUploadImageAnswer(response, true));
});
};
var getData=function(response){
return data;
};
// Return services objects
return {
uploadImage: uploadImage
getImages:getImages,
getData:getData
};

View file

@ -1,22 +1,23 @@
mainApp.factory('Loading',[ '$http', 'Identity', function($http, Identity){
mainApp.factory('Loading',[ function(){
/**
* Display Loading modal
*/
var start=function(){
$('#loadingModal').modal({backdrop: 'static', keyboard: false});
};
/**
* Hide Loading modal
*/
var stop=function(){
$('#loadingModal').modal('hide');
}
// Service returns
return {
start:start,
stop:stop
};
}]);

View file

@ -26,7 +26,7 @@
&nbsp;
<button class="btn btn-danger" ng-if="machine.status=='ACTIVE'" ng-click="toggleMachineState()">Turn Off</button>
<button class="btn btn-success" ng-if="machine.status!=='ACTIVE'" ng-click="toggleMachineState()">Turn On</button>
&nbsp;<img src="images/spin/32x32/Preloader_1.gif" id="waitingForToggleMachine"></span>
&nbsp;<img src="images/spin/32x32/Preloader_1.gif" ng-if="machineIsStarting"></span>
</div>

View file

@ -0,0 +1,10 @@
<div class="panel panel-default" ng-controller="imageCtrl">
<div class="panel-heading">
Images disponibles
</div>
<div class="panel-body">
<div ng-repeat="image in images">
{{image.name}}
</div>
</div>
</div>

View file

@ -1,4 +1,5 @@
<div class="list-group">
<a href="#/home" class="list-group-item">Home</a>
<a href="#/network" class="list-group-item">Network</a>
</div>
<a href="#/image" class="list-group-item">Images</a>
</div>

View file

@ -1,41 +0,0 @@
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"><b>Status</b></a>
</div>
<div class="navbar-"></div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="nav-divider"></li>
<li><a href="#">User : {{ profile.username }}</a></li>
<li><a href="#">Project Name : {{ profile.projectname }}</a></li>
<!--<li><a href="#" >Connection : <span ng-bind-html="connection"></span></a></li>-->
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Account<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Informations</a></li>
<li><a href="#">Settings</a></li>
<li role="separator" class="divider"></li>
<li><a href="#" ng-click="raiseLogoutEvent()">Logout</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>

View file

@ -0,0 +1,29 @@
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand"><b>Status</b></a>
</div>
<div class="navbar-"></div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="nav-divider"></li>
<li><a>User : {{ profile.username }}</a></li>
<li><a>Project Name : {{ profile.projectname }}</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a ng-click="logout()">Logout</a></li>
</ul>
</div>
</div>
</nav>

View file

@ -12,11 +12,11 @@ class compute
protected $libClass;
public function __construct($app)
{
$this->app = $app;
$this->libClass = $app->getLibClass("Compute");
}
public function __construct($app)
{
$this->app = $app;
$this->libClass = $app->getLibClass("Compute");
}
/**
* Execute an action
*
@ -41,13 +41,26 @@ class compute
$servers[$server->id] = Array();
$server->flavor->retrieve();
$server->image->retrieve();
$server->retrieve();
$servers[$server->id]["id"] = $server->id;
$servers[$server->id]["name"] = $server->name;
$servers[$server->id]["imageId"] = $server->image->id;
$servers[$server->id]["flavorId"] = $server->flavor->id;
$servers[$server->id]["status"] = $server->status;
$servers[$server->id]["image"] = $server->image;
$servers[$server->id]["ram"] = $server->flavor->ram;
$servers[$server->id]["disk"] = $server->flavor->disk;
$servers[$server->id]["flavor"] = $server->flavor;
$servers[$server->id]["status"] = $server->status;
$servers[$server->id]["created"] = $server->created;
$servers[$server->id]["updated"] = $server->updated;
$servers[$server->id]["ipv4"] = $server->ipv4;
$servers[$server->id]["ipv6"] = $server->ipv6;
$servers[$server->id]["progress"] = $server->progress;
$servers[$server->id]["hostId"] = $server->hostId;
$servers[$server->id]["tenantId"] = $server->tenantId;
$servers[$server->id]["userId"] = $server->userId;
$servers[$server->id]["taskState"] = $server->taskState;
$servers[$server->id]["addresses"] = $server->addresses;
$servers[$server->id]["links"] = $server->links;
$servers[$server->id]["metadata"] = $server->metadata;
}
$this->app->setOutput("Servers", $servers);
return;
@ -62,8 +75,13 @@ class compute
$flavors = Array();
foreach($flavorList as $flavor){
$flavors[$flavor->id] = Array();
$flavor->retrieve();
$flavors[$flavor->id]["id"] = $flavor->id;
$flavors[$flavor->id]["name"] = $flavor->name;
$flavors[$flavor->id]["ram"] = $flavor->ram;
$flavors[$flavor->id]["disk"] = $flavor->disk;
$flavors[$flavor->id]["vcpus"] = $flavor->vcpus;
$flavors[$flavor->id]["links"] = $flavor->links;
}
$this->app->setOutput("Flavors", $flavors);
return;
@ -78,29 +96,32 @@ class compute
$images = Array();
foreach($imageList as $image){
$images[$image->id] = Array();
$image->retrieve();
$images[$image->id]["id"] = $image->id;
$images[$image->id]["name"] = $image->name;
$images[$image->id]["status"] = $image->status;
$images[$image->id]["created"] = $image->created;
$images[$image->id]["updated"] = $image->updated;
$images[$image->id]["minDisk"] = $image->minDisk;
$images[$image->id]["minRam"] = $image->minRam;
$images[$image->id]["progress"] = $image->progress;
$images[$image->id]["links"] = $image->links;
$images[$image->id]["metadata"] = $image->metadata;
}
$this->app->setOutput("Images", $images);
return;
}
/**
* Create server.
* @return array
*
public function createServer()
{
$server = $this->libClass->createServer();
}
*/
/**
/**
* Get server details.
* @return array
*/
public function getServer()
{
$serverId = $this->app->getPostParam("serverId");
if(!isset($serverId)){
$this->app->setOutput("Error", "Server ID is missing, son!");
return;
}
$opt = array('id' => $serverId);
$server = $this->libClass->getServer($opt);
$server->retrieve();
@ -114,6 +135,10 @@ class compute
public function getFlavor()
{
$flavorId = $this->app->getPostParam("flavorId");
if(!isset($serverId)){
$this->app->setOutput("Error", "Flavor ID is missing, son!");
return;
}
$opt = array('id' => $flavorId);
$flavor = $this->libClass->getFlavor($opt);
$flavor->retrieve();
@ -127,23 +152,80 @@ class compute
public function getImage()
{
$imageId = $this->app->getPostParam("imageId");
if(!isset($serverId)){
$this->app->setOutput("Error", "Image ID is missing, son!");
return;
}
$opt = array('id' => $imageId);
$image = $this->libClass->getImage($opt);
$image->retrieve();
$this->app->setOutput("MyImage", $image);
return;
}
/* working on tests
public function update()
/**
* Create server.
* @return array
*/
public function createServer()
{
$image = $this->app->getServer(array $options = []);
$name = $this->app->getPostParam("name");
$imageId = $this->app->getPostParam("imageId");
$flavorId = $this->app->getPostParam("flavorId");
if(!isset($name) || !isset($imageId) || !isset($flavorId)){
$this->app->setOutput("Error", "No, we don't let you create a server without a name OR image ID OR flavor ID.");
return;
}
$opt = array('name' => $name, 'imageId' => $imageId, 'flavorId' => $flavorId);
$server = $this->libClass->createServer($opt);
}
public function delete()
/**
* update a server
* @return void
*/
public function updateServer()
{
//TODO
$serverId = $this->app->getPostParam("serverId");
$newName = $this->app->getPostParam("newName");
$newIpv4 = $this->app->getPostParam("newIpv4");
$newIpv6 = $this->app->getPostParam("newIpv6");
if(!isset($serverId)|| !(isset($newName) || isset($newIpv4) || isset($newIpv6)) ){
$this->app->setOutput("Error", "You'll have to provide server ID and the new attribute(IP(v4/v6)/Name) you desire to update!");
return;
}
$opt = array('id' => $serverId);
$server = $this->libClass->getServer($opt);
if (isset($newName)){
if(isset($newIpv4)){
if(isset($newIpv6)){
$attr = array('name' => $newName, 'accessIPv4' => $newIPv4, 'accessIPv6' => $newIpv6);
}
else $attr = array('name' => $newName, 'accessIPv4' => $newIPv4);
}
else $attr = array('name' => $newName);
}
$server->update($attr);
$this->app->setOutput("Success", $serverId." has been updated successfully.");
return;
}
/**
* Delete a server
* @return void
*/
public function deleteServer()
{
$serverId = $this->app->getPostParam("serverId");
if(!isset($serverId)){
$this->app->setOutput("Error", "Server ID is missing, son!");
return;
}
$opt = array('id' => $serverId);
$server = $this->libClass->getServer($opt);
$server->delete();
$this->app->setOutput("Success", $serverId." has been deleted successfully.");
return;
}
/*
public function changePassword($newPassword)
{
//TODO