diff --git a/oam/oamcpp/liboamcpp.cpp b/oam/oamcpp/liboamcpp.cpp index c38300f45..2660a1cd7 100644 --- a/oam/oamcpp/liboamcpp.cpp +++ b/oam/oamcpp/liboamcpp.cpp @@ -5922,6 +5922,69 @@ namespace oam return 0; } + /*************************************************************************** + * + * Function: addUMdisk + * + * Purpose: add UM disk + * + ****************************************************************************/ + + void Oam::addUMdisk(const int moduleID, std::string& volumeName, std::string& device, string EBSsize) + { + string UMVolumeSize = "10"; + try{ + getSystemConfig("UMVolumeSize", UMVolumeSize); + } + catch(...) {} + + writeLog("addUMdisk - Create new Volume for um" + itoa(moduleID), LOG_TYPE_DEBUG); + volumeName = createEC2Volume(UMVolumeSize); + if ( volumeName == "failed" ) { + writeLog("addModule: create volume failed", LOG_TYPE_CRITICAL); + exceptionControl("addUMdisk", API_FAILURE); + } + + //attach and format volumes + device = "/dev/sdf" + itoa(moduleID); + + string localInstance = getEC2LocalInstance(); + + //attach volumes to local instance + writeLog("addUMdisk - Attach new Volume to local instance: " + volumeName, LOG_TYPE_DEBUG); + if (!attachEC2Volume(volumeName, device, localInstance)) { + writeLog("addUMdisk: volume failed to attach to local instance", LOG_TYPE_CRITICAL); + exceptionControl("addUMdisk", API_FAILURE); + } + + //format attached volume + writeLog("addUMdisk - Format new Volume for: " + volumeName, LOG_TYPE_DEBUG); + string cmd = "mkfs.ext2 -F " + device + " > /dev/null 2>&1"; + system(cmd.c_str()); + + //detach volume + writeLog("addUMdisk - detach new Volume from local instance: " + volumeName, LOG_TYPE_DEBUG); + if (!detachEC2Volume(volumeName)) { + exceptionControl("addUMdisk", API_FAILURE); + } + + // add instance tag + string AmazonAutoTagging; + string systemName; + + try { + getSystemConfig("AmazonAutoTagging", AmazonAutoTagging); + getSystemConfig("SystemName", systemName); + } + catch(...) {} + + if ( AmazonAutoTagging == "y" ) + { + string tagValue = systemName + "-um" + itoa(moduleID); + createEC2tag( volumeName, "Name", tagValue ); + } + } + /*************************************************************************** * * Function: addDbroot @@ -5930,7 +5993,7 @@ namespace oam * ****************************************************************************/ - void Oam::addDbroot(const int dbrootNumber, DBRootConfigList& dbrootlist, string EBSsize) + void Oam::addDbroot(const int dbrootNumber, DBRootConfigList& dbrootlist, string EBSsize) { int SystemDBRootCount = 0; string cloud; @@ -5999,33 +6062,36 @@ namespace oam dbrootConfigList.push_back(*pt1); } - int newID = 1; - for ( int count = 0 ; count < dbrootNumber ; count++ ) + if ( dbrootlist.empty() ) { - //check for match - while (true) + int newID = 1; + for ( int count = 0 ; count < dbrootNumber ; count++ ) { - bool found = false; - DBRootConfigList::iterator pt = dbrootConfigList.begin(); - for( ; pt != dbrootConfigList.end() ; pt++) + //check for match + while (true) { - if ( newID == *pt ) { + bool found = false; + DBRootConfigList::iterator pt = dbrootConfigList.begin(); + for( ; pt != dbrootConfigList.end() ; pt++) + { + if ( newID == *pt ) { + newID++; + found = true; + break; + } + } + + if (!found) + { + dbrootlist.push_back(newID); newID++; - found = true; break; } } - - if (!found) - { - dbrootlist.push_back(newID); - newID++; - break; - } } } - if ( dbrootlist.size() == 0 ) + if ( dbrootlist.empty() ) { cout << "ERROR: Failed add, No DBRoot IDs available" << endl; exceptionControl("addDbroot", API_INVALID_PARAMETER); diff --git a/oam/oamcpp/liboamcpp.h b/oam/oamcpp/liboamcpp.h index a118762d9..68105b71e 100644 --- a/oam/oamcpp/liboamcpp.h +++ b/oam/oamcpp/liboamcpp.h @@ -2246,6 +2246,11 @@ namespace oam */ EXPORT void addDbroot(const int dbrootNumber, DBRootConfigList& dbrootlist, std::string EBSsize = oam::UnassignedName); + /** + *@brief add UM Disk + */ + EXPORT void addUMdisk(const int moduleID, std::string& volumeName, std::string& device, std::string EBSsize = oam::UnassignedName); + /** *@brief distribute Fstab Updates */ diff --git a/oamapps/postConfigure/postConfigure.cpp b/oamapps/postConfigure/postConfigure.cpp index 4dc37f6fb..d72541c98 100644 --- a/oamapps/postConfigure/postConfigure.cpp +++ b/oamapps/postConfigure/postConfigure.cpp @@ -129,6 +129,9 @@ string DBRootStorageLoc; string DBRootStorageType; string UMStorageType; +string PMVolumeSize = oam::UnassignedName; +string UMVolumeSize = oam::UnassignedName; + int DBRootCount; string deviceName; @@ -2123,33 +2126,62 @@ int main(int argc, char *argv[]) if ( moduleType == "um" && moduleDisableState == oam::ENABLEDSTATE) { //get EC2 volume name and info if ( UMStorageType == "external" && cloud == "amazon" && - IserverTypeInstall != oam::INSTALL_COMBINE_DM_UM_PM ) { + IserverTypeInstall != oam::INSTALL_COMBINE_DM_UM_PM ) { + string create = "y"; + + while(true) + { + pcommand = callReadline("Do you need the volume created [y,n] (y) > "); + if (pcommand) + { + if (strlen(pcommand) > 0) create = pcommand; + callFree(pcommand); + } + if ( create == "y" || create == "n" ) + break; + else + cout << "Invalid Entry, please enter 'y' for yes or 'n' for no" << endl; + create = "y"; + if ( noPrompting ) + exit(1); + } + string volumeNameID = "UMVolumeName" + oam.itoa(moduleID); string volumeName = oam::UnassignedName; string deviceNameID = "UMVolumeDeviceName" + oam.itoa(moduleID); string deviceName = oam::UnassignedName; - try { - volumeName = sysConfig->getConfig(InstallSection, volumeNameID); - deviceName = sysConfig->getConfig(InstallSection, deviceNameID); - } - catch(...) - {} - prompt = "Enter Volume ID assigned to module '" + newModuleName + "' (" + volumeName + ") > "; - pcommand = callReadline(prompt.c_str()); - if (pcommand) - { - if (strlen(pcommand) > 0) volumeName = pcommand; - callFree(pcommand); + if ( create == "n" ) { + // prompt for volume ID + try { + volumeName = sysConfig->getConfig(InstallSection, volumeNameID); + } + catch(...) + {} + + prompt = "Enter Volume ID assigned to module '" + newModuleName + "' (" + volumeName + ") > "; + pcommand = callReadline(prompt.c_str()); + if (pcommand) + { + if (strlen(pcommand) > 0) volumeName = pcommand; + callFree(pcommand); + } + + //get device name based on dbroot ID + deviceName = "/dev/sdf" + oam.itoa(moduleID); } - - prompt = "Enter Device Name (/dev/sdxx) '" + newModuleName + "' (" + deviceName + ") > "; - pcommand = callReadline(prompt.c_str()); - if (pcommand) + else { - if (strlen(pcommand) > 0) deviceName = pcommand; - callFree(pcommand); + //create new UM volume + try{ + + oam.addUMdisk(moduleID, volumeName, deviceName, UMVolumeSize); + } + catch(...) { + cout << "ERROR: volume create failed for " + newModuleName << endl; + return false; + } } //write volume and device name @@ -2405,36 +2437,73 @@ int main(int argc, char *argv[]) //get EC2 volume name and info if ( DBRootStorageType == "external" && cloud == "amazon") { cout << endl; + + string create = "y"; + + while(true) + { + pcommand = callReadline("Do you need the volume created [y,n] (y) > "); + if (pcommand) + { + if (strlen(pcommand) > 0) create = pcommand; + callFree(pcommand); + } + if ( create == "y" || create == "n" ) + break; + else + cout << "Invalid Entry, please enter 'y' for yes or 'n' for no" << endl; + create = "y"; + if ( noPrompting ) + exit(1); + } + + string volumeNameID = "PMVolumeName" + *it; string volumeName = oam::UnassignedName; - try { - volumeName = sysConfig->getConfig(InstallSection, volumeNameID); - } - catch(...) - {} - - prompt = "Enter Volume ID for '" + DBrootID + "' (" + volumeName + ") > "; - pcommand = callReadline(prompt.c_str()); - if (pcommand) - { - if (strlen(pcommand) > 0) volumeName = pcommand; - callFree(pcommand); - } - string deviceNameID = "PMVolumeDeviceName" + *it; string deviceName = oam::UnassignedName; try { + volumeName = sysConfig->getConfig(InstallSection, volumeNameID); deviceName = sysConfig->getConfig(InstallSection, deviceNameID); } catch(...) {} - prompt = "Enter Device Name (/dev/sdxx) for volume '" + volumeName + "' (" + deviceName + ") > "; - pcommand = callReadline(prompt.c_str()); - if (pcommand) + + if ( create == "n" ) { + prompt = "Enter Volume ID for '" + DBrootID + "' (" + volumeName + ") > "; + pcommand = callReadline(prompt.c_str()); + if (pcommand) + { + if (strlen(pcommand) > 0) volumeName = pcommand; + callFree(pcommand); + } + + } + else { - if (strlen(pcommand) > 0) deviceName = pcommand; - callFree(pcommand); + // create amazon ebs dbroot + try + { + DBRootConfigList dbrootlist; + dbrootlist.push_back(atoi(DBrootID.c_str())); + + oam.addDbroot(1, dbrootlist, PMVolumeSize); + + sleep(2); + try { + volumeName = sysConfig->getConfig(InstallSection, volumeNameID); + deviceName = sysConfig->getConfig(InstallSection, deviceNameID); + } + catch(...) + {} + + } + catch (exception& e) + { + cout << endl << "**** addDbroot Failed: " << e.what() << endl; + break; + } } //write volume and device name @@ -4240,8 +4309,27 @@ bool storageSetup(string cloud) if ( storageType == "1" ) UMStorageType = "internal"; else + { UMStorageType = "external"; + + cout << endl; + oam.getSystemConfig("UMVolumeSize", UMVolumeSize); + string prompt = "Enter EBS Volume storage size in GB: (" + UMVolumeSize + "): "; + PMVolumeSize = callReadline(prompt); + + //set DBRootStorageType + try { + sysConfig->setConfig(InstallSection, "UMVolumeSize", UMVolumeSize); + } + catch(...) + { + cout << "ERROR: Problem setting UMVolumeSize in the InfiniDB System Configuration file" << endl; + return false; + } + } + + try { sysConfig->setConfig(InstallSection, "UMStorageType", UMStorageType); } @@ -4442,6 +4530,26 @@ bool storageSetup(string cloud) } } + // if external and amazon, prompt for storage size + if ( storageType == "2" && cloud == "amazon") + { + cout << endl; + oam.getSystemConfig("PMVolumeSize", PMVolumeSize); + + string prompt = "Enter EBS Volume storage size in GB: (" + PMVolumeSize + "): "; + PMVolumeSize = callReadline(prompt); + + //set DBRootStorageType + try { + sysConfig->setConfig(InstallSection, "PMVolumeSize", PMVolumeSize); + } + catch(...) + { + cout << "ERROR: Problem setting PMVolumeSize in the InfiniDB System Configuration file" << endl; + return false; + } + } + // if gluster if ( storageType == "3" ) { diff --git a/procmgr/processmanager.cpp b/procmgr/processmanager.cpp index 635e03226..691cc664a 100644 --- a/procmgr/processmanager.cpp +++ b/procmgr/processmanager.cpp @@ -4656,42 +4656,13 @@ int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::str if ( volumeName.empty() || volumeName == oam::UnassignedName ) { // need to create a new one - string UMVolumeSize = "10"; + string device; try{ - oam.getSystemConfig("UMVolumeSize", UMVolumeSize); + + oam.addUMdisk(moduleID, volumeName, device); } - catch(...) {} - - log.writeLog(__LINE__, "addModule - Create new Volume for: " + (*listPT).DeviceName, LOG_TYPE_DEBUG); - string volumeName = oam.createEC2Volume(UMVolumeSize); - if ( volumeName == "failed" ) { - log.writeLog(__LINE__, "addModule: create volume failed", LOG_TYPE_CRITICAL); - pthread_mutex_unlock(&THREAD_LOCK); - return API_FAILURE; - } - - //attach and format volumes - string device = "/dev/sdf" + oam.itoa(moduleID); - - string localInstance = oam.getEC2LocalInstance(); - - //attach volumes to local instance - log.writeLog(__LINE__, "addModule - Attach new Volume to local instance: " + volumeName, LOG_TYPE_DEBUG); - if (!oam.attachEC2Volume(volumeName, device, localInstance)) { - log.writeLog(__LINE__, "addModule: volume failed to attach to local instance", LOG_TYPE_CRITICAL); - pthread_mutex_unlock(&THREAD_LOCK); - return API_FAILURE; - } - - //format attached volume - log.writeLog(__LINE__, "addModule - Format new Volume for: " + volumeName, LOG_TYPE_DEBUG); - string cmd = "mkfs.ext2 -F " + device + " > /dev/null 2>&1"; - system(cmd.c_str()); - - //detach volume - log.writeLog(__LINE__, "addModule - detach new Volume from local instance: " + volumeName, LOG_TYPE_DEBUG); - if (!oam.detachEC2Volume(volumeName)) { - log.writeLog(__LINE__, "addModule: volume failed to deattach to local instance", LOG_TYPE_CRITICAL); + catch(...) { + log.writeLog(__LINE__, "addModule: volume create failed for um: " + moduleName, LOG_TYPE_CRITICAL); pthread_mutex_unlock(&THREAD_LOCK); } @@ -4713,21 +4684,6 @@ int ProcessManager::addModule(oam::DeviceNetworkList devicenetworklist, std::str catch(...) {} - // add instance tag - string systemName; - { - try{ - oam.getSystemConfig("SystemName", systemName); - } - catch(...) {} - } - - if ( AmazonAutoTagging == "y" ) - { - string tagValue = systemName + "-" + moduleName; - oam.createEC2tag( volumeName, "Name", tagValue ); - } - log.writeLog(__LINE__, "addModule - create/attach new volume: " + volumeName + "/" + device, LOG_TYPE_DEBUG); }