Skip to content

Commit

Permalink
Updated promises and server methods
Browse files Browse the repository at this point in the history
Updated safe mount options for gluster
  • Loading branch information
dymurray committed Jun 10, 2016
1 parent 7402550 commit 65b4de3
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 60 deletions.
85 changes: 53 additions & 32 deletions fusor-ember-cli/app/controllers/storage.js
@@ -1,59 +1,80 @@
import Ember from 'ember';
import request from 'ic-ajax';
import NeedsDeploymentMixin from "../mixins/needs-deployment-mixin";
import { AllValidator, PresenceValidator, AlphaNumericDashUnderscoreValidator, HostnameValidator } from '../utils/validators';
import {
AllValidator,
PresenceValidator,
AlphaNumericDashUnderscoreValidator,
HostnameValidator
} from '../utils/validators';

export default Ember.Controller.extend(NeedsDeploymentMixin, {
actions: {
testMountPoint() {
let checkExport = this.get('isCloudForms');
this.storageMountRequest(this.get('model.rhev_share_path'), this.get('model.rhev_storage_address'), this.get('model.rhev_storage_type')).then(result => {
this.set('errorMsg', null);
if (!checkExport) {
this.transitionTo(this.get('step3RouteName'));
}
this.set('errorMsg', null);
const checkExport = this.get('isCloudForms');

const storageParams = {
path: this.get('model.rhev_share_path'),
address: this.get('model.rhev_storage_address'),
type: this.get('model.rhev_storage_type')
};

const validationPromises = {
storage: this.storageMountRequest(storageParams)
};

if(checkExport) {
const exportParams = {
path: this.get('model.rhev_export_domain_path'),
address: this.get('model.rhev_export_domain_address'),
type: this.get('model.rhev_storage_type')
};

validationPromises.export = this.storageMountRequest(exportParams);
}

this.set('loadingSpinnerText', `Trying to mount storage paths...`);
this.set('showLoadingSpinner', true);

Ember.RSVP.hash(validationPromises).then((resultHash) => {
this.set('showLoadingSpinner', false);
}).catch(error => {
this.set('errorMsg', "Error mounting data domain, please make sure it is a valid mount point");
}).then(response => {
if (checkExport && this.get('errorMsg') == null) {
this.storageMountRequest(this.get('model.rhev_export_domain_path'), this.get('model.rhev_export_domain_address'), this.get('model.rhev_storage_type')).then(result => {
this.set('errorMsg', null);
this.transitionTo(this.get('step3RouteName'));
this.set('showLoadingSpinner', false);
}).catch(error => {
this.set('errorMsg', "Error mounting export domain, please make sure it is a valid mount point");
});

const validMounts = checkExport ?
resultHash.storage.mounted && resultHash.export.mounted :
resultHash.storage.mounted;

if(validMounts) {
this.set('errorMsg', null);
this.transitionTo(this.get('step3RouteName'));
} else {
const failedDomain = resultHash.storage.mounted ? 'export' : 'storage';
this.set(
'errorMsg',
`Error mounting ${failedDomain} domain, please make sure it is a valid mount point`);
}
}).catch(err => {
this.set(
'errorMsg',
'Error occurred while attempting to validate storage paths');
});
}
},

storageMountRequest(path, address, type) {
let deploymentId = this.get('deploymentId');
this.set('loadingSpinnerText', `Trying to mount storage paths...`);
this.set('showLoadingSpinner', true);
storageMountRequest(params) {
const deploymentId = this.get('deploymentId');
return request({
url: `/fusor/api/v21/deployments/${deploymentId}/check_mount_point`,
type: 'GET',
data: {
path: path,
address: address,
type: type
},
data: params,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': Ember.$('meta[name="csrf-token"]').attr('content')
}
}).then(response => {
if(!response.mounted) {
throw 'There was an issue mounting the share... check the logs for errors';
}
});
},


deploymentId: Ember.computed.alias('deploymentController.model.id'),
step3RouteName: Ember.computed.alias("deploymentController.step3RouteName"),
isCloudForms: Ember.computed.alias("deploymentController.isCloudForms"),
Expand Down
1 change: 0 additions & 1 deletion fusor-ember-cli/app/routes/storage.js
@@ -1,5 +1,4 @@
import Ember from 'ember';
import request from 'ic-ajax';

export default Ember.Route.extend({
setupController(controller, model) {
Expand Down
58 changes: 31 additions & 27 deletions server/app/controllers/fusor/api/v21/deployments_controller.rb
Expand Up @@ -123,25 +123,37 @@ def validate_cdn
end

def check_mount_point
mount_address = params['address']
mount_path = params['path']
mount_type = params['type']

begin
mount_address = params['address']
mount_path = params['path']
mount_type = params['type']
mount_storage(mount_address, mount_path, mount_type)
render json: { :mounted => true }, status: 200
rescue
render json: { :mounted => false }, status: 200
end
end

deployment_id = @deployment.id
# mount_storage will return in megabytes the amount of free space left on the storage mount
def mount_storage(address, path, type)
deployment_id = @deployment.id
if type == "GFS"
type = "glusterfs"
else
type = "nfs"
end

cmd = "sudo safe-mount.sh '#{deployment_id}' '#{mount_address}' '#{mount_path}'"
status, _output = Utils::Fusor::CommandUtils.run_command(cmd)
cmd = "sudo safe-mount.sh '#{deployment_id}' '#{address}' '#{path}' '#{type}'"
status, _output = Utils::Fusor::CommandUtils.run_command(cmd)

raise 'Unable to mount NFS share at specified mount point' unless status == 0
raise 'Unable to mount NFS share at specified mount point' unless status == 0

Utils::Fusor::CommandUtils.run_command("sudo safe-umount.sh #{deployment_id}")
render json: { :mounted => true }, status: 200
rescue => error
message = 'Malformed request'
message = error.message if error.respond_to?(:message)
render json: { :error => message }, status: 400
end
stats = Sys::Filesystem.stat("/tmp/fusor-test-mount-#{deployment_id}")
mb_available = stats.block_size * stats.blocks_available / 1024 / 1024

Utils::Fusor::CommandUtils.run_command("sudo safe-umount.sh #{deployment_id}")
return mb_available
end

def log
Expand All @@ -161,20 +173,12 @@ def log
def openshift_disk_space
# Openshift deployments need to know how much disk space is available on the NFS storage pool
# This method mounts the specifed NFS share and gets the available disk space
begin
nfs_address = @deployment.rhev_storage_address
nfs_path = @deployment.rhev_share_path
deployment_id = @deployment.id
address = @deployment.rhev_storage_address
path = @deployment.rhev_share_path
storage_type = @deployment.rhev_storage_type

cmd = "sudo safe-mount.sh '#{deployment_id}' '#{nfs_address}' '#{nfs_path}'"
status, _output = Utils::Fusor::CommandUtils.run_command(cmd)

raise 'Unable to mount NFS share at specified mount point' unless status == 0

stats = Sys::Filesystem.stat("/tmp/fusor-test-mount-#{deployment_id}")
mb_available = stats.block_size * stats.blocks_available / 1024 / 1024

Utils::Fusor::CommandUtils.run_command("sudo safe-umount.sh #{deployment_id}")
begin
mb_available = mount_storage(address, path, storage_type)
render json: { :openshift_disk_space => mb_available }, status: 200
rescue Exception => error
message = 'Unable to retrieve Openshift disk space'
Expand Down

0 comments on commit 65b4de3

Please sign in to comment.