diff --git a/Install_OS_on_baremetal_server/.meta_Install_OS_on_baremetal_server.xml b/Install_OS_on_baremetal_server/.meta_Install_OS_on_baremetal_server.xml new file mode 100755 index 000000000..fbe5cf140 --- /dev/null +++ b/Install_OS_on_baremetal_server/.meta_Install_OS_on_baremetal_server.xml @@ -0,0 +1,43 @@ + + + + + DISPLAYNAME + Install_OS_on_baremetal_server.xml + + + DATE_MODIFICATION + 1613412963669 + + + REPOSITORY + Process + + + DATE_CREATION + 1613412963666 + + + MODEL + 0 + + + TAG + + + FILE_TYPE + text + + + MANUFACTURER + 0 + + + TYPE + FILE + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/.meta_Process_Delete b/Install_OS_on_baremetal_server/.meta_Process_Delete new file mode 100755 index 000000000..f8965a660 --- /dev/null +++ b/Install_OS_on_baremetal_server/.meta_Process_Delete @@ -0,0 +1,31 @@ + + + + + DISPLAYNAME + Process_Delete + + + DATE_MODIFICATION + 1613408171586 + + + REPOSITORY + Process + + + DATE_CREATION + 1613408171582 + + + TAG + + + TYPE + DIRECTORY + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/.meta_Process_Install_OS b/Install_OS_on_baremetal_server/.meta_Process_Install_OS new file mode 100755 index 000000000..e643d6a60 --- /dev/null +++ b/Install_OS_on_baremetal_server/.meta_Process_Install_OS @@ -0,0 +1,31 @@ + + + + + DISPLAYNAME + Process_Install_OS + + + DATE_MODIFICATION + 1613402496504 + + + REPOSITORY + Process + + + DATE_CREATION + 1613402496500 + + + TAG + + + TYPE + DIRECTORY + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Install_OS_on_baremetal_server.xml b/Install_OS_on_baremetal_server/Install_OS_on_baremetal_server.xml new file mode 100644 index 000000000..79ccc0e0e --- /dev/null +++ b/Install_OS_on_baremetal_server/Install_OS_on_baremetal_server.xml @@ -0,0 +1,49 @@ + + + + + + + + Install OS + CREATE + 5 + + + /opt/fmc_repository/Process/workflows/Install_OS_on_baremetal_server/Process_Install_OS/Tasks + Define variables + + + /opt/fmc_repository/Process/workflows/Install_OS_on_baremetal_server/Process_Install_OS/Tasks + Turn off server + + + /opt/fmc_repository/Process/workflows/Install_OS_on_baremetal_server/Process_Install_OS/Tasks + Attach virtual media + + + /opt/fmc_repository/Process/workflows/Install_OS_on_baremetal_server/Process_Install_OS/Tasks + Change one-time boot order + + + /opt/fmc_repository/Process/workflows/Install_OS_on_baremetal_server/Process_Install_OS/Tasks + Turn on server + + + + Delete + DELETE + 5 + + + + + The workflow is proposed to launch installation process on baremetal server via Redfish API. It turn off a server, attaches ISO to virtual media via http link, changes one-time boot order and turn on the server. + service_id + python + 10000 + 5 + Install OS on baremetal server + + + diff --git a/Install_OS_on_baremetal_server/Process_Delete/.meta_Tasks b/Install_OS_on_baremetal_server/Process_Delete/.meta_Tasks new file mode 100755 index 000000000..c47a2d22d --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Delete/.meta_Tasks @@ -0,0 +1,31 @@ + + + + + DISPLAYNAME + Tasks + + + DATE_MODIFICATION + 1613408171681 + + + REPOSITORY + Process + + + DATE_CREATION + 1613408171676 + + + TAG + + + TYPE + DIRECTORY + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/.meta_Tasks b/Install_OS_on_baremetal_server/Process_Install_OS/.meta_Tasks new file mode 100755 index 000000000..665df66b1 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/.meta_Tasks @@ -0,0 +1,31 @@ + + + + + DISPLAYNAME + Tasks + + + DATE_MODIFICATION + 1613402496603 + + + REPOSITORY + Process + + + DATE_CREATION + 1613402496598 + + + TAG + + + TYPE + DIRECTORY + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Attach_virtual_media.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Attach_virtual_media.py new file mode 100755 index 000000000..dfcd51924 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Attach_virtual_media.py @@ -0,0 +1,35 @@ + + + + + DISPLAYNAME + Task_Attach_virtual_media.py + + + DATE_MODIFICATION + 1613412419561 + + + REPOSITORY + Process + + + DATE_CREATION + 1613412419556 + + + TAG + + + FILE_TYPE + text + + + TYPE + UPLOAD + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Change_one_time_boot_order.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Change_one_time_boot_order.py new file mode 100755 index 000000000..94fb1b18d --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Change_one_time_boot_order.py @@ -0,0 +1,35 @@ + + + + + DISPLAYNAME + Task_Change_one_time_boot_order.py + + + DATE_MODIFICATION + 1613411489139 + + + REPOSITORY + Process + + + DATE_CREATION + 1613411489135 + + + TAG + + + FILE_TYPE + text + + + TYPE + UPLOAD + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Define_variables.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Define_variables.py new file mode 100755 index 000000000..219337124 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Define_variables.py @@ -0,0 +1,35 @@ + + + + + DISPLAYNAME + Task_Define_variables.py + + + DATE_MODIFICATION + 1613403325365 + + + REPOSITORY + Process + + + DATE_CREATION + 1613403325360 + + + TAG + + + FILE_TYPE + text + + + TYPE + UPLOAD + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_off_server.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_off_server.py new file mode 100755 index 000000000..f9f7190a3 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_off_server.py @@ -0,0 +1,35 @@ + + + + + DISPLAYNAME + Task_Turn_off_server.py + + + DATE_MODIFICATION + 1613412383436 + + + REPOSITORY + Process + + + DATE_CREATION + 1613412383431 + + + TAG + + + FILE_TYPE + text + + + TYPE + UPLOAD + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_on_server.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_on_server.py new file mode 100755 index 000000000..395c8d902 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/.meta_Task_Turn_on_server.py @@ -0,0 +1,35 @@ + + + + + DISPLAYNAME + Task_Turn_on_server.py + + + DATE_MODIFICATION + 1613412541513 + + + REPOSITORY + Process + + + DATE_CREATION + 1613412541505 + + + TAG + + + FILE_TYPE + text + + + TYPE + UPLOAD + + + COMMENT + + + diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Attach_virtual_media.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Attach_virtual_media.py new file mode 100755 index 000000000..4d3bfbef8 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Attach_virtual_media.py @@ -0,0 +1,88 @@ +from msa_sdk.variables import Variables +from msa_sdk.msa_api import MSA_API +from msa_sdk.order import Order +from msa_sdk.orchestration import Orchestration +from datetime import datetime +from msa_sdk import constants +from msa_sdk import util +import json +import sys +import time + + +""" +The proposals of the tasks are: + - Attach virtual media +""" + + +#Create Variables() object and retrieve useful variables +TaskVariables = Variables() +context = Variables.task_call(TaskVariables) + +#Variables to finish the task properlly +fail_comment = str() +success_comment = str() +fail_string = f'{{"wo_status": "FAIL", "wo_comment": "{fail_comment}"}}' +success_string = f'{{"wo_status": "ENDED", "wo_comment": "{success_comment}"}}' +process_id = context['SERVICEINSTANCEID'] + +#Create Orchestration object to update GUI dynamically +Orchestration = Orchestration(context['UBIQUBEID']) +async_update_list = (context['PROCESSINSTANCEID'], context['TASKID'], context['EXECNUMBER']) + + +#Create order object +ServerOrderObject = Order(context['device_id']) + +#Attach virtual media +Orchestration.update_asynchronous_task_details(*async_update_list, 'Attach ISO to virtual CD... ') +objects_list = ServerOrderObject.command_objects_instances(context['ms_alias']['ms_virtual_media']) + +virtual_media_object = None +for virtual_media in objects_list: + if virtual_media == 'CD': + virtual_media_object = ServerOrderObject.command_objects_instances_by_id(context['ms_alias']['ms_virtual_media'], + virtual_media)[context['ms_alias']['ms_virtual_media']][virtual_media] +if virtual_media_object is not None: + #Check if virtual media already attached + if virtual_media_object['image_source'] != 'NotConnected': + ms_dict = {context['ms_alias']['ms_virtual_media']: {virtual_media_object['object_id']: {}}} + ServerOrderObject.command_execute('DELETE', ms_dict) + time.sleep(10) + ServerOrderObject.command_synchronize(300) + + ms_dict = {context['ms_alias']['ms_virtual_media']: + {virtual_media_object['object_id']: {'object_id': virtual_media_object['object_id'], + 'image_name': '', + 'image_source': context['iso_uri'], + 'image': '' + } + } + } + ServerOrderObject.command_execute('UPDATE', ms_dict) + + #Check if virtual media is attached + is_attached = False + counter = 10 + while not is_attached and counter > 0: + time.sleep(10) + ServerOrderObject.command_synchronize(300) + objects_list = ServerOrderObject.command_objects_instances(context['ms_alias']['ms_virtual_media']) + virtual_media_object = None + for virtual_media in objects_list: + if virtual_media == 'CD': + virtual_media_object = ServerOrderObject.command_objects_instances_by_id(context['ms_alias']['ms_virtual_media'], + virtual_media)[context['ms_alias']['ms_virtual_media']][virtual_media] + if virtual_media_object['image'] == context['iso_uri']: + is_attached = True + + counter -= 1 +if is_attached: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Attach ISO to virtual CD... OK') + success_comment = 'Virtual media has been attached sucessfully.' + print(MSA_API.process_content('ENDED', success_comment , context, True)) +else: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Attach ISO to virtual CD... FAILED') + fail_comment = 'Virtual media has not been attached by some reason. Stop the automation' + print(MSA_API.process_content('FAIL', success_comment , context, True)) \ No newline at end of file diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Change_one_time_boot_order.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Change_one_time_boot_order.py new file mode 100755 index 000000000..92c39e191 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Change_one_time_boot_order.py @@ -0,0 +1,47 @@ +from msa_sdk.variables import Variables +from msa_sdk.msa_api import MSA_API +from msa_sdk.order import Order +from msa_sdk.orchestration import Orchestration +from datetime import datetime +from msa_sdk import constants +from msa_sdk import util +import json +import sys +import time + + +""" +The proposals of the tasks are: + - Change one-time boot order +""" + + +#Create Variables() object and retrieve useful variables +TaskVariables = Variables() +context = Variables.task_call(TaskVariables) + +#Variables to finish the task properlly +fail_comment = str() +success_comment = str() +fail_string = f'{{"wo_status": "FAIL", "wo_comment": "{fail_comment}"}}' +success_string = f'{{"wo_status": "ENDED", "wo_comment": "{success_comment}"}}' + +#Create Orchestration object to update GUI dynamically +Orchestration = Orchestration(context['UBIQUBEID']) +async_update_list = (context['PROCESSINSTANCEID'], context['TASKID'], context['EXECNUMBER']) + + +#Create order object +ServerOrderObject = Order(context['device_id']) + +#Retrieve info about tenants +Orchestration.update_asynchronous_task_details(*async_update_list, 'Change one-time boot order... ') +ms_dict = {context['ms_alias']['ms_one_time_boot']: + {'1': {'object_id': '1' + } + } + } +ServerOrderObject.command_execute('CREATE', ms_dict) +Orchestration.update_asynchronous_task_details(*async_update_list, 'Change one-time boot order... OK') +success_comment = 'Virtual media has been attached sucessfully.' +print(MSA_API.process_content('ENDED', success_comment , context, True)) \ No newline at end of file diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Define_variables.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Define_variables.py new file mode 100755 index 000000000..2af58901a --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Define_variables.py @@ -0,0 +1,35 @@ +from msa_sdk.variables import Variables +from msa_sdk.msa_api import MSA_API +import json +import re + +""" +The proposals of the task are: + - Get server ME and OS image HTTP URI as inputs + - Define MS aliases +""" + + +#New Variables object +TaskVariables = Variables() + +#Add new variables +TaskVariables.add('iso_uri', var_type = 'String') +TaskVariables.add('device_id', var_type = 'Device') + +#Add vars to context +context = Variables.task_call(TaskVariables) +context['device_id'] = re.match('^\D+?(\d+?)$', context['device_id']).group(1) + + +#Import microservice alias list +context['ms_alias'] = {"ms_virtual_media" : "redfish_virtual_media", + "ms_one_time_boot" : "redfish_one_time_boot_virtual_cd", + "ms_power_actions" : "redfish_server_actions", + "ms_server_general": "redfish_server_general" + } + + +#Finish the task correctlly +result = MSA_API.process_content('ENDED', 'All variables have been defined successfully', context, True) +print(result) diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_off_server.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_off_server.py new file mode 100755 index 000000000..8a208aad1 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_off_server.py @@ -0,0 +1,83 @@ +from msa_sdk.variables import Variables +from msa_sdk.msa_api import MSA_API +from msa_sdk.order import Order +from msa_sdk.orchestration import Orchestration +from datetime import datetime +from msa_sdk import constants +from msa_sdk import util +import json +import sys +import time + + +""" +The proposals of the tasks are: + - Check whether is the server turned on + - If yes - shutdown the server +""" + + +#Create Variables() object and retrieve useful variables +TaskVariables = Variables() +context = Variables.task_call(TaskVariables) + +#Variables to finish the task properlly +fail_comment = str() +success_comment = str() +fail_string = f'{{"wo_status": "FAIL", "wo_comment": "{fail_comment}"}}' +success_string = f'{{"wo_status": "ENDED", "wo_comment": "{success_comment}"}}' + +#Create Orchestration object to update GUI dynamically +Orchestration = Orchestration(context['UBIQUBEID']) +async_update_list = (context['PROCESSINSTANCEID'], context['TASKID'], context['EXECNUMBER']) +process_id = context['SERVICEINSTANCEID'] + +#Create order object +ServerOrderObject = Order(context['device_id']) +ServerOrderObject.command_synchronize(300) + +#Retrieve info about tenants +Orchestration.update_asynchronous_task_details(*async_update_list, 'Checking server power state... ') +objects_list = ServerOrderObject.command_objects_instances(context['ms_alias']['ms_server_general']) +server_object = ServerOrderObject.command_objects_instances_by_id(context['ms_alias']['ms_server_general'], + objects_list[0])[context['ms_alias']['ms_server_general']][objects_list[0]] +server_object_id = server_object['object_id'] +server_power_state = server_object['power_state'] +Orchestration.update_asynchronous_task_details(*async_update_list, 'Checking server power state... {}'.format(server_power_state)) + +if server_power_state.lower() != 'off': + #Turn off server + Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn off the server... ') + ms_dict = {context['ms_alias']['ms_power_actions']: + {'ForceOff': {'object_id': 'ForceOff', + 'action': 'ForceOff' + } + } + } + ServerOrderObject.command_execute('CREATE', ms_dict) + is_turned_off = False + counter = 10 + while not is_turned_off and counter > 0: + time.sleep(10) + ServerOrderObject.command_synchronize(300) + objects_list = ServerOrderObject.command_objects_instances(context['ms_alias']['ms_server_general']) + server_object = ServerOrderObject.command_objects_instances_by_id(context['ms_alias']['ms_server_general'], + objects_list[0])[context['ms_alias']['ms_server_general']][objects_list[0]] + server_object_id = server_object['object_id'] + server_power_state = server_object['power_state'] + + if server_power_state.lower() == 'off': + is_turned_off = True + + counter -= 1 + if is_turned_off: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn off the server... OK') + success_comment = 'Server has been turned off successfully.' + print(MSA_API.process_content('ENDED', success_comment , context, True)) + else: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn off the server... FAILED') + fail_comment = 'Server has not been turned off by some reason. Stop the automation' + print(MSA_API.process_content('FAIL', success_comment , context, True)) +else: + success_comment = 'Server is already in power off state' + print(MSA_API.process_content('ENDED', success_comment , context, True)) \ No newline at end of file diff --git a/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_on_server.py b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_on_server.py new file mode 100755 index 000000000..d51e9f907 --- /dev/null +++ b/Install_OS_on_baremetal_server/Process_Install_OS/Tasks/Task_Turn_on_server.py @@ -0,0 +1,70 @@ +from msa_sdk.variables import Variables +from msa_sdk.msa_api import MSA_API +from msa_sdk.order import Order +from msa_sdk.orchestration import Orchestration +from datetime import datetime +from msa_sdk import constants +from msa_sdk import util +import json +import sys +import time + + +""" +The proposals of the tasks are: + - Turn on the server + - Check that the server has 'On' power state +""" + + +#Create Variables() object and retrieve useful variables +TaskVariables = Variables() +context = Variables.task_call(TaskVariables) + +#Variables to finish the task properlly +fail_comment = str() +success_comment = str() +fail_string = f'{{"wo_status": "FAIL", "wo_comment": "{fail_comment}"}}' +success_string = f'{{"wo_status": "ENDED", "wo_comment": "{success_comment}"}}' + +#Create Orchestration object to update GUI dynamically +Orchestration = Orchestration(context['UBIQUBEID']) +async_update_list = (context['PROCESSINSTANCEID'], context['TASKID'], context['EXECNUMBER']) + + +#Create order object +ServerOrderObject = Order(context['device_id']) + +Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn on the server... ') + +ms_dict = {context['ms_alias']['ms_power_actions']: + {'On': {'object_id': 'On', + 'action': 'On' + } + } + } +ServerOrderObject.command_execute('CREATE', ms_dict) +is_turned_on = False +counter = 10 +while not is_turned_on and counter > 0: + time.sleep(10) + ServerOrderObject.command_synchronize(300) + objects_list = ServerOrderObject.command_objects_instances(context['ms_alias']['ms_server_general']) + server_object = ServerOrderObject.command_objects_instances_by_id(context['ms_alias']['ms_server_general'], + objects_list[0])[context['ms_alias']['ms_server_general']][objects_list[0]] + server_object_id = server_object['object_id'] + server_power_state = server_object['power_state'] + + if server_power_state.lower() == 'on': + is_turned_on = True + + counter -= 1 + +if is_turned_on: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn on the server... OK') + success_comment = 'Server has been turned on successfully.' + print(MSA_API.process_content('ENDED', success_comment , context, True)) +else: + Orchestration.update_asynchronous_task_details(*async_update_list, 'Turn on the server... FAILED') + fail_comment = 'Server has not been turned on by some reason. Stop the automation' + print(MSA_API.process_content('FAIL', success_comment , context, True)) \ No newline at end of file