Repository URL to install this package:
|
Version:
4.1.94.1.dev33 ▾
|
<style>
.divider_div{
margin-bottom:2% !important;
}
.custom-input
{
width:97% !important;
}
.custom-icon{
float: right;
margin-top:-4.5%;
color:#75b93e !important;
cursor:pointer;
}
.upload-icon{
color:#75b93e !important;
cursor:pointer;
font-size:15px;
}
#icon-adv:before {
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
transform: rotate(180deg);
}
#loader {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
background: rgba(0,0,0,0.75) url('images/loader2.gif') no-repeat center center;
z-index: 10000;
}
.error_msg
{
color: red;
font-weight: bold;
}
</style>
<script type="text/javascript">
$( document ).ready(function() {
$("#wlm_public_label").hide()
$("#dm_public_label").hide()
checkHttps($("#wlm-endpoint-public"),'cert_upload_public');
checkHttps($("#s3-endpoint-url"),'s3_cert_upload_public');
$("input[type='file']").change(function() {
var selected_file_name = $(this).val();
var id= this.id;
if ( selected_file_name.length > 0 ) {
var filename = $(this).val().split('\\').pop();
$("#filename_"+id).html(filename);
}
else{
$("#filename_"+id).html('');
}
});
$("#wlm-advanced").click(function(){
$("#wlm_enpoints_advanced_div").toggle();
$("#wlm_public_label,#wlm_common_url_extention").toggle();
if($("#wlm-arrow").hasClass('fa-chevron-down'))
{
$("#wlm-arrow").removeClass('fa-chevron-down');
$("#wlm-arrow").addClass('fa-chevron-up');
}else if($("#wlm-arrow").hasClass('fa-chevron-up'))
{
$("#wlm-arrow").removeClass('fa-chevron-up');
$("#wlm-arrow").addClass('fa-chevron-down');
}
});
$("#dm-advanced").click(function(){
$("#dm_enpoints_advanced_div").toggle();
$("#dm_public_label,#dm_common_url_extention").toggle();
if($("#dm-arrow").hasClass('fa-chevron-down'))
{
$("#dm-arrow").removeClass('fa-chevron-down');
$("#dm-arrow").addClass('fa-chevron-up');
}else if($("#dm-arrow").hasClass('fa-chevron-up'))
{
$("#dm-arrow").removeClass('fa-chevron-up');
$("#dm-arrow").addClass('fa-chevron-down');
}
});
//show or hide endpoint url field
$("#s3-backend-type").change(function(){
var selected_backend = $(this).val();
$('#submit').attr('disabled','disabled');
$('#press_tab').removeClass("hidden")
if(selected_backend=='amazon')
{
$("#s3-endpoint-url-div").addClass("hidden");
$('[name="s3-endpoint-url"]').removeAttr("required");
}
else
{
$("#s3-endpoint-url-div").removeClass("hidden");
$('[name="s3-endpoint-url"]').attr("required", "true");
}
});
});
IsV3 = false
Invalid = true
function validate_s3_credentials() {
var formData = new FormData();
s3_access_key_id = $('[name="s3-access-key"]')[0].value
s3_secret_access_key = encodeURIComponent($('[name="s3-secret-key"]')[0].value)
s3_bucket = $('[name="s3-bucket"]')[0].value
s3_region = $('[name="s3-region"]')[0].value
s3_signature_version = $('[name="s3-signature-version"]')[0].value
$('#s3_error_div').html('');
s3_backend_type = $("#s3-backend-type").val()
if (s3_backend_type != 'amazon') {
s3_endpoint = $('[name="s3-endpoint-url"]')[0].value
if ($('[name="s3-endpoint-url"]')[0].value.startsWith('https')) {
s3_ssl = 'True'
} else {
s3_ssl = 'False'
}
}
else {
s3_endpoint = ''
s3_ssl = 'True'
}
formData.append('s3_access_key_id', s3_access_key_id);
formData.append('s3_secret_access_key', s3_secret_access_key);
formData.append('s3_region', s3_region);
formData.append('s3_bucket', s3_bucket);
formData.append('s3_signature_version', s3_signature_version);
formData.append('s3_endpoint', s3_endpoint);
formData.append('s3_ssl', s3_ssl);
formData.append('s3certificate', document.getElementById('s3certificate').files[0]);
$.ajax({
url: 'validate_s3_credentials',
type: 'POST',
data: formData,
async: true,
cache: false,
contentType: false,
processData: false,
beforeSend: function() {
$('#s3-spinner').removeClass("hidden")
},
complete: function(result) {
$('#s3-spinner').addClass("hidden")
},
error: function(result) {
$('#submit').attr('disabled','disabled')
$('#s3-spinner').addClass("hidden")
$('#press_tab').removeClass("hidden")
$('#s3_error_div').html(result.responseText);
s3_status = false;
},
success: function(result) {
$('#s3-spinner').addClass("hidden")
options = ""
Invalid = false
s3_status = true;
$('[name="next"]').trigger( "click" );
}
});
}
function setRequired() {
if(IsV3) {
$('[name="domain-name"]').attr("required", "true");
}
else {
$('[name="domain-name"]').removeAttr('required')
}
}
function setRequiredFields(type)
{
$('#submit').attr('disabled','disabled');
$('#press_tab').removeClass("hidden")
if(type=='S3') {
nfs_share_status = false;
$('[name="s3-access-key"]').attr("required", "true");
$('[name="s3-secret-key"]').attr("required", "true");
$('[name="s3-bucket"]').attr("required", "true");
if($("#s3-backend-type").val()=='compatible')
$('[name="s3-endpoint-url"]').attr("required", "true");
$('[name="storage-nfs-export"]').removeAttr("required");
$('[name="storage-nfs-options"]').removeAttr("required");
}
else if(type=="NFS"){
s3_status = false;
$('[name="s3-access-key"]').removeAttr("required");
$('[name="s3-secret-key"]').removeAttr("required");
$('[name="s3-bucket"]').removeAttr("required");
$('[name="s3-endpoint-url"]').removeAttr("required");
$('[name="storage-nfs-export"]').attr("required","true");
$('[name="storage-nfs-options"]').attr("required","true");
}
}
function validateNTP(){
var ntp = $('[name="ntp-servers"]').val();
ntp_ele = $('[name="ntp-servers"]')[0];
message = $('[name="ntp-servers-msg"]')[0];
if(ntp.trim().length == 0)
{
ntp_ele.style.borderColor = badColor;
message.style.color = badColor;
message.innerHTML = "This field cannot be empty.";
$('[name="ntp-servers"]').val('');
return false;
}
else
{
ntp_ele.style.borderColor = goodColor;
message.innerHTML = "";
}
}
</script>
<!--page start-->
<div class="row">
<div class="col-lg-12">
<ul class="nav nav-tabs">
<li class="active"><a href="#config_details"><b>Configure Appliance</b></a></li>
% if defined('virtual_ip'):
<li><a href="#ansible_outputs"><b>Ansible Output</b></a></li>
%else:
<li title="Please configure your TrilioVault machine to enable." class="no-cursor">
<a class="not-configured" href="#ansible_outputs"><b>Ansible Output</b></a>
</li>
%end
</ul>
<div class="tab-content">
<div id="config_details" class="tab-pane fade in active">
<section class="panel">
<form role="form" id="configure_openstack" class="form-configure form-horizontal" action="/configure_openstack" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-lg-12">
<section class="panel">
<header class="panel-heading">
TrilioVault Nodes
</header>
<div class="panel-body">
<div class="form-group required">
<label class="col-sm-2 control-label">Controller Nodes</label>
<div class="col-sm-10">
<input id="host" name="triliovault-hostnames" {{'value=' + triliovault_hostnames if (defined('triliovault_hostnames')) else ''}} type="text" class="form-control" placeholder="192.168.2.2=host1" title="Please include one or three TrilioVault nodes, separated by commas. Format is 'IP Address=Hostname'." required onblur="validateHost();" multiple>
<!--span class="help-block">Please include one or three (for HA) TrilioVault nodes, separated by commas. Format is [IP Address=Hostname]. </span-->
<span id="host-msg"></span>
</div>
</div>
<div class="form-group required" id="HA">
<label class="col-sm-2 control-label">Virtual IP Address</label>
<div class="col-sm-10">
<input name="virtual-ip" {{'value=' + v_ip if (defined('v_ip')) else ''}} type="text" class="form-control" placeholder="192.168.2.1/24" id="virtualIP" title="Please include Virtual IP in same network as Host IPs. The format for virtual IP is IP/netmask." required onblur='validateVIP();'>
<!--span class="help-block">Please include the virtual ip address if TrilioVault is configured for HA.</span-->
<span id="vip-msg"></span>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label">Name Servers</label>
<div class="col-sm-10">
<input id="name-server" name="name-server" class="form-control" type="text" {{'value=' + name_server if (defined('name_server') and len(name_server)) else ''}} onblur="name_server_blur();" placeholder="8.8.8.8" title="Comma separated list of name servers for name resolution." required multiple>
<!--span class="help-block">Comma separated list of name servers for name resolution</span-->
<span id="ns-msg"></span>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label">Domain Search Order</label>
<div class="col-sm-10">
<input name="domain-search-order" id="domain-search-order" class="form-control" type="text" {{'value=' + domain_search_order if (defined('domain_search_order') and len(domain_search_order)) else ''}} placeholder="example.com example.net" onblur="domain_search_blur();" title="Comma separated domain names." required>
<!--span class="help-block">Comma separated domain names</span-->
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label">NTP Servers</label>
<div class="col-sm-10">
%if ('ntp_servers' in locals() and len(ntp_servers)):
<input id="ntp-servers-id" name="ntp-servers" class="form-control" type="text" {{'value=' + ntp_servers}} placeholder="0.centos.pool.ntp.org,0.pool.ntp.org,1.pool.ntp.org" title="Comma separated NTP Servers." required multiple onblur="validateNTP();">
%else :
<input id="ntp-servers-id" name="ntp-servers" class="form-control" type="text" value="0.centos.pool.ntp.org" placeholder="0.centos.pool.ntp.org,0.pool.ntp.org,1.pool.ntp.org" title="Comma separated NTP Servers." required multiple onblur="validateNTP();">
%end
<span name="ntp-servers-msg" class="help-block"></span>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label">Timezone</label>
<div class="col-sm-10">
<select name="timezone" id="timezone" class="form-control" title="Timezone for the appliance.">
%for tz in timezones:
%if tz==timezone:
<option value="{{tz}}" selected>{{tz}}</option>
%else:
<option value="{{tz}}">{{tz}}</option>
%end
%end
</select>
<!--span class="help-block">Timezone for the appliance</span-->
</div>
</div>
</div>
</section>
<section class="panel">
<header class="panel-heading">
OpenStack Credentials
</header>
<div class="panel-body">
<div class="form-group required">
<label class="col-lg-2 control-label">Keystone URL</label>
<div class="col-lg-10">
<input id="keystone-public-url-id" name="keystone-public-url" {{'value=' + keystone_url if defined('keystone_url') else ''}} onblur='validate(this.name);' type="text" required="" placeholder="http://keystonehost:5000/v2.0" class="form-control" title="Public/Internal URL is used to create and validate user tokens. Please make sure URL includes version string.">
<span class="help-block" id="keystone-public-url"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="publicurl-spinner"></i>
<!--span class="help-block">Public/Internal URL is used to create and validate user tokens. Please make sure URL includes version string</span-->
</div>
</div>
<div class="form-group required">
<label class="control-label col-lg-2" for="inputSuccess">Endpoint Type</label>
<div class="col-lg-10">
%if 'endpoint_type' not in locals():
<div class="radio-inline">
<label>
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" value="public" required>Public
</label>
</div>
<div class="radio-inline">
<label>
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" checked value="internal" >Internal
</label>
</div>
<div class="radio-inline">
<label>
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" value="admin">Admin
</label>
</div>
%else:
<div class="radio-inline">
<label>
%if endpoint_type == 'public':
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" checked value="public" >Public
%else:
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" value="public" required>Public
%end
</label>
</div>
<div class="radio-inline">
<label>
%if endpoint_type == 'internal':
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" checked value="internal" >Internal
%else:
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" value="internal" >Internal
%end
</label>
</div>
<div class="radio-inline">
<label>
%if endpoint_type == 'admin':
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" checked value="admin" >Admin
%else:
<input type="radio" name="endpoint-type" aria-describedby="endpoint_type_helpblock" value="admin">Admin
%end
</label>
</div>
%end
</div>
<!-- col-lg-10 -->
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Domain ID</label>
<div class="col-lg-10">
<input id="domain-name-id" name="domain-name" {{'value=' + domain_name if defined('domain_name') else ''}} type="text" placeholder="default" class="form-control" onblur='validate(this.name);' title="Domain ID should be same as that on your OpenStack and it is case sensitive." required>
<!--span class="help-block">Domain ID should be same as that on your OpenStack and it is case sensitive.</span-->
<span class="subtext" style="color:#737373;">**Admin/Cloud Admin must have admin role assigned to the domain. You can add admin role to domain using `openstack role add --domain default --user admin admin` </span>
</div>
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Administrator</label>
<div class="col-lg-10">
<!--<input class="form-control" id="focusedInput" type="text" value="admin">-->
<input id="admin-username-id" name="admin-username" {{'value=' + admin_username if defined('admin_username') else ''}} type="text" required="" placeholder="admin" class="form-control" title="Keystone administrator.">
<!--span class="help-block">Keystone administrator</span-->
<span class="help-block"></span>
</div>
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Password</label>
<div class="col-lg-10">
<input id="admin-password-id" name="admin-password" type="password" autocomplete="off" required placeholder="" class="form-control" title="Keystone administrator password" onblur='validate(this.name);'>
<!--span class="help-block">Keystone administrator password</span-->
<span class="help-block"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="password-spinner"></i>
</div>
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Admin Tenant</label>
<div class="col-lg-10">
<select name="admin-tenant-name" id="admin-tenant-name" class="form-control" title="Keystone administrator tenant name" disabled>
%for prj in projects:
%if prj==admin_tenant_name:
<option value="{{prj}}" selected>{{prj}}</option>
%else:
<option value="{{prj}}">{{prj}}</option>
%end
%end
</select>
<!--span class="help-block">Keystone administrator tenant name</span-->
<span class="help-block"></span>
</div>
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Region Name</label>
<div class="col-lg-10">
<select name="region-name" id="region-name" class="form-control" title="Case sensitive Region Name to which TrilioVault is providing service." disabled>
%for region in regions:
%if region==region_name:
<option value="{{region}}" selected>{{region}}</option>
%else:
<option value="{{region}}">{{region}}</option>
%end
%end
</select>
<!--span class="help-block">Region Name to which TrilioVault is providing service. Region Name is case sensitive.</span-->
<span class="help-block"></span>
</div>
</div>
<div class="form-group required">
<label class="col-lg-2 control-label">Trustee Role</label>
<div class="col-lg-10">
<select name="trustee-role" id="trustee-role" class="form-control" title="Role name used to create trust between triliovault, user and tenant." disabled>
%for role in roles:
%if role==trustee_role:
<option value="{{role}}" selected>{{role}}</option>
%else:
<option value="{{role}}">{{role}}</option>
%end
%end
</select>
<!--span class="help-block">Role name used to create trust between triliovault, user and tenant </span-->
<span class="help-block"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="trustee-spinner"></i>
</div>
</div>
</div>
</section>
<section class="panel">
<header class="panel-heading">
Backup Storage Configuration
</header>
<div class="panel-body">
<div class="form-group required">
<label class="col-lg-2 control-label" for="openstack_distro">Openstack Dist</label>
<div class="col-lg-10">
<select name="openstack_dist_mount_path" id="openstack_distro" class="form-control">
%for dist in ["Others", "RHOSP", "Kolla-Ansible"]:
%if 'openstack_dist' in locals() and openstack_dist==dist:
<option value="{{dist}}" selected>{{openstack_dist}}</option>
%else:
<option value="{{dist}}">{{dist}}</option>
%end
%end
</select>
</div>
</div>
<div class="form-group required">
<label class="control-label col-lg-2" for="inputSuccess">Backup Storage</label>
<div class="col-lg-10">
<div class="radio-inline">
<label>
%if 'backup_target_type' in locals() and backup_target_type == 'NFS':
<input type="radio" name="backup_target_type" aria-describedby="backup_target_helpblock" checked value="NFS" onchange="$($('#s3storage-panel')[0]).addClass('hidden');$($('#nfsstorage-panel')[0]).removeClass('hidden');" onclick="setRequiredFields('NFS')">NFS
%else:
<input type="radio" name="backup_target_type" aria-describedby="backup_target_helpblock" value="NFS" onchange="$($('#s3storage-panel')[0]).addClass('hidden');$($('#nfsstorage-panel')[0]).removeClass('hidden');" onclick="setRequiredFields('NFS')">NFS
%end
</label>
</div>
<div class="radio-inline">
<label>
%if 'backup_target_type' in locals() and backup_target_type == 'S3':
<input type="radio" name="backup_target_type" aria-describedby="backup_target_helpblock" checked value="S3" onchange="$($('#nfsstorage-panel')[0]).addClass('hidden');$($('#s3storage-panel')[0]).removeClass('hidden');" onclick="setRequiredFields('S3')">S3
%else:
<input type="radio" name="backup_target_type" aria-describedby="backup_target_helpblock" value="S3" onchange="$($('#nfsstorage-panel')[0]).addClass('hidden');$($('#s3storage-panel')[0]).removeClass('hidden');" onclick="setRequiredFields('S3')">S3
%end
</label>
</div>
</div>
<!-- col-lg-10 -->
</div>
%if 'backup_target_type' in locals() and backup_target_type == 'NFS':
<div class="panel-group" id="nfsstorage-panel">
%else:
<div class="panel-group hidden" id="nfsstorage-panel">
%end
<div class="panel panel-default" id="panel3">
<header class="panel-heading">
NFS Storage
</header>
<div id="collapseThree" class="panel-collapse collapse in">
<div class="panel-body">
<div class="form-group required" >
<label class="control-label col-lg-2">NFS Export</label>
<div class="col-lg-10">
<input name="storage-nfs-export" {{'value='+storage_nfs_export if (defined('storage_nfs_export') and len(storage_nfs_export)) else ''}} id="storage-nfs-export" type="text" placeholder="server:/var/nfs" class="form-control" title="Please enter list of NFS shares separated by commas." aria-describedby="nfs_helpblock" onblur='validate_nfs_share(this);' multiple>
<span id="nfs_helpblock" class="help-block"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="nfs-spinner"></i>
<!--span id="nfs_helpblock" class="help-block">Please enter list of NFS shares separated by commas</span-->
</div>
</div>
<div class="form-group required">
<label class="control-label col-lg-2">NFS Options<i class="fa fa-spinner fa-spin hidden spinner-size" id="nfs-spinner"></i></label>
<div class="col-lg-10">
<input name="storage-nfs-options" {{'value=' + storage_nfs_options if defined('storage_nfs_options') else ''}} id="storage-nfs-options" type="text" required placeholder="" class="form-control" title="Please enter list of NFS options separated by commas." aria-describedby="nfs_options_helpblock">
<!--span id="nfs_options_helpblock" class="help-block">Please enter list of NFS options separated by commas</span-->
</div>
</div>
</div>
</div>
</div>
</div>
%if 'backup_target_type' in locals() and backup_target_type == 'S3':
<div class="panel-group" id="s3storage-panel">
%else:
<div class="panel-group hidden" id="s3storage-panel">
%end
<div class="panel panel-default" id="panel6">
<header class="panel-heading">
S3 Object Storage
</header>
<div id="collapseSix" class="panel-collapse collapse in">
<div class="panel-body">
<!--Ask user to specify which s3 compatible-->
<div class="form-group" id="s3-compatible-selection-div">
<label class="control-label col-lg-2">S3 Compatible</label>
<div class="col-lg-10">
<select id="s3-backend-type" name="s3-backend-type" class="form-control">
%if 's3_backend_type' in locals() and s3_backend_type.lower() == 'compatible':
<option value="amazon">Amazon S3</option>
<option value="compatible" selected>Other S3 Compatible</option>
%else:
<option value="amazon" selected>Amazon S3</option>
<option value="compatible">Other S3 Compatible</option>
%end
</select>
<span id="s3url_helpblock" class="help-block hidden"></span>
</div>
</div>
%if 's3_backend_type' in locals() and s3_backend_type.lower() == 'compatible':
<div class="form-group" id="s3-endpoint-url-div">
%else:
<div class="form-group hidden" id="s3-endpoint-url-div">
%end
<label class="control-label col-lg-2">Endpoint URL</label>
<div id= "s3-endpoint-url" class="col-lg-10">
<input name="s3-endpoint-url" title="" onblur="checkHttps(this,'s3_cert_upload_public');" {{'value=' + vault_s3_endpoint_url if (defined('vault_s3_endpoint_url') and len(vault_s3_endpoint_url)) else ''}} type="text" placeholder="http://127.0.0.1:9000" class="form-control" >
<span id="s3url_helpblock" class="help-block hidden"></span>
<div id="s3_cert_upload_public" class="row">
<br/>
<div class="col-sm-5">
<input name="s3certificate" id="s3certificate" type="file"
title="Certificate" style="display:none"/>
<label for='s3certificate' class="upload-icon">
<i class="fa fa-upload" ></i>Certificate</label>
<span id="filename_s3certificate"></span>
</div>
<input id="s3_enable_tls" type="hidden" {{'value=' + s3_enable_tls if defined('s3_enable_tls') else 'off'}} name="s3_enable_tls">
</div>
</div>
</div>
<div class="form-group" id="s3-access-key-div">
<label class="control-label col-lg-2">Access Key</label>
<div class="col-lg-10">
<input name="s3-access-key" {{'value=' + vault_s3_access_key_id if (defined('vault_s3_access_key_id') and len(vault_s3_access_key_id)) else ''}} type="text" placeholder="" class="form-control">
</div>
</div>
<div class="form-group" id="s3-secret-key-div">
<label class="control-label col-lg-2">Secret Key</label>
<div class="col-lg-10">
<input name="s3-secret-key" {{'value=' + vault_s3_secret_access_key if (defined('vault_s3_secret_access_key') and len(vault_s3_secret_access_key)) else ''}} type="text" placeholder="" class="form-control">
</div>
</div>
<div class="form-group" id="s3-region-div">
<label class="control-label col-lg-2">Region</label>
<div class="col-lg-10">
<input name="s3-region" {{'value=' + vault_s3_region_name if (defined('vault_s3_region_name') and len(vault_s3_region_name)) else ''}} type="text" placeholder="" class="form-control">
<span id="s3url_helpblock" class="help-block hidden"></span>
</div>
</div>
<div class="form-group" id="s3-signature-version-div">
<label class="control-label col-lg-2">Signature Version</label>
<div class="col-lg-10">
<input name="s3-signature-version" {{'value=' + vault_s3_signature_version if (defined('vault_s3_signature_version') and len(vault_s3_signature_version)) else 'default'}} type="text" placeholder="" class="form-control">
<span id="s3url_helpblock" class="help-block hidden"></span>
</div>
</div>
<div class="form-group" id="s3-bucket-div">
<label class="control-label col-lg-2">Bucket Name</label>
<div class="col-lg-10">
<input name="s3-bucket" {{'value=' + vault_s3_bucket if (defined('vault_s3_bucket') and len(vault_s3_bucket)) else ''}} type="text" placeholder="" class="form-control" onblur='validate_s3_credentials();'>
<i class="fa fa-spinner fa-spin hidden spinner-size" id="s3-spinner"></i><span id="s3_error_div" class="error_msg"></span>
</div>
</div>
</div>
<!-- Panel Body -->
</div>
<!-- id="collapseSix" class="panel-collapse collapse in" -->
</div>
<!-- panel6 -->
</div>
<!-- S3 Storage Panel -->
<div class="form-group">
<label class="control-label col-lg-2" for="inputSuccess">Import Workloads</label>
<div class="col-lg-10">
<div class="checkbox">
%if 'workloads_import' in locals() and workloads_import == 'True':
<label>
<input type="checkbox" name="workloads-import" checked id="workloads-import">
Import workloads from backup storage.<span class="subtext">Choose this option if you are upgrading TrilioVault VM.</span>
</label>
%else:
<label>
<input type="checkbox" name="workloads-import" id="workloads-import">
Import workloads from backup storage.
</label>
%end
</div>
</div>
</div>
</div>
</section>
<a data-toggle="collapse" href="#tvault_advanced_settings" style="float:right;"><i class="fa fa-cog"> Advanced Setting</i></a>
<br/>
<div id="tvault_advanced_settings" class="collapse">
<section class="panel">
<header class="panel-heading">
Advanced Setting
</header>
<div class="panel-body">
<div class="form-group">
<label class="col-sm-2 control-label" id="dm-label">DataMover <span id="dm_public_label">Public</span> URL<span id='dm_common_url_extention'>(s)</span><i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<div class="input-group custom-input"><input id="dm-endpoint-public" name="dm-endpoint-public" type="text" placeholder="http://keystonehost:port" class="form-control" title="DataMover URL should be the IP of your DataMover controller node with port." onblur="validate_dm_url(this);validateIPV6FormatEndpoints(this);" {{'value=' + dm_endpoint_public if defined('dm_endpoint_public') else ''}}><span class="input-group-addon"><i class="fa fa-info-circle" title="DMAPI URLs are defined in keystone service catalog. If you wish to change, change using openstack cli or delete urls from keystone service catalog and you will able to enter the urls here."></i></span></div>
<span id="dm-msg-public"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="dmurl-spinner"></i><a id="dm-advanced" data-toggle="collapse" href="#dm_enpoints_advanced_div" role="button" aria-expanded="false" aria-controls="dm_enpoints_advanced_div" class="btn-link custom-icon" title="Advanced Settings"><i class="fa fa-chevron-down" id="dm-arrow"></i></a>
</div>
</div>
<div id="dm_enpoints_advanced_div" class="collapse">
<div class="form-group">
<label class="col-sm-2 control-label">DataMover Admin URL<i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<input id="dm-endpoint-admin" name="dm-endpoint-admin" type="text" placeholder="http://keystonehost:port" class="form-control custom-input" title="DataMover URL should be the IP of your DataMover controller node with port." onblur="validate_dm_url(this);validateIPV6FormatEndpoints(this);" {{'value=' + dm_endpoint_admin if defined('dm_endpoint_admin') else ''}}>
<span id="dm-msg-admin"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="dmurl-spinner"></i>
</div>
</div>
<div class="form-group divider_div">
<label class="col-sm-2 control-label">DataMover Internal URL<i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<input id="dm-endpoint-internal" name="dm-endpoint-internal" type="text" placeholder="http://keystonehost:port" class="form-control custom-input" title="DataMover URL should be the IP of your DataMover controller node with port." onblur="validate_dm_url(this);validateIPV6FormatEndpoints(this);" {{'value=' + dm_endpoint_internal if defined('dm_endpoint_internal') else ''}}>
<span id="dm-msg-internal"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="dmurl-spinner"></i>
</div>
</div>
<input type="hidden" value="false" id="create-dm-endpoints" name="create-dm-endpoints" />
</div><!--advance dm endpoints-->
<div class="form-group required">
<label class="col-sm-2 control-label">TrilioVault <span id="wlm_public_label">Public</span> URL<span id='wlm_common_url_extention'>(s)</span><i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<div class="input-group custom-input"><input id="wlm-endpoint-public" name="wlm-endpoint-public" type="text" placeholder="http://keystonehost:port" class="form-control" title="" onblur="validateIPV6FormatEndpoints(this);checkHttps(this,'cert_upload_public');generate_wlm_url(this);" {{'value=' + wlm_endpoint_public if defined('wlm_endpoint_public') else ''}}><span class="input-group-addon"><i class="fa fa-info-circle" title="TrilioWLM endpoints are created on the TrilioVault appliance. Please provide Virtual IPs for specific networks which you want to use for endpoint URLs. If not provided, VIP provided in the main section will be used for endpoint creation."></i></span></div>
<span id="wlm-msg-public"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="wlm-spinner"></i><a id="wlm-advanced" data-toggle="collapse" href="#wlm_enpoints_advanced_div" role="button" aria-expanded="false" aria-controls="wlm_enpoints_advanced_div" class="btn-link custom-icon" title="Advanced Settings"><i class="fa fa-chevron-down" id="wlm-arrow"></i></a>
<div id="cert_upload_public" class="row hidden">
<br/>
<div class="col-sm-5">
<input name="certificate" id="certificate" type="file" {{'value=' + cert if defined('cert') else ''}} title="Certificate" style="display:none"/><label for='certificate' class="upload-icon"> <i class="fa fa-upload" id="OpenImgUpload"></i>Certificate</label>
%if 'cert' in locals():
<span id="filename_certificate" class="subtext" style="color:#75b93e;">Certificate Already Uploaded</span>
%else:
<span id="filename_certificate"></span>
%end
</div>
<div class="col-sm-5">
<input name="privatekey" id="privatekey" type="file" {{'value=' + privatekey if defined('privatekey') else ''}} title="Private Key" style="display:none"/><label for="privatekey" class="upload-icon"> <i class="fa fa-upload" id="OpenImgUpload"></i>Private Key</label>
%if 'privatekey' in locals():
<span id="filename_privatekey" class="subtext" style="color:#75b93e;">Key Already Uploaded</span>
%else:
<span id="filename_privatekey"></span>
%end
</div>
</div><input type="hidden" {{'value=' + enable_tls if defined('enable_tls') else 'off'}} name="enable_tls" id="enable_tls"/>
</div>
</div>
<div id="wlm_enpoints_advanced_div" class="collapse">
<div class="form-group required">
<label class="col-sm-2 control-label">TrilioVault Admin URL<i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<input id="wlm-endpoint-admin" name="wlm-endpoint-admin" type="text" placeholder="http://keystonehost:port" class="form-control custom-input" title="" onblur="validateIPV6FormatEndpoints(this);generate_wlm_url(this);" {{'value=' + wlm_endpoint_admin if defined('wlm_endpoint_admin') else ''}}>
<span id="wlm-msg-admin"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="wlm-spinner"></i>
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label">TrilioVault Internal URL<i class="fa fa-spinner fa-spin hidden spinner-size" id="dm-spinner"></i></label>
<div class="col-sm-10">
<input id="wlm-endpoint-internal" name="wlm-endpoint-internal" type="text" placeholder="http://keystonehost:port" class="form-control custom-input" title="" onblur="validateIPV6FormatEndpoints(this);generate_wlm_url(this);" {{'value=' + wlm_endpoint_internal if defined('wlm_endpoint_internal') else ''}}>
<span id="wlm-msg-internal"></span><i class="fa fa-spinner fa-spin hidden spinner-size" id="wlm-spinner"></i>
</div><!--col-sm-10-->
</div><!--form-grp-->
<br/>
</div><!--end of row-->
<div class="form-group">
<label class="col-sm-2 control-label">TrilioVault Services Password</label>
<div class="col-sm-10">
<div class="input-group custom-input"><input name="tvault_services_password" type="password" placeholder="" class="form-control" title="TrilioVault services password" ><span class="input-group-addon"><i class="fa fa-info-circle" title="The password will be set against MySQL, RabbitMQ and Nginx admin user on TVault appliance. On Openstack, it will be set against TVault user in Keystone.
Default to System generated service password."></i></span></div>
</div>
</div>
<!-- Start of External DB Div -->
%if not 'external_db' in locals() or locals().get('external_db') == 'True':
<div class="form-group">
<label class="col-sm-2 control-label">External DB Connection String</label>
<div class="col-sm-10">
<input name="tvault_external_db" id="tvault_external_db_id" type="text" placeholder="mysql://user:password@<ip>/workloadmgr?charset=utf8" class="form-control" title="External DB Connection String" onblur='validateDBConnectionString(this.value);' {{('value=' + sql_connection + ' disabled="disabled"') if defined('sql_connection') else ''}}>
<span class="help-block" id="tvault_external_help_id"></span>
</div>
</div>
%end
<!-- End of External DB Div -->
</div><!--end of body-->
</section>
</div>
<button id="submit" class="btn btn-primary" disabled>Submit</button>
<span class="help-block" id="press_tab"><b>Note: </b><i>Submit</i> button will be enabled once the sections "TrilioVault Nodes, OpenStack Credentials, Backup Storage Configuration" get validated.</span>
</div>
</div>
</form>
<div id="loader" class="hidden"></div>
</section>
</div>
<div id="ansible_outputs" class="tab-pane fade">
<div w3-include-html="ansible-playbook"></div>
<script>includeHTML();</script>
</div>
</div>
</div>
</div>
<!-- page end-->
<!-- javascripts -->
<script>
var keystone_url_status = false;
var nfs_share_status = false
var domain_status = false
var s3_status = false;
function validateDBConnectionString(){
// Function to validate Database Connection String.
conn_string = $('#tvault_external_db_id').val()
var pattern = /^(?:([^:\/?#\s]+):\/{2})?(?:([^@\/?#\s]+)@)?([^\/?#\s]+)?(?:\/([^?#\s]*))?(?:[?]([^#\s]+))?\S*$/;
var matches = conn_string.match(pattern);
var params = {};
if (matches[5] != undefined) {
matches[5].split('&').map(function(x){
var a = x.split('=');
params[a[0]]=a[1];
});
}
protocol = matches[1] != undefined ? matches[1] : undefined
user = matches[2] != undefined ? matches[2].split(':')[0] : undefined
password = matches[2] != undefined ? matches[2].split(':')[1] : undefined
host = matches[3] != undefined ? matches[3] : undefined
db = matches[4] != undefined ? matches[4].split('/') : undefined
param = matches[5] != undefined ? params : undefined
var ele = document.getElementById("tvault_external_db_id");
var message = document.getElementById("tvault_external_help_id");
if(protocol && user && password && host && db)
{
url = 'validate_db_connection_string?conn=' + encodeURIComponent(matches[0]);
$.ajax({url: url,
beforeSend: function() {
},
complete: function(result) {
if (result.status == 200){
ele.style.borderColor = goodColor;
message.style.color = goodColor;
message.innerHTML = "Validation Successful.";
}
else{
ele.style.borderColor = badColor;
message.style.color = badColor;
message.innerHTML = "Invalid Connection String. please check tvault-config log for details.";
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
}
},
error: function(error){
ele.style.borderColor = badColor;
message.style.color = badColor;
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
message.innerHTML = "Invalid Connection String. please check tvault-config log for details.";
}
})
}
else{
ele.style.borderColor = badColor;
message.style.color = badColor;
if( $("#tvault_external_db_id").val().length === 0 ) {
$("#tvault_external_db_id").removeAttr("style")
}else{
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
message.innerHTML = "Improper Connection string. please provide in correct format.";
}
}
}
var spinner = $('#loader');
$("#submit").click(function() {
window.scrollTo(0, 0);
$('#configure_openstack').submit(function(){
if ($('#configure_openstack').valid()) { spinner.removeClass("hidden"); }
});
});
$(".nav-tabs a").click(function(){
$(this).tab('show');
});
$('#s3-ssl-checkbox-id').change(function(){
if($(this).is(':checked'))
{
$('[name="s3-use-ssl"]')[0].value = 'True'
}
else
{
$('[name="s3-use-ssl"]')[0].value = 'False'
}
});
function validateIPV6FormatEndpoints(ele)
{
var original_url = $(ele).val();
if(original_url.length <= 0)
return false;
var only_ip = original_url.split('/')[2];
var message = $(ele).next();
if(((only_ip.match(/:/gi)).length > 2)&&((only_ip.indexOf("[")==-1)||(only_ip.indexOf("]")==-1)))
{
ele.style.borderColor = badColor;
message.style.color = badColor;
message.innerHTML = "Please enclose the IPv6 address in square brackets like http://<b>[</b>DataMover Controller Node<b>]</b>:8784";
return false;
}else{
ele.style.borderColor = goodColor;
message.innerHTML = "";
}
}
function validate_dm_url(ele)
{
var url = $(ele).val().toLowerCase();
if(url.length <= 0)
generate_dm_url(ele.id)
else if((ele.id=='dm-endpoint-public') && ($("#dm-arrow").hasClass('fa-chevron-down')))
{
//if user change public dm url without clicking down arrow, then all urls must have same value.
var dm_url = $('#dm-endpoint-public').val();
$('#dm-endpoint-internal').val(dm_url);
$('#dm-endpoint-admin').val(dm_url);
}
}
function checkHttps(ele,id)
{
var url = $(ele).val().toLowerCase();
if(url.indexOf('https')!= -1)
{
$("#"+id).removeClass('hidden');
if (id == 's3_cert_upload_public'){
$("#s3_enable_tls").val('on');
}
if (id == 'cert_upload_public'){
$("#enable_tls").val('on');
}
}
else
{
if (id == 's3_cert_upload_public'){
$("#s3_enable_tls").val('off');
}
if (id == 'cert_upload_public'){
$("#enable_tls").val('off');
}
$("#"+id).addClass('hidden');
}
}
function generate_dm_url(which_one)
{
if(($('#dm-endpoint-public').val().length > 0) && ($('#dm-endpoint-admin').val().length > 0) && ($('#dm-endpoint-internal').val().length > 0))
{
return false;
}
public_url = $('[name="keystone-public-url"]')[0].value
var url_string = public_url.split('/');
var ip_url="";
if((url_string[2].match(/:/gi)) == null)
{
ip_url = url_string[2]
var dm_url = url_string[0] + "//" + ip_url + ":8784";
if(which_one=='all')
{
$('#dm-endpoint-public').val(dm_url);
$('#dm-endpoint-internal').val(dm_url);
$('#dm-endpoint-admin').val(dm_url);
}
else
{
$('#'+which_one).val(dm_url);
}
}
else if((url_string[2].match(/:/gi)).length > 2)
{
first_pos=url_string[2].indexOf("[");
last_pos=url_string[2].indexOf("]");
ip_url = url_string[2].slice(first_pos+1,last_pos)
var dm_url = url_string[0] + "//[" + ip_url+ "]:8784";
if(which_one=='all')
{
$('#dm-endpoint-public').val(dm_url);
$('#dm-endpoint-internal').val(dm_url);
$('#dm-endpoint-admin').val(dm_url);
}
else
{
$('#'+which_one).val(dm_url);
}
}
else if((url_string[2].match(/:/gi)).length == 1)
{
ip_url = url_string[2].split(':')
var dm_url = url_string[0] + "//" + ip_url[0] + ":8784";
if(which_one=='all')
{
$('#dm-endpoint-public').val(dm_url);
$('#dm-endpoint-internal').val(dm_url);
$('#dm-endpoint-admin').val(dm_url);
}
else
{
$('#'+which_one).val(dm_url);
}
}
}
function generate_wlm_url(ele)
{
if(($('#wlm-endpoint-public').val().length > 0) && ($('#wlm-endpoint-admin').val().length > 0) && ($('#wlm-endpoint-internal').val().length > 0))
{
return false;
}
var url = $(ele).val().toLowerCase();
if(url.length <= 0)
validateVIP();
else if($(ele).id=="wlm-endpoint-public" && $("#wlm-arrow").hasClass('fa-chevron-down'))
{
//if user change public wlm url without clicking down arrow, then all urls must have same value.
var wlm_url = $('#wlm-endpoint-public').val();
$('#wlm-endpoint-internal').val(wlm_url);
$('#wlm-endpoint-admin').val(wlm_url);
}
}
function validate(name) {
if(name == "keystone-admin-url" || name == "keystone-public-url"){
var original_url = $('[name="'+name+'"]')[0].value;
if(original_url.length <= 0)
return false;
var only_ip = original_url.split('/')[2];
var ele = document.getElementsByName(name)[0];
var message = document.getElementById(name);
if(only_ip.indexOf(":")!=-1)
{
if(((only_ip.match(/:/gi)).length > 2)&&((only_ip.indexOf("[")==-1)||(only_ip.indexOf("]")==-1)))
{
ele.style.borderColor = badColor;
message.style.color = badColor;
if(name == "keystone-admin-url")
message.innerHTML = "Please enclose the IPv6 address in square brackets like http://<b>[</b>keystonehost<b>]</b>:35357/v3";
else
message.innerHTML = "Please enclose the IPv6 address in square brackets like http://<b>[</b>keystonehost<b>]</b>:5000/v3";
return false;
}
}
url = "validate_keystone_url?url="+ele.value;
ele.style.borderColor = goodColor;
message.innerHTML = "";
validate_keystone_url(url, ele);
} else if(name == "admin-password" || name == "domain-name"){
elm = document.getElementsByName(name)[0];
validate_keystone_credentials(elm);
} else {
return false;
}
}
function validate_keystone_url(url, inputelement) {
public_url = $('[name="keystone-public-url"]')[0].value
$.ajax({url: url,
beforeSend: function() {
$('#adminurl-spinner').removeClass("hidden")
$('#publicurl-spinner').removeClass("hidden")
$('#dmurl-spinner').removeClass("hidden")
//$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).addClass("hidden")
$($(inputelement).parent()[0]).removeClass("has-error")
$($(inputelement).parent()[0]).removeClass("has-success")
},
complete: function(result) {
$('#adminurl-spinner').addClass("hidden")
$('#publicurl-spinner').addClass("hidden")
$('#dmurl-spinner').addClass("hidden")
keystone_url_status = true;
},
error: function(error){
inputelement.style.borderColor = badColor;
message = document.getElementById(inputelement.name);
message.style.color = badColor;
message.innerHTML = "Please provide valid endpoint url.";
keystone_url_status = false;
}
})
}
function validate_keystone_credentials(inputelement) {
if(inputelement.name == 'admin-tenant-name' && IsV3 == true)
return
if(inputelement.name == 'domain-name' && IsV3 == false)
return
public_url = $('[name="keystone-public-url"]')[0].value
project_name = $('[name="admin-tenant-name"]')[0].value
username = $('[name="admin-username"]')[0].value
password = $('[name="admin-password"]')[0].value
domain_id = $('[name="domain-name"]')[0].value
endpoint_type = $('[name="endpoint-type"]:checked').val()
data = {'public_url':public_url,'endpoint_type': endpoint_type,'project_name':project_name,
'username':username,'password':password,'domain_id':domain_id};
$.ajax({
type: 'POST',
url: 'validate_keystone_credentials',
data:data,
async:false,
beforeSend: function(xhr) {
$('#password-spinner').removeClass("hidden")
$('#trustee-spinner').removeClass("hidden")
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).addClass("hidden")
$($(inputelement).parent()[0]).removeClass("has-error")
$($(inputelement).parent()[0]).removeClass("has-success")
},
complete: function(result) {
$('#password-spinner').addClass("hidden")
$('#trustee-spinner').addClass("hidden")
},
error: function(result) {
$('#region-name').attr('disabled','disabled')
$('#trustee-role').attr('disabled','disabled')
$('#admin-tenant-name').attr('disabled','disabled')
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
$($(inputelement).parent()[0]).addClass("has-error")
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).removeClass("hidden")
if((result.responseText).indexOf("domain")!=-1)
$($($(inputelement).parent()[0]).find(".help-block")[0])[0].innerHTML = "Admin/Cloud Admin must have admin role assigned to the domain. You can add admin role to domain using `openstack role add --domain default --user admin admin`"
else
$($($(inputelement).parent()[0]).find(".help-block")[0])[0].innerHTML = result.responseText
domain_status = false
},
success: function(result) {
$('#trustee-role').removeAttr('disabled')
$('#region-name').removeAttr('disabled')
$('#admin-tenant-name').removeAttr('disabled')
$('#submit').removeAttr('disabled')
$('#press_tab').addClass("hidden")
$($(inputelement).parent()[0]).addClass("has-success")
options = ""
IsV3 = false
if(result.keystone_version == 'v3') {
IsV3 = true
}
setRequired()
_trustee_role = "{{trustee_role}}"
$.each(result.roles, function( index, value ) {
if (_trustee_role == value) {
options += "<option value="+ value +" selected>"+ value + "</option>"
} else {
options += "<option value="+ value +">"+ value + "</option>"
}
});
document.getElementsByName("trustee-role")[0].innerHTML = options
_region_name = "{{region_name}}"
options = ""
$.each(result.regions, function( index, value ) {
if (_region_name == value) {
options += "<option value="+ value +" selected>"+ value + "</option>"
} else {
options += "<option value="+ value +">"+ value + "</option>"
}
});
document.getElementsByName("region-name")[0].innerHTML = options
_admin_tenant_name = "{{admin_tenant_name}}"
options = ""
$.each(result.projects, function( index, value ) {
option_to_show = `${value.name} - ${value.id}`
option_to_post = `${value.name}|${value.id}`
if (_admin_tenant_name == value.name) {
options += `<option value=${option_to_post} selected>${option_to_show}</option>`
} else {
options += `<option value=${option_to_post}>${option_to_show}</option>`
}
});
document.getElementsByName("admin-tenant-name")[0].innerHTML = options
/****Populate datamover urls as per the keystone catalog***/
for (i = 0; i < result.dm_endpoints.length; i++) {
if (result.dm_endpoints[i].interface == 'public') {
$('#dm-endpoint-public').val(result.dm_endpoints[i].url);
} else if (result.dm_endpoints[i].interface == 'internal') {
$('#dm-endpoint-internal').val(result.dm_endpoints[i].url);
} else if (result.dm_endpoints[i].interface == 'admin') {
$('#dm-endpoint-admin').val(result.dm_endpoints[i].url);
}
}
if (result.dm_endpoints.length > 0) {
$('#dm-endpoint-admin,#dm-endpoint-public,#dm-endpoint-internal').attr('readonly', 'readonly')
} else {
$('#create-dm-endpoints').val('true');
$('#dm-endpoint-admin,#dm-endpoint-public,#dm-endpoint-internal').removeAttr('readonly');
/***This will pre-populate the dm urls with keystone IP***/
generate_dm_url('all');
}
Invalid = false
domain_status = true
$('[name="next"]').trigger( "click" );
}
});
}
$('[name="storage-nfs-export"]').on('itemRemoved', function(event) {
storage_nfs_export = $('#storage-nfs-export').val()
val_length = storage_nfs_export.split(",").length
if(val_length >= 1 && storage_nfs_export != "") {
$('[placeholder="server:/var/nfs"]').first().removeAttr('required')
}
if(storage_nfs_export == "") {
$('[placeholder="server:/var/nfs"]').first().attr("required", "true");
}
});
function validate_nfs_share(inputelement){
nfsshare_value = $('#storage-nfs-export').val();
if(nfsshare_value.length <= 0)
return false;
var ele = inputelement;
if (nfsshare_value.includes(',')) {
var nfsArr = nfsshare_value.trim().split(',');
} else {
var nfsArr = [ nfsshare_value.trim() ];
}
nfsArr.forEach(function (nfsshare, index) {
var only_ip = nfsshare.split(':/')[0];
var message = document.getElementById('nfs_helpblock');
if((only_ip.indexOf(":")!=-1)&&((only_ip.indexOf("[")==-1)||(only_ip.indexOf("]")==-1)))
{
ele.style.borderColor = badColor;
message.style.color = badColor;
message.innerHTML = "Please enclose the IPv6 address in square brackets like http://<b>[</b>Server<b>]</b>:/var/nfs";
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).removeClass("hidden")
return false;
} else {
ele.style.borderColor = goodColor;
message.innerHTML = "";
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).addClass("hidden")
}
$.ajax({
url: "validate_nfs_share?nfsshare="+nfsshare,
beforeSend: function() {
$('#nfs-spinner').removeClass("hidden")
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).addClass("hidden")
$($(inputelement).parent()[0]).removeClass("has-error")
$($(inputelement).parent()[0]).removeClass("has-success")
},
complete: function(result) {
$('#nfs-spinner').addClass("hidden")
},
error: function(result) {
$($(inputelement).parent()[0]).addClass("has-error")
$($($($(inputelement).parent()[0]).find(".help-block")[0])[0]).removeClass("hidden")
$($($(inputelement).parent()[0]).find(".help-block")[0])[0].innerHTML = result.responseText
nfs_share_status = false
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
return false
},
success: function(result) {
nfs_share_status = true
$($(inputelement).parent()[0]).addClass("has-success")
$('#press_tab').addClass("hidden")
}
});
});
}
function name_server_blur() {
setTimeout(function () {
if (!$("#domain-search-order").is(":focus")) add_nameserver();
}, 0)
}
function domain_search_blur() {
setTimeout(function () {
if (!$("#name-server").is(":focus")) add_nameserver();
}, 0)
}
function add_nameserver() {
nameserver = $('#name-server').val() || "";
search_order = $('#domain-search-order').val() || "";
$.ajax({
url: "add_nameserver?name_server=" + nameserver + "&domain_search_order=" + search_order,
complete: function (result) {
console.log(result)
}
});
}
function check() {
if (document.getElementById('enable_tls').checked) {
document.getElementById('cert-group').style.display = 'block';
document.getElementById('privatekey-group').style.display = 'block';
document.getElementById('fqdn-div').style.display = 'block';
} else {
document.getElementById('cert-group').style.display = 'none';
document.getElementById('privatekey-group').style.display = 'none';
document.getElementById('fqdn-div').style.display = 'none';
}
}
$('input').on('blur', function() {
if( $("#host").val().length === 0 ||
$("#virtualIP").val().length === 0 ||
$("#name-server").val().length === 0 ||
$("#domain-search-order").val().length === 0 ||
$("#ntp-servers-id").val().length === 0 ||
$("#timezone").val().length === 0 ||
$("#keystone-public-url-id").val().length === 0 ||
$("#domain-name-id").val().length === 0 ||
$("#admin-username-id").val().length === 0 ||
$("#admin-password-id").val().length === 0 ||
$("#admin-tenant-name").val().length === 0 ||
$("#region-name").val().length === 0 ||
$("#trustee-role").val().length === 0 ) {
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
} else if(keystone_url_status && domain_status && (nfs_share_status || s3_status)){
$('#submit').removeAttr('disabled')
$('#press_tab').addClass("hidden")
} else {
$('#submit').attr('disabled','disabled')
$('#press_tab').removeClass("hidden")
}
});
</script>
%rebase("layout.tpl", title="Configure OpenStack")