blob: a043699afbb5e46bf6c029ab82ad7b434267167a [file] [log] [blame]
<?php
use Airavata\Model\Workspace\Gateway;
use Airavata\Model\Workspace\GatewayApprovalStatus;
use Airavata\Model\Workspace\Notification;
use Airavata\Model\Workspace\NotificationPriority;
use Airavata\Model\Credential\Store\SummaryType;
use Illuminate\Support\Facades\Log;
class AdminUtilities
{
/**
* To create a new gateway
* @param $input
* @return string
*/
public static function add_gateway($inputs)
{
$gateway = new Gateway();
$id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
$id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
$gateway->gatewayId = $id;
$gateway->gatewayName = $inputs["gateway-name"];
$gateway->emailAddress = $inputs["email-address"];
$gateway->gatewayURL = $inputs["gateway-url"];
$gateway->gatewayAdminFirstName = $inputs["admin-firstname"];
$gateway->gatewayAdminEmail = $inputs["admin-email"];
$gateway->gatewayAdminLastName = $inputs["admin-lastname"];
$gateway->identityServerUserName = $inputs["admin-username"];
$token = AdminUtilities::create_pwd_token([
"username" => $inputs["admin-username"],
"password" => $inputs["admin-password"],
"description" => "Admin user password for Gateway " . $id
]);
$gateway->identityServerPasswordToken = $token;
$gateway->reviewProposalDescription = $inputs["project-details"];
$gateway->gatewayPublicAbstract = $inputs["public-project-description"];
$gateway->requesterUsername = Session::get('username');
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
try {
TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
return 1;
}
catch (Exception $ex) {
return -1;
}
}
public static function get_gateway( $gateway_id)
{
return TenantProfileService::getGateway( Session::get("authz-token"), $gateway_id);
}
public static function get_gateways_for_requester( $username )
{
return TenantProfileService::getAllGatewaysForUser( Session::get("authz-token"), $username );
}
public static function check_request( $inputs)
{
$gateway = new Gateway( $inputs);
$id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
$id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
$gateway->gatewayId = $id;
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::REQUESTED;
//$gateway->domain = 'airavata.' . $inputs["gateway-acronym"];
$gateway->gatewayName = $inputs["gateway-name"];
$gateway->emailAddress = $inputs["email-address"];
$gateway->gatewayPublicAbstract = $inputs["public-project-description"];
$gateway->requesterUsername = Session::get('username');
try {
TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
return 1;
} catch (Exception $ex) {
return -1;
}
}
public static function request_gateway( $inputs)
{
$gateway = new Gateway( $inputs);
$id = preg_replace('~^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$~', '', $inputs["gateway-name"]);
$id = strtolower(preg_replace('~[^a-zA-Z0-9]+~', '-', $id));
$gateway->gatewayId = $id;
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
//$gateway->domain = 'airavata.' . $inputs["gateway-acronym"];
$gateway->gatewayName = $inputs["gateway-name"];
$gateway->emailAddress = $inputs["email-address"];
//$gateway->gatewayAcronym = $inputs["gateway-acronym"];
$gateway->gatewayURL = $inputs["gateway-url"];
$gateway->gatewayAdminFirstName = $inputs["admin-firstname"];
$gateway->gatewayAdminLastName = $inputs["admin-lastname"];
$gateway->identityServerUserName = $inputs["admin-username"];
$token = AdminUtilities::create_pwd_token([
"username" => $inputs["admin-username"],
"password" => $inputs["admin-password"],
"description" => "Admin user password for Gateway " . $id
]);
$gateway->identityServerPasswordToken = $token;
$gateway->reviewProposalDescription = $inputs["project-details"];
$gateway->gatewayPublicAbstract = $inputs["public-project-description"];
$gateway->requesterUsername = Session::get('username');
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
$logoutURI = $gateway->gatewayURL;
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
return TenantProfileService::addGateway(Session::get('authz-token'), $gateway);
}
public static function get_gateway_approval_statuses()
{
$gatewayApprovalStatusObject = new GatewayApprovalStatus();
return $gatewayApprovalStatusObject::$__names;
}
public static function update_form( $gatewayId, $gatewayData){
if( isset( $gatewayData["updateRequest"])) {
return TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
}
}
public static function user_update_gateway( $gatewayId, $gatewayData){
$gateway = TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
$gateway->emailAddress = $gatewayData["email-address"];
$gateway->gatewayURL = $gatewayData["gateway-url"];
$gateway->reviewProposalDescription = $gatewayData["project-details"];
$gateway->gatewayPublicAbstract = $gatewayData["public-project-description"];
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
if( TenantProfileService::updateGateway( Session::get('authz-token'), $gateway) ){
return 1;
}
else{
//Need to find a better way for this.
// retun echo "Tenant Name is already in use";
return -1;
}
}
public static function update_gateway( $gatewayId, $gatewayData){
$gateway = TenantProfileService::getGateway( Session::get('authz-token'), $gatewayId);
if( isset( $gatewayData["cancelRequest"]))
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::CANCELLED;
else{
$gateway->gatewayName = $gatewayData["gatewayName"];
$gateway->gatewayURL = $gatewayData["gatewayURL"];
$gateway->declinedReason = $gatewayData["declinedReason"];
}
if( isset($gatewayData["createTenant"])) {
$gatewayData["declinedReason"] = " ";
if ($gateway->identityServerPasswordToken == null)
{
Session::flash("errorMessages", "Error: Please provide an admin password.");
return -1;
}
foreach ($gatewayData as $key => $data) {
// Don't check these fields, see related check above
// where we make sure that password is provided
if ($key == "gatewayAdminPassword" || $key == "gatewayAdminPasswordConfirm") {
continue;
}
if ($data == null) {
return -1;
}
}
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
$gateway = IamAdminServices::setUpGateway( Session::get('authz-token'), $gateway);
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::CREATED;
}
elseif( isset( $gatewayData["approveRequest"])){
$gateway->emailAddress = $gatewayData["emailAddress"];
$gateway->gatewayURL = $gatewayData["gatewayURL"];
$gateway->gatewayAdminFirstName = $gatewayData["gatewayAdminFirstName"];
$gateway->gatewayAdminLastName = $gatewayData["gatewayAdminLastName"];
$gateway->gatewayAdminEmail = $gatewayData["gatewayAdminEmail"];
$gateway->identityServerUserName = $gatewayData["identityServerUserName"];
if (!empty($gatewayData["gatewayAdminPassword"])) {
$token = AdminUtilities::create_pwd_token([
"username" => $gatewayData["identityServerUserName"],
"password" => $gatewayData["gatewayAdminPassword"],
"description" => "Admin user password for Gateway " . $gateway->gatewayName
]);
$gateway->identityServerPasswordToken = $token;
}
$gateway->reviewProposalDescription = $gatewayData["reviewProposalDescription"];
$gateway->gatewayPublicAbstract = $gatewayData["gatewayPublicAbstract"];
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
$logoutURI = $gateway->gatewayURL;
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
}
elseif( isset( $gatewayData["denyRequest"])){
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::DENIED;
}
elseif( isset( $gatewayData["updateGateway"])){
$gateway->emailAddress = $gatewayData["emailAddress"];
$gateway->gatewayURL = $gatewayData["gatewayURL"];
$gateway->gatewayAdminFirstName = $gatewayData["gatewayAdminFirstName"];
$gateway->gatewayAdminLastName = $gatewayData["gatewayAdminLastName"];
$gateway->gatewayAdminEmail = $gatewayData["gatewayAdminEmail"];
$gateway->identityServerUserName = $gatewayData["identityServerUserName"];
if (!empty($gatewayData["gatewayAdminPassword"])) {
$token = AdminUtilities::create_pwd_token([
"username" => $gatewayData["identityServerUserName"],
"password" => $gatewayData["gatewayAdminPassword"],
"description" => "Admin user password for Gateway " . $gateway->gatewayName
]);
$gateway->identityServerPasswordToken = $token;
}
$gateway->reviewProposalDescription = $gatewayData["reviewProposalDescription"];
$gateway->gatewayPublicAbstract = $gatewayData["gatewayPublicAbstract"];
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::APPROVED;
$logoutURI = $gateway->gatewayURL;
if(!(AdminUtilities::endsWith($logoutURI,"/"))) {
$logoutURI = $logoutURI."/";
}
$redirectURI = $logoutURI."auth/callback*";
$gateway->redirectURLs = array($logoutURI,$redirectURI);
$gateway->scope = "openid profile email org.cilogon.userinfo" ;
}
elseif( isset( $gatewayData["deployGateway"])){
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::DEPLOYED;
}
elseif( isset( $gatewayData["deactivateGateway"])){
$gateway->gatewayApprovalStatus = GatewayApprovalStatus::DEACTIVATED;
}
if( TenantProfileService::updateGateway( Session::get('authz-token'), $gateway) ){
return 1;
}
else{
//Need to find a better way for this.
// retun echo "Tenant Name is already in use";
return -1;
}
}
public static function add_tenant( $gateway){
$tenants = WSIS::getTenants();
$tenantExists = false;
foreach( $tenants as $tenant){
if( $tenant->tenantDomain == $gateway->domain){
$tenantExists = true;
}
}
if( !$tenantExists){
$gatewayDomain = $gateway->domain;
//finally create tenant
return WSIS::createTenant(1, $gateway->identityServerUserName, $gateway->identityServerPasswordToken, $gateway->emailAddress, $gateway->gatewayAdminFirstName, $gateway->gatewayAdminLastName, $gatewayDomain);
}
else
return false;
}
/**
* Method to get experiment execution statistics object
* @param $fromTime
* @param $toTime
* @return \Airavata\Model\Experiment\ExperimentStatistics
*/
public static function get_experiment_execution_statistics($fromTime, $toTime, $username, $appname, $hostname)
{
if (trim($username) == '') {
$username = null;
}
if (trim($appname) == '') {
$appname = null;
}
if (trim($hostname) == '') {
$hostname = null;
}
return Airavata::getExperimentStatistics(Session::get('authz-token'),
Config::get('pga_config.airavata')['gateway-id'], $fromTime, $toTime, $username, $appname, $hostname);
}
/**
* Method to get experiments of a particular time range
* @param $inputs
* @return array
*/
public static function get_experiments_of_time_range($inputs)
{
$experimentStatistics = AdminUtilities::get_experiment_execution_statistics(
strtotime($inputs["from-date"]) * 1000,
strtotime($inputs["to-date"]) * 1000,
$inputs['username'],
$inputs['appname'],
$inputs['hostname']
);
$experiments = array();
if ($inputs["status-type"] == "ALL") {
$experiments = $experimentStatistics->allExperiments;
}else if ($inputs["status-type"] == "COMPLETED") {
$experiments = $experimentStatistics->completedExperiments;
}else if ($inputs["status-type"] == "CREATED") {
$experiments = $experimentStatistics->createdExperiments;
}else if ($inputs["status-type"] == "RUNNING") {
$experiments = $experimentStatistics->runningExperiments;
} elseif ($inputs["status-type"] == "FAILED") {
$experiments = $experimentStatistics->failedExperiments;
} else if ($inputs["status-type"] == "CANCELED") {
$experiments = $experimentStatistics->cancelledExperiments;
}
$expContainer = array();
$expNum = 0;
foreach ($experiments as $experiment) {
//var_dump( $experiment); exit;
$expValue = ExperimentUtilities::get_experiment_values($experiment, true);
$expContainer[$expNum]['experiment'] = $experiment;
$expValue["editable"] = false;
$expContainer[$expNum]['expValue'] = $expValue;
$expNum++;
}
return $expContainer;
}
public static function create_ssh_token_for_gateway($description) {
$token = Airavata::generateAndRegisterSSHKeys(Session::get('authz-token'), $description);
}
public static function create_ssh_token_for_user($description) {
return Airavata::generateAndRegisterSSHKeys(Session::get('authz-token'), $description);
}
public static function create_pwd_token($inputs){
$username = $inputs['username'];
$password = $inputs['password'];
$description = $inputs['description'];
return $newToken = Airavata::registerPwdCredential( Session::get('authz-token'),
$username, $password, $description);
}
public static function get_all_ssh_tokens_with_description(){
return Airavata::getAllCredentialSummaries( Session::get('authz-token'), "SSH");
}
public static function get_all_pwd_tokens(){
$credential_summaries = Airavata::getAllCredentialSummaries(Session::get('authz-token'), SummaryType::PASSWD);
$result = [];
foreach ($credential_summaries as $credential_summary) {
$result[$credential_summary->token] = $credential_summary->description;
}
return $result;
}
public static function remove_ssh_token( $token){
return Airavata::deleteSSHPubKey( Session::get('authz-token'), $token);
}
public static function remove_pwd_token( $token){
return Airavata::deletePWDCredential( Session::get('authz-token'), $token);
}
public static function add_or_update_notice( $notifData, $update = false){
$notification = new Notification();
$notification->gatewayId = Session::get("gateway_id");
$notification->title = $notifData["title"];
$notification->notificationMessage = $notifData["notificationMessage"];
$notification->publishedTime = strtotime( $notifData["publishedTime"])* 1000;
$notification->expirationTime = strtotime( $notifData["expirationTime"]) * 1000;
$notification->priority = intval($notifData["priority"]);
if( $update){
$notification->notificationId = $notifData["notificationId"];
if( Airavata::updateNotification( Session::get("authz-token"), $notification) )
{
return json_encode( Airavata::getNotification( Session::get('authz-token'),
Session::get("gateway_id"),
$notifData["notificationId"] ));
}
else
0;
}
else
return Airavata::getNotification(
Session::get('authz-token'),
Session::get("gateway_id"),
Airavata::createNotification( Session::get("authz-token"), $notification) );
}
public static function delete_notice( $notificationId){
return Airavata::deleteNotification( Session::get('authz-token'), Session::get("gateway_id"), $notificationId);
}
public static function add_or_update_IDP($inputs)
{
$gatewayId = $inputs['gatewayId'];
$identityServerTenant = $inputs['identityServerTenant'];
$identityServerPwdCredToken = $inputs['identityServerPwdCredToken'];
$gp = Airavata::getGatewayResourceProfile(Session::get('authz-token'), $gatewayId);
if(!empty($identityServerTenant)){
$gp->identityServerTenant = $identityServerTenant;
}else{
$gp->identityServerTenant = "";
}
if(!empty($identityServerPwdCredToken) and $identityServerPwdCredToken != 'DO-NOT-SET'){
$gp->identityServerPwdCredToken = $identityServerPwdCredToken;
}else{
$gp->identityServerPwdCredToken = null;
}
Airavata::updateGatewayResourceProfile(Session::get('authz-token'), $gatewayId, $gp);
return true;
}
public static function endsWith($haystack, $needle) {
return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}
}