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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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 @@
+
+
+
+
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