diff --git a/client/index.html b/client/index.html
index 8ca2b9f..a06994c 100644
--- a/client/index.html
+++ b/client/index.html
@@ -11,27 +11,28 @@
-
+
-
+
+
+
+
+
+
+
+
-
+
@@ -85,9 +86,10 @@
-
+
-
+
+
diff --git a/client/js/app.js b/client/js/app.js
index e2d5b9b..1602e65 100644
--- a/client/js/app.js
+++ b/client/js/app.js
@@ -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'
});
diff --git a/client/js/controllers/home/main.js b/client/js/controllers/home/home.js
similarity index 77%
rename from client/js/controllers/home/main.js
rename to client/js/controllers/home/home.js
index f84f625..4402e62 100644
--- a/client/js/controllers/home/main.js
+++ b/client/js/controllers/home/home.js
@@ -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){
diff --git a/client/js/controllers/home/machineDetails.js b/client/js/controllers/home/machineDetails.js
index 24fac42..c015eaa 100644
--- a/client/js/controllers/home/machineDetails.js
+++ b/client/js/controllers/home/machineDetails.js
@@ -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;
diff --git a/client/js/controllers/image/image.js b/client/js/controllers/image/image.js
new file mode 100644
index 0000000..e298fcc
--- /dev/null
+++ b/client/js/controllers/image/image.js
@@ -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();
+ }
+
+}]);
diff --git a/client/js/controllers/login.js b/client/js/controllers/login.js
index 1a89563..63cb6d1 100644
--- a/client/js/controllers/login.js
+++ b/client/js/controllers/login.js
@@ -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();
diff --git a/client/js/controllers/network/main.js b/client/js/controllers/network/network.js
similarity index 100%
rename from client/js/controllers/network/main.js
rename to client/js/controllers/network/network.js
diff --git a/client/js/controllers/status.js b/client/js/controllers/status.js
index 940d794..6f398ad 100644
--- a/client/js/controllers/status.js
+++ b/client/js/controllers/status.js
@@ -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();
};
}]);
diff --git a/client/js/services/Identity.js b/client/js/services/Identity.js
index da85ecd..db93e97 100644
--- a/client/js/services/Identity.js
+++ b/client/js/services/Identity.js
@@ -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;
};
diff --git a/client/js/services/Image.js b/client/js/services/Image.js
index 23b33a8..2e8c56f 100644
--- a/client/js/services/Image.js
+++ b/client/js/services/Image.js
@@ -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
};
diff --git a/client/js/services/Loading.js b/client/js/services/Loading.js
index b12aaa0..db06194 100644
--- a/client/js/services/Loading.js
+++ b/client/js/services/Loading.js
@@ -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
};
-
-
}]);
diff --git a/client/partials/home/main.html b/client/partials/home/home.html
similarity index 100%
rename from client/partials/home/main.html
rename to client/partials/home/home.html
diff --git a/client/partials/home/machineDetails.html b/client/partials/home/machineDetails.html
index 47a65fb..c4c8a38 100644
--- a/client/partials/home/machineDetails.html
+++ b/client/partials/home/machineDetails.html
@@ -26,7 +26,7 @@
-
+
diff --git a/client/partials/image/image.html b/client/partials/image/image.html
new file mode 100644
index 0000000..8af8af5
--- /dev/null
+++ b/client/partials/image/image.html
@@ -0,0 +1,10 @@
+
+
+ Images disponibles
+
+
+
diff --git a/client/partials/menu.html b/client/partials/menu.html
index dfd5842..a473fd8 100644
--- a/client/partials/menu.html
+++ b/client/partials/menu.html
@@ -1,4 +1,5 @@
\ No newline at end of file
+ Images
+
diff --git a/client/partials/nav.html b/client/partials/nav.html
deleted file mode 100644
index b3ef76a..0000000
--- a/client/partials/nav.html
+++ /dev/null
@@ -1,41 +0,0 @@
-
diff --git a/client/partials/network/main.html b/client/partials/network/network.html
similarity index 100%
rename from client/partials/network/main.html
rename to client/partials/network/network.html
diff --git a/client/partials/status.html b/client/partials/status.html
new file mode 100644
index 0000000..01b9079
--- /dev/null
+++ b/client/partials/status.html
@@ -0,0 +1,29 @@
+
diff --git a/server/core/Compute.php b/server/core/Compute.php
index a5b8375..f02eb8b 100644
--- a/server/core/Compute.php
+++ b/server/core/Compute.php
@@ -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