diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d4de943f58b7a5145038c8c48dd0be456819af..07482ef5ce02d25c655d8fd551e69d9823bd14a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.3.1] 2025-01-28 +### Added +- Status of VM's on /select-vms page +- Its possible to migrate stopped VM's + + ## [1.3.0] 2025-01-16 ### Added - /liveness, /readiness endpoints diff --git a/app/app.py b/app/app.py index 40143b33865ae831a1fbc4b5847977812de1b65f..e9d702a3930708a8480d7ceb29ffab35aac72915 100644 --- a/app/app.py +++ b/app/app.py @@ -130,8 +130,8 @@ def select_vm(): session['servers_count'] = len(src_project_servers) src_project_server_names = [] for src_project_server in src_project_servers: - src_project_server_names.append(src_project_server['name']) - boxes=[Box('Select source G1 OpenStack VMs for migration',[ + src_project_server_names.append(f"{src_project_server['name']} <span class='{src_project_server['vm_state']}'> {src_project_server['vm_state']} </span>") + boxes=[Box('Select source G1 OpenStack VMs for migration',[ BoxItem('Virtual server names',src_project_server_names,type='checkbox',name='servers[]')]), ] boxes[0].set_error_message('You must select at least 1 server') @@ -146,7 +146,7 @@ def select_vm(): @app.route('/select-vm',methods=['POST']) def select_vm_process(): servers = request.form.getlist('servers[]') - if 'gitlab_pipeline_id' not in session or get_pipeline_status() == 'passed' or get_pipeline_status() == 'failed': + if 'gitlab_pipeline_id' not in session or get_pipeline_status() == 'success' or get_pipeline_status() == 'failed': if servers: # receive Gitlab project, validate we are able to talk to Gitlab @@ -156,8 +156,14 @@ def select_vm_process(): gitlab_pipeline_vars = {'MIGRATION_PIPELINE_TRIGGERER': 'cloud-migrations', 'PROJECT_NAME': session['projects_name'], 'VALIDATION_SERVER_ID': session['src_server_validation_id']} - if len(servers) < session['servers_count']: - gitlab_pipeline_vars['MIGRATE_EXPLICIT_SERVER_NAMES'] = ", ".join(servers) + server_names = [] + + for server in servers: + if not "class='active'" in server: + gitlab_pipeline_vars['PROJECT_MIGRATOR_EXTRA_ARGS'] = '--migrate-inactive-servers=true' + server_names.append(helper.extract_server_name(server)) + server_names = [helper.extract_server_name(server) for server in servers] + gitlab_pipeline_vars['MIGRATE_EXPLICIT_SERVER_NAMES'] = ", ".join(server_names) gitlab_pipeline = gitlab_lib.trigger_gitlab_pipeline(os.getenv('GITLAB_URL'), os.getenv('GITLAB_PROJECT_ID'), os.getenv('GITLAB_PIPELINE_TRIGGER_TOKEN'), diff --git a/app/helper.py b/app/helper.py index 5ecef004ddec20af5a4428b6c03b3fc2962b42b2..238b841154b99876c4a161ed7ddfc17010fb27f3 100644 --- a/app/helper.py +++ b/app/helper.py @@ -29,4 +29,7 @@ def get_error(name): if name in error_messages: return error_messages[name] else: - return error_messages['Unspecified'] \ No newline at end of file + return error_messages['Unspecified'] + +def extract_server_name(text): + return text.split("<span")[0].strip() \ No newline at end of file diff --git a/app/static/css/styles.css b/app/static/css/styles.css index 3ce134e616d7b0f877fb1d8cc44711939da1bb53..bbbdeb6b0954b48c5d54ef658152e1e77ac94a7f 100644 --- a/app/static/css/styles.css +++ b/app/static/css/styles.css @@ -6232,3 +6232,11 @@ td) { .d-flex a { text-decoration: underline; } +.active{ + text-transform: uppercase; + color: green; +} +.stopped{ + text-transform: uppercase; + color: red; +} \ No newline at end of file diff --git a/app/templates/content/select-vms.html b/app/templates/content/select-vms.html index be18155af9628c99af2e6401b92980ccfbc26fe2..d4bef1d289e70dbde87da670246549a473b54d32 100644 --- a/app/templates/content/select-vms.html +++ b/app/templates/content/select-vms.html @@ -17,8 +17,10 @@ </div> {% for input_value in input.value %} <div> - <input name="{{ input.name }}" type="{{ input.type }}" value="{{ input_value }}" checked {% if input.disabled %} disabled {% endif %}/> - <label>{{ input_value }}</label> + <input name="{{ input.name }}" type="{{ input.type }}" value="{{ input_value }}" + {% if "class='active'" in input_value %} checked {% endif %} + {% if input.disabled %} disabled {% endif %}/> + <label>{{ input_value | safe }}</label> </div> {% endfor %} {% endif %}