app/libraries/URPUtilities.php (226 lines of code) (raw):

<?php use Airavata\API\Error\AiravataSystemException; use Airavata\Model\AppCatalog\UserResourceProfile\UserResourceProfile; use Airavata\Model\AppCatalog\UserResourceProfile\UserComputeResourcePreference; use Airavata\Model\AppCatalog\UserResourceProfile\UserStoragePreference; use Airavata\Model\Credential\Store\SummaryType; class URPUtilities { public static function get_or_create_user_resource_profile() { if (!URPUtilities::is_user_resource_profile_exists()) { $userResourceProfile = URPUtilities::create_user_resource_profile(); } else { $userResourceProfile = URPUtilities::get_user_resource_profile(); } return $userResourceProfile; } public static function get_user_resource_profile() { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); return Airavata::getUserResourceProfile(Session::get('authz-token'), $userId, $gatewayId); } public static function is_user_resource_profile_exists() { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); return Airavata::isUserResourceProfileExists(Session::get('authz-token'), $userId, $gatewayId); } public static function create_user_resource_profile() { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); $credentialStoreToken = AdminUtilities::create_ssh_token_for_user("Default SSH Key"); $userResourceProfileData = new UserResourceProfile(array( "userId" => $userId, "gatewayID" => $gatewayId, "credentialStoreToken" => $credentialStoreToken ) ); Airavata::registerUserResourceProfile(Session::get('authz-token'), $userResourceProfileData); return Airavata::getUserResourceProfile(Session::get('authz-token'), $userId, $gatewayId); } public static function update_user_resource_profile($userResourceProfile) { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); Airavata::updateUserResourceProfile(Session::get('authz-token'), $userId, $gatewayId, $userResourceProfile); } public static function get_all_ssh_pub_keys_summary_for_user() { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); $all_ssh_pub_key_summaries = Airavata::getAllCredentialSummaries(Session::get('authz-token'), SummaryType::SSH); foreach ($all_ssh_pub_key_summaries as $ssh_pub_key_summary) { # strip whitespace from public key: there can't be trailing # whitespace in a public key entry in the authorized_keys file $ssh_pub_key_summary->publicKey = trim($ssh_pub_key_summary->publicKey); } return URPUtilities::create_credential_summary_map($all_ssh_pub_key_summaries); } // Create array of CredentialSummary objects where the token is the key private static function create_credential_summary_map($credentialSummaries) { $credentialSummaryMap = array(); foreach ($credentialSummaries as $csIndex => $credentialSummary) { $credentialSummaryMap[$credentialSummary->token] = $credentialSummary; } return $credentialSummaryMap; } public static function add_or_update_user_CRP($inputs, $update = false) { $inputs = Input::all(); if( $inputs["reservationStartTime"] != "") $inputs["reservationStartTime"] = CommonUtilities::convertLocalToUTC(strtotime($inputs["reservationStartTime"])) * 1000; if( $inputs["reservationEndTime"] != "") $inputs["reservationEndTime"] = CommonUtilities::convertLocalToUTC(strtotime($inputs["reservationEndTime"])) * 1000; $userComputeResourcePreference = new UserComputeResourcePreference($inputs); // FIXME: for now assume that if a user is adding or updating a UserComputeResourcePreference then they have also validated that it works. It would be better to confirm that in Airavata. $userComputeResourcePreference->validated = true; // Log::debug("add_or_update_user_CRP: ", array($userComputeResourcePreference)); $userId = Session::get('username'); if ($update) { return Airavata::updateUserComputeResourcePreference(Session::get('authz-token'), $userId, $inputs["gatewayId"], $inputs["computeResourceId"], $userComputeResourcePreference); } else { return Airavata::addUserComputeResourcePreference(Session::get('authz-token'), $userId, $inputs["gatewayId"], $inputs["computeResourceId"], $userComputeResourcePreference); } } public static function delete_user_CRP($computeResourceId) { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); $result = Airavata::deleteUserComputeResourcePreference(Session::get('authz-token'), $userId, $gatewayId, $computeResourceId); // Log::debug("deleteUserComputeResourcePreference($userId, $gatewayId, $computeResourceId) => $result"); return $result; } /* * Get all user's *validated* compute resource preferences, keyed by compute resource id. */ public static function get_all_validated_user_compute_resource_prefs() { return array_filter(URPUtilities::get_all_user_compute_resource_prefs(), function($userComputeResourcePreference) { return $userComputeResourcePreference->validated; }); } private static function get_all_user_compute_resource_prefs() { $userComputeResourcePreferencesById = array(); if (URPUtilities::is_user_resource_profile_exists()) { $userResourceProfile = URPUtilities::get_user_resource_profile(); $userComputeResourcePreferences = $userResourceProfile->userComputeResourcePreferences; // Put $userComputeResourcePreferences in a map keyed by computeResourceId foreach( $userComputeResourcePreferences as $userComputeResourcePreference ) { $userComputeResourcePreferencesById[$userComputeResourcePreference->computeResourceId] = $userComputeResourcePreference; } } return $userComputeResourcePreferencesById; } public static function add_or_update_user_SRP($inputs, $update = false) { $inputs = Input::all(); $userStoragePreference = new UserStoragePreference($inputs); $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); $storageResourceId = $inputs["storageResourceId"]; if ($update) { return Airavata::updateUserStoragePreference(Session::get('authz-token'), $userId, $inputs["gatewayId"], $inputs["storageResourceId"], $userStoragePreference); } else { // Log::debug("addUserStoragePreference($userId, $gatewayId, $storageResourceId)", array($userStoragePreference)); $result = Airavata::addUserStoragePreference(Session::get('authz-token'), $userId, $gatewayId, $storageResourceId, $userStoragePreference); return $result; } } public static function delete_user_SRP($storageResourceId) { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); $result = Airavata::deleteUserStoragePreference(Session::get('authz-token'), $userId, $gatewayId, $storageResourceId); // Log::debug("deleteUserStoragePreference($userId, $gatewayId, $storageResourceId) => $result"); return $result; } // Only used for testing public static function delete_user_resource_profile() { $userId = Session::get('username'); $gatewayId = Session::get('gateway_id'); Airavata::deleteUserResourceProfile(Session::get('authz-token'), $userId, $gatewayId); } /** * Returns an array with compute resource ids as the key and each entry is a * map with the following fields: * * hostname: hostname of compute resource * * userComputeResourcePreference: if UserComputeResourcePreference exists for compute resource or was able to be created * * accountIsMissing: (boolean) true if account doesn't exist on cluster and needs to be created manually (or by some other process) * * additionalInfo: Additional info field from ComputeResourcePreference * * errorMessage: Error message associated with trying to setup account */ public static function setup_auto_provisioned_accounts() { $results = array(); $gatewayResourceProfile = CRUtilities::getGatewayResourceProfile(); $computeResourcePreferences = $gatewayResourceProfile->computeResourcePreferences; $userComputeResourcePreferences = URPUtilities::get_all_user_compute_resource_prefs(); $sshAccountProvisioners = URPUtilities::get_ssh_account_provisioners(); $userId = Session::get("username"); $gatewayId = Session::get("gateway_id"); foreach( $computeResourcePreferences as $computeResourcePreference) { if( !empty($computeResourcePreference->sshAccountProvisioner)) { $sshAccountProvisioner = $sshAccountProvisioners[$computeResourcePreference->sshAccountProvisioner]; $computeResourceId = $computeResourcePreference->computeResourceId; $computeResource = CRUtilities::get_compute_resource($computeResourceId); $hostname = $computeResource->hostName; $userComputeResourcePreference = null; $errorMessage = null; $accountIsMissing = false; try { if( array_key_exists($computeResourceId, $userComputeResourcePreferences)) { $userComputeResourcePreference = $userComputeResourcePreferences[$computeResourceId]; // If a $userComputeResourcePreference exists but isn't // validated some error must have occurred the last time // it was attempted to be setup. We'll try to set it up again. // Also, the setup may be incomplete in which case we // should also try to setup it up again. if (!$userComputeResourcePreference->validated || !URPUtilities::is_ssh_account_setup_complete($computeResourceId, $userComputeResourcePreference)) { $userComputeResourcePreference = URPUtilities::setup_ssh_account($gatewayId, $userId, $computeResourceId, $hostname, $userComputeResourcePreference); } } else if ($sshAccountProvisioner->canCreateAccount) { $userComputeResourcePreference = URPUtilities::setup_ssh_account($gatewayId, $userId, $computeResourceId, $hostname); } else if (Airavata::doesUserHaveSSHAccount(Session::get('authz-token'), $computeResourceId, $userId)) { $userComputeResourcePreference = URPUtilities::setup_ssh_account($gatewayId, $userId, $computeResourceId, $hostname); } else { $accountIsMissing = true; } } catch (Exception $ex) { Log::error("Failed to setup SSH Account for " . $userId . " on " . $hostname); Log::error($ex); $errorMessage = $ex->getMessage(); } $results[] = array( "hostname" => $hostname, "userComputeResourcePreference" => $userComputeResourcePreference, "accountIsMissing" => $accountIsMissing, "additionalInfo" => $computeResourcePreference->sshAccountProvisionerAdditionalInfo, "errorMessage" => $errorMessage ); } } return $results; } private static function get_ssh_account_provisioners() { $sshAccountProvisionersByName = array(); $sshAccountProvisioners = Airavata::getSSHAccountProvisioners(Session::get('authz-token')); foreach ($sshAccountProvisioners as $sshAccountProvisioner) { $sshAccountProvisionersByName[$sshAccountProvisioner->name] = $sshAccountProvisioner; } return $sshAccountProvisionersByName; } private static function is_ssh_account_setup_complete($computeResourceId, $userComputeResourcePreference) { return Airavata::isSSHSetupCompleteForUserComputeResourcePreference( Session::get('authz-token'), $computeResourceId, $userComputeResourcePreference->resourceSpecificCredentialStoreToken ); } private static function setup_ssh_account($gatewayId, $userId, $computeResourceId, $hostname, $userComputeResourcePreference=null) { if (empty($userComputeResourcePreference)) { Log::debug("userComputeResourcePreference is empty", array($userComputeResourcePreference)); // Initially create a UserComputeResourcePreference record to store // the key. This will be marked validated=false initially until it // is successfully setup. This way in case an error occurs we have a // record of the generated SSH key to use and can try again later. $userComputeResourcePreference = new UserComputeResourcePreference(); $userComputeResourcePreference->computeResourceId = $computeResourceId; $credentialStoreToken = AdminUtilities::create_ssh_token_for_user("SSH Key for " . $hostname); $userComputeResourcePreference->resourceSpecificCredentialStoreToken = $credentialStoreToken; Airavata::addUserComputeResourcePreference(Session::get('authz-token'), $userId, $gatewayId, $computeResourceId, $userComputeResourcePreference); } $updatedUserCompResourcePref = Airavata::setupUserComputeResourcePreferencesForSSH(Session::get('authz-token'), $computeResourceId, $userId, $userComputeResourcePreference->resourceSpecificCredentialStoreToken); $updatedUserCompResourcePref->resourceSpecificCredentialStoreToken = $userComputeResourcePreference->resourceSpecificCredentialStoreToken; Airavata::updateUserComputeResourcePreference(Session::get('authz-token'), $userId, $gatewayId, $computeResourceId, $updatedUserCompResourcePref); return $updatedUserCompResourcePref; } } ?>