Copilot commented on code in PR #12774:
URL: https://github.com/apache/cloudstack/pull/12774#discussion_r2905375517


##########
.github/workflows/sonar-check.yml:
##########
@@ -16,58 +16,46 @@
 # under the License.
 
 name: Sonar Quality Check
-
-on: [pull_request]
-
 permissions:
-  contents: read # to fetch code (actions/checkout)
-  pull-requests: write # for sonar to comment on pull-request
-
+  contents: read
+  pull-requests: write
+on:
+  push:
+    branches:
+    - main
+  pull_request:
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 jobs:
   build:
-    if: github.repository == 'apache/cloudstack' && 
github.event.pull_request.head.repo.full_name == github.repository
+    if: github.repository == 'apache/cloudstack'
     name: Sonar JaCoCo Coverage
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v5
-        with:
-          ref: "refs/pull/${{ github.event.number }}/merge"
-          fetch-depth: 0
-
-      - name: Set up JDK17
-        uses: actions/setup-java@v5
-        with:
-          distribution: 'temurin'
-          java-version: '17'
-          cache: 'maven'
-
-      - name: Cache SonarCloud packages
-        uses: actions/cache@v5
-        with:
-          path: ~/.sonar/cache
-          key: ${{ runner.os }}-sonar
-          restore-keys: ${{ runner.os }}-sonar
-
-      - name: Cache local Maven repository
-        uses: actions/cache@v5
-        with:
-          path: ~/.m2/repository
-          key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', 
'*/*/pom.xml', '*/*/*/pom.xml') }}
-          restore-keys: |
-            ${{ runner.os }}-m2
-
-      - name: Run Build and Tests with Coverage
-        id: coverage
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
-          PR_ID: ${{ github.event.pull_request.number }}
-          HEADREF: ${{ github.event.pull_request.head.ref }}
-        run: |
-          git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss
-          cd nonoss && bash -x install-non-oss.sh && cd ..
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+    - name: Cache SonarCloud packages
+      uses: actions/cache@v5
+      with:
+        path: ~/.sonar/cache
+        key: ${{ runner.os }}-sonar
+        restore-keys: ${{ runner.os }}-sonar
+    - name: Install Non-OSS
+      uses: ./.github/actions/install-nonoss
+    - name: Run Build and Tests with Coverage
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+        PR_ID: ${{ github.event.pull_request.number }}
+        HEADREF: ${{ github.event.pull_request.head.ref }}
+      run: |
+        if [ "${{ github.event_name }}" == "pull_request" ]; then
           mvn -T$(nproc) -P quality -Dsimulator -Dnoredist clean install 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Dsonar.projectKey=apache_cloudstack -Dsonar.pullrequest.key="$PR_ID" 
-Dsonar.pullrequest.branch="$HEADREF" 
-Dsonar.pullrequest.github.repository=apache/cloudstack 
-Dsonar.pullrequest.provider=GitHub 
-Dsonar.pullrequest.github.summary_comment=true
+        else
+          mvn -T$(nproc) -P quality -Dsimulator -Dnoredist clean install 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Dsonar.projectKey=apache_cloudstack
+        fi

Review Comment:
   The `steps:` sequence items are not indented under the `steps:` key (e.g., 
`- uses:` aligns with `steps:`). This breaks the workflow YAML parsing; indent 
each step list item two more spaces under `steps:`.
   ```suggestion
         - uses: actions/checkout@v5
           with:
             fetch-depth: 0
         - name: Setup Environment
           uses: ./.github/actions/setup-env
         - name: Cache SonarCloud packages
           uses: actions/cache@v5
           with:
             path: ~/.sonar/cache
             key: ${{ runner.os }}-sonar
             restore-keys: ${{ runner.os }}-sonar
         - name: Install Non-OSS
           uses: ./.github/actions/install-nonoss
         - name: Run Build and Tests with Coverage
           env:
             GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
             SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
             PR_ID: ${{ github.event.pull_request.number }}
             HEADREF: ${{ github.event.pull_request.head.ref }}
           run: |
             if [ "${{ github.event_name }}" == "pull_request" ]; then
               mvn -T$(nproc) -P quality -Dsimulator -Dnoredist clean install 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Dsonar.projectKey=apache_cloudstack -Dsonar.pullrequest.key="$PR_ID" 
-Dsonar.pullrequest.branch="$HEADREF" 
-Dsonar.pullrequest.github.repository=apache/cloudstack 
-Dsonar.pullrequest.provider=GitHub 
-Dsonar.pullrequest.github.summary_comment=true
             else
               mvn -T$(nproc) -P quality -Dsimulator -Dnoredist clean install 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Dsonar.projectKey=apache_cloudstack
             fi
   ```



##########
.github/actions/install-nonoss/action.yml:
##########
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

Review Comment:
   This composite action clones and executes a script from an external 
repository without pinning to a tag/commit. That can introduce supply-chain 
risk and makes builds non-reproducible. Consider pinning to a specific 
commit/tag (or making the ref an input) and using a shallow clone to reduce 
checkout time.



##########
.github/actions/setup-env/action.yml:
##########
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: 'Setup CloudStack Environment'
+description: 'Sets up JDK (with Maven cache), optionally Python, and 
optionally APT build dependencies for CloudStack.'
+
+inputs:
+  java-version:
+    description: 'The JDK version to use'
+    required: false
+    default: '17'
+  install-python:
+    description: 'Whether to install Python 3.10'
+    required: false
+    default: 'false'
+  install-apt-deps:
+    description: 'Whether to install CloudStack APT build dependencies'
+    required: false
+    default: 'false'
+
+runs:
+  using: "composite"
+  steps:
+    - name: Set up JDK ${{ inputs.java-version }}
+      uses: actions/setup-java@v4
+      with:
+        java-version: ${{ inputs.java-version }}

Review Comment:
   `apt-get install` list includes `ipmitool` twice. This is harmless but 
noisy; remove the duplicate entry to keep the dependency list maintainable.



##########
.github/workflows/sonar-check.yml:
##########
@@ -16,58 +16,46 @@
 # under the License.
 
 name: Sonar Quality Check
-
-on: [pull_request]
-
 permissions:
-  contents: read # to fetch code (actions/checkout)
-  pull-requests: write # for sonar to comment on pull-request
-
+  contents: read
+  pull-requests: write
+on:
+  push:
+    branches:
+    - main
+  pull_request:
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 jobs:
   build:
-    if: github.repository == 'apache/cloudstack' && 
github.event.pull_request.head.repo.full_name == github.repository
+    if: github.repository == 'apache/cloudstack'
     name: Sonar JaCoCo Coverage
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v5
-        with:
-          ref: "refs/pull/${{ github.event.number }}/merge"
-          fetch-depth: 0
-
-      - name: Set up JDK17
-        uses: actions/setup-java@v5
-        with:
-          distribution: 'temurin'
-          java-version: '17'
-          cache: 'maven'
-
-      - name: Cache SonarCloud packages
-        uses: actions/cache@v5
-        with:
-          path: ~/.sonar/cache
-          key: ${{ runner.os }}-sonar
-          restore-keys: ${{ runner.os }}-sonar
-
-      - name: Cache local Maven repository
-        uses: actions/cache@v5
-        with:
-          path: ~/.m2/repository
-          key: ${{ runner.os }}-m2-${{ hashFiles('pom.xml', '*/pom.xml', 
'*/*/pom.xml', '*/*/*/pom.xml') }}
-          restore-keys: |
-            ${{ runner.os }}-m2
-
-      - name: Run Build and Tests with Coverage
-        id: coverage
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
-          PR_ID: ${{ github.event.pull_request.number }}
-          HEADREF: ${{ github.event.pull_request.head.ref }}
-        run: |
-          git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss
-          cd nonoss && bash -x install-non-oss.sh && cd ..
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+    - name: Cache SonarCloud packages
+      uses: actions/cache@v5
+      with:
+        path: ~/.sonar/cache
+        key: ${{ runner.os }}-sonar
+        restore-keys: ${{ runner.os }}-sonar
+    - name: Install Non-OSS
+      uses: ./.github/actions/install-nonoss
+    - name: Run Build and Tests with Coverage
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+        PR_ID: ${{ github.event.pull_request.number }}
+        HEADREF: ${{ github.event.pull_request.head.ref }}

Review Comment:
   This job runs on all `pull_request` events, but it relies on 
`secrets.SONAR_TOKEN`. For PRs from forks, secrets are not provided and the 
Sonar invocation will fail, blocking external contributors. Reintroduce a fork 
check (e.g., only run for same-repo PRs) or restructure the trigger/permissions 
so the job can run safely without repo secrets.



##########
.github/workflows/ci.yml:
##########
@@ -16,335 +16,227 @@
 # under the License.
 
 name: Simulator CI
-
-on: [push, pull_request]
-
+on:
+  - push
+  - pull_request
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 permissions:
   contents: read
-
 jobs:
   build:
     if: github.repository == 'apache/cloudstack'
     runs-on: ubuntu-24.04
-
+    steps:
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+      with:
+        install-python: 'true'
+        install-apt-deps: 'true'
+    - name: Env details
+      run: |
+        uname -a
+        whoami
+        javac -version
+        mvn -v
+        python3 --version
+        free -m
+        nproc
+        git status
+        ipmitool -V
+    - name: Build with Maven
+      run: |
+        mvn -B -P developer,systemvm -Dsimulator clean install 
-DskipTests=true -T$(nproc)
+    - name: Archive artifacts
+      run: |
+        mkdir -p /tmp/artifacts
+        tar -czf /tmp/artifacts/targets.tar.gz $(find . -name "target" -type 
d) tools/marvin/dist
+        tar -czf /tmp/artifacts/m2-cloudstack.tar.gz -C ~/.m2/repository 
org/apache/cloudstack
+    - name: Upload artifacts
+      uses: actions/upload-artifact@v4
+      with:
+        name: build-artifacts
+        path: /tmp/artifacts/
+  test:
+    needs: build
+    if: github.repository == 'apache/cloudstack'
+    runs-on: ubuntu-24.04
     strategy:
       fail-fast: false
       matrix:
-        tests: [ "smoke/test_accounts
-                  smoke/test_account_access
-                  smoke/test_affinity_groups
-                  smoke/test_affinity_groups_projects
-                  smoke/test_annotations
-                  smoke/test_async_job
-                  smoke/test_attach_multiple_volumes
-                  smoke/test_backup_recovery_dummy
-                  smoke/test_certauthority_root
-                  smoke/test_console_endpoint
-                  smoke/test_create_list_domain_account_project
-                  smoke/test_create_network
-                  smoke/test_deploy_vgpu_enabled_vm
-                  smoke/test_deploy_virtio_scsi_vm
-                  smoke/test_deploy_vm_extra_config_data
-                  smoke/test_deploy_vm_iso
-                  smoke/test_deploy_vm_iso_uefi
-                  smoke/test_deploy_vm_root_resize
-                  smoke/test_deploy_vm_with_userdata
-                  smoke/test_deploy_vms_in_parallel
-                  smoke/test_deploy_vms_with_varied_deploymentplanners
-                  smoke/test_restore_vm
-                  smoke/test_diagnostics
-                  smoke/test_direct_download
-                  smoke/test_disk_offerings
-                  smoke/test_disk_provisioning_types
-                  smoke/test_domain_disk_offerings
-                  smoke/test_domain_network_offerings
-                  smoke/test_domain_service_offerings
-                  smoke/test_domain_vpc_offerings",
-                "smoke/test_cluster_drs
-                  smoke/test_dynamicroles
-                  smoke/test_enable_account_settings_for_domain
-                  smoke/test_enable_role_based_users_in_projects
-                  smoke/test_events_resource
-                  smoke/test_global_settings
-                  smoke/test_guest_vlan_range
-                  smoke/test_host_maintenance
-                  smoke/test_hostha_kvm
-                  smoke/test_hostha_simulator
-                  smoke/test_internal_lb
-                  smoke/test_ipv6_infra
-                  smoke/test_iso
-                  smoke/test_kubernetes_clusters
-                  smoke/test_kubernetes_supported_versions
-                  smoke/test_list_ids_parameter
-                  smoke/test_loadbalance
-                  smoke/test_login
-                  smoke/test_2fa
-                  smoke/test_metrics_api
-                  smoke/test_migration
-                  smoke/test_multipleips_per_nic
-                  smoke/test_nested_virtualization
-                  smoke/test_set_sourcenat
-                  smoke/test_webhook_lifecycle
-                  smoke/test_purge_expunged_vms
-                  smoke/test_extension_lifecycle
-                  smoke/test_extension_custom_action_lifecycle
-                  smoke/test_extension_custom",
-                "smoke/test_network
-                  smoke/test_network_acl
-                  smoke/test_network_ipv6
-                  smoke/test_network_permissions
-                  smoke/test_nic
-                  smoke/test_nic_adapter_type
-                  smoke/test_non_contigiousvlan
-                  smoke/test_object_stores
-                  smoke/test_outofbandmanagement
-                  smoke/test_outofbandmanagement_nestedplugin
-                  smoke/test_over_provisioning
-                  smoke/test_password_server
-                  smoke/test_persistent_network
-                  smoke/test_portable_publicip
-                  smoke/test_portforwardingrules
-                  smoke/test_primary_storage
-                  smoke/test_privategw_acl
-                  smoke/test_privategw_acl_ovs_gre
-                  smoke/test_projects
-                  smoke/test_public_ip_range
-                  smoke/test_pvlan
-                  smoke/test_regions
-                  smoke/test_register_userdata
-                  smoke/test_reset_configuration_settings
-                  smoke/test_reset_vm_on_reboot
-                  smoke/test_resource_accounting
-                  smoke/test_resource_detail
-                  smoke/test_global_acls",
-                "smoke/test_router_dhcphosts
-                  smoke/test_router_dns
-                  smoke/test_router_dnsservice
-                  smoke/test_routers
-                  smoke/test_routers_iptables_default_policy
-                  smoke/test_routers_network_ops
-                  smoke/test_scale_vm
-                  smoke/test_secondary_storage
-                  smoke/test_service_offerings
-                  smoke/test_snapshots
-                  smoke/test_ssvm
-                  smoke/test_staticroles
-                  smoke/test_templates
-                  smoke/test_update_security_group
-                  smoke/test_usage
-                  smoke/test_usage_events
-                  smoke/test_vm_deployment_planner
-                  smoke/test_vm_strict_host_tags
-                  smoke/test_vm_schedule
-                  smoke/test_deploy_vgpu_enabled_vm
-                  smoke/test_vm_life_cycle
-                  smoke/test_vm_lifecycle_unmanage_import
-                  smoke/test_vm_snapshot_kvm
-                  smoke/test_vm_snapshots
-                  smoke/test_volumes
-                  smoke/test_vpc_ipv6
-                  smoke/test_vpc_redundant
-                  smoke/test_vpc_router_nics
-                  smoke/test_vpc_vpn",
-                "component/find_hosts_for_migration
-                  component/test_acl_isolatednetwork
-                  component/test_acl_isolatednetwork_delete
-                  component/test_acl_listsnapshot",
-                "component/test_acl_listvm
-                  component/test_acl_listvolume",
-                "component/test_acl_sharednetwork
-                  component/test_acl_sharednetwork_deployVM-impersonation
-                  component/test_user_private_gateway
-                  component/test_user_shared_network",
-                "component/test_affinity_groups_projects
-                  component/test_allocation_states
-                  component/test_assign_vm",
-                "component/test_concurrent_snapshots_limit
-                  component/test_cpu_domain_limits
-                  component/test_cpu_limits
-                  component/test_cpu_max_limits
-                  component/test_cpu_project_limits
-                  component/test_deploy_vm_userdata_multi_nic
-                  component/test_deploy_vm_lease",
-                "component/test_egress_fw_rules
-                  component/test_invalid_gw_nm
-                  component/test_ip_reservation",
-                "component/test_lb_secondary_ip
-                  component/test_list_nics
-                  component/test_list_pod
-                  component/test_memory_limits",
-                "component/test_mm_domain_limits
-                  component/test_mm_max_limits
-                  component/test_mm_project_limits
-                  component/test_network_offering
-                  component/test_non_contiguous_vlan",
-                "component/test_persistent_networks
-                  component/test_project_configs
-                  component/test_project_limits
-                  component/test_project_resources",
-                "component/test_project_usage
-                  component/test_protocol_number_security_group
-                  component/test_public_ip
-                  component/test_resource_limits
-                  component/test_resource_limit_tags",
-                "component/test_regions_accounts
-                  component/test_routers
-                  component/test_snapshots
-                  component/test_stopped_vm
-                  component/test_tags
-                  component/test_templates
-                  component/test_updateResourceCount
-                  component/test_update_vm",
-                "component/test_volumes
-                  component/test_vpc
-                  component/test_vpc_distributed_routing_offering
-                  component/test_vpc_network
-                  component/test_vpc_offerings
-                  component/test_vpc_routers
-                  component/test_vpn_users
-                  component/test_vpc_network_lbrules",
-                "smoke/test_list_accounts
-                  smoke/test_list_disk_offerings
-                  smoke/test_list_domains
-                  smoke/test_list_hosts
-                  smoke/test_list_service_offerings
-                  smoke/test_list_storage_pools
-                  smoke/test_list_volumes"]
-
+        tests:
+        - smoke/test_accounts smoke/test_account_access 
smoke/test_affinity_groups
+          smoke/test_affinity_groups_projects smoke/test_annotations 
smoke/test_async_job
+          smoke/test_attach_multiple_volumes smoke/test_backup_recovery_dummy 
smoke/test_certauthority_root
+          smoke/test_console_endpoint 
smoke/test_create_list_domain_account_project
+          smoke/test_create_network smoke/test_deploy_vgpu_enabled_vm 
smoke/test_deploy_virtio_scsi_vm
+          smoke/test_deploy_vm_extra_config_data smoke/test_deploy_vm_iso 
smoke/test_deploy_vm_iso_uefi
+          smoke/test_deploy_vm_root_resize smoke/test_deploy_vm_with_userdata 
smoke/test_deploy_vms_in_parallel
+          smoke/test_deploy_vms_with_varied_deploymentplanners 
smoke/test_restore_vm
+          smoke/test_diagnostics smoke/test_direct_download 
smoke/test_disk_offerings
+          smoke/test_disk_provisioning_types smoke/test_domain_disk_offerings 
smoke/test_domain_network_offerings
+          smoke/test_domain_service_offerings smoke/test_domain_vpc_offerings
+        - smoke/test_cluster_drs smoke/test_dynamicroles 
smoke/test_enable_account_settings_for_domain
+          smoke/test_enable_role_based_users_in_projects 
smoke/test_events_resource
+          smoke/test_global_settings smoke/test_guest_vlan_range 
smoke/test_host_maintenance
+          smoke/test_hostha_kvm smoke/test_hostha_simulator 
smoke/test_internal_lb
+          smoke/test_ipv6_infra smoke/test_iso smoke/test_kubernetes_clusters 
smoke/test_kubernetes_supported_versions
+          smoke/test_list_ids_parameter smoke/test_loadbalance 
smoke/test_login smoke/test_2fa
+          smoke/test_metrics_api smoke/test_migration 
smoke/test_multipleips_per_nic
+          smoke/test_nested_virtualization smoke/test_set_sourcenat 
smoke/test_webhook_lifecycle
+          smoke/test_purge_expunged_vms smoke/test_extension_lifecycle 
smoke/test_extension_custom_action_lifecycle
+          smoke/test_extension_custom
+        - smoke/test_network smoke/test_network_acl smoke/test_network_ipv6 
smoke/test_network_permissions
+          smoke/test_nic smoke/test_nic_adapter_type 
smoke/test_non_contigiousvlan
+          smoke/test_object_stores smoke/test_outofbandmanagement 
smoke/test_outofbandmanagement_nestedplugin
+          smoke/test_over_provisioning smoke/test_password_server 
smoke/test_persistent_network
+          smoke/test_portable_publicip smoke/test_portforwardingrules 
smoke/test_primary_storage
+          smoke/test_privategw_acl smoke/test_privategw_acl_ovs_gre 
smoke/test_projects
+          smoke/test_public_ip_range smoke/test_pvlan smoke/test_regions 
smoke/test_register_userdata
+          smoke/test_reset_configuration_settings 
smoke/test_reset_vm_on_reboot smoke/test_resource_accounting
+          smoke/test_resource_detail smoke/test_global_acls
+        - smoke/test_router_dhcphosts smoke/test_router_dns 
smoke/test_router_dnsservice
+          smoke/test_routers smoke/test_routers_iptables_default_policy 
smoke/test_routers_network_ops
+          smoke/test_scale_vm smoke/test_secondary_storage 
smoke/test_service_offerings
+          smoke/test_snapshots smoke/test_ssvm smoke/test_staticroles 
smoke/test_templates
+          smoke/test_update_security_group smoke/test_usage 
smoke/test_usage_events
+          smoke/test_vm_deployment_planner smoke/test_vm_strict_host_tags 
smoke/test_vm_schedule
+          smoke/test_deploy_vgpu_enabled_vm smoke/test_vm_life_cycle 
smoke/test_vm_lifecycle_unmanage_import
+          smoke/test_vm_snapshot_kvm smoke/test_vm_snapshots 
smoke/test_volumes smoke/test_vpc_ipv6
+          smoke/test_vpc_redundant smoke/test_vpc_router_nics 
smoke/test_vpc_vpn
+        - component/find_hosts_for_migration 
component/test_acl_isolatednetwork component/test_acl_isolatednetwork_delete
+          component/test_acl_listsnapshot
+        - component/test_acl_listvm component/test_acl_listvolume
+        - component/test_acl_sharednetwork 
component/test_acl_sharednetwork_deployVM-impersonation
+          component/test_user_private_gateway 
component/test_user_shared_network
+        - component/test_affinity_groups_projects 
component/test_allocation_states
+          component/test_assign_vm
+        - component/test_concurrent_snapshots_limit 
component/test_cpu_domain_limits
+          component/test_cpu_limits component/test_cpu_max_limits 
component/test_cpu_project_limits
+          component/test_deploy_vm_userdata_multi_nic 
component/test_deploy_vm_lease
+        - component/test_egress_fw_rules component/test_invalid_gw_nm 
component/test_ip_reservation
+        - component/test_lb_secondary_ip component/test_list_nics 
component/test_list_pod
+          component/test_memory_limits
+        - component/test_mm_domain_limits component/test_mm_max_limits 
component/test_mm_project_limits
+          component/test_network_offering component/test_non_contiguous_vlan
+        - component/test_persistent_networks component/test_project_configs 
component/test_project_limits
+          component/test_project_resources
+        - component/test_project_usage 
component/test_protocol_number_security_group
+          component/test_public_ip component/test_resource_limits 
component/test_resource_limit_tags
+        - component/test_regions_accounts component/test_routers 
component/test_snapshots
+          component/test_stopped_vm component/test_tags 
component/test_templates component/test_updateResourceCount
+          component/test_update_vm
+        - component/test_volumes component/test_vpc 
component/test_vpc_distributed_routing_offering
+          component/test_vpc_network component/test_vpc_offerings 
component/test_vpc_routers
+          component/test_vpn_users component/test_vpc_network_lbrules
+        - smoke/test_list_accounts smoke/test_list_disk_offerings 
smoke/test_list_domains
+          smoke/test_list_hosts smoke/test_list_service_offerings 
smoke/test_list_storage_pools
+          smoke/test_list_volumes
     steps:
-      - uses: actions/checkout@v5
-        with:
-          fetch-depth: 0
-
-      - name: Set up JDK 17
-        uses: actions/setup-java@v5
-        with:
-          distribution: 'temurin'
-          java-version: '17'
-          cache: 'maven'
-
-      - name: Set up Python
-        uses: actions/setup-python@v6
-        with:
-          python-version: '3.10'
-          architecture: 'x64'
-
-      - name: Install Build Dependencies
-        run: |
-          sudo apt-get update
-          sudo apt-get install -y git uuid-runtime genisoimage netcat-openbsd 
ipmitool build-essential libgcrypt20 libgpg-error-dev libgpg-error0 
libopenipmi0 ipmitool libpython3-dev libssl-dev libffi-dev python3-openssl 
python3-dev python3-setuptools
-
-      - name: Setup IPMI Tool for CloudStack
-        run: |
-          # Create cloudstack-common directory if it doesn't exist
-          sudo mkdir -p /usr/share/cloudstack-common
-
-          # Copy ipmitool to cloudstack-common directory if it doesn't exist
-          if [ ! -f /usr/share/cloudstack-common/ipmitool ]; then
-            sudo cp /usr/bin/ipmitool /usr/share/cloudstack-common/ipmitool
-            sudo chmod 755 /usr/share/cloudstack-common/ipmitool
-          fi
-
-          # Create ipmitool-C3 wrapper script
-          sudo tee /usr/bin/ipmitool > /dev/null << 'EOF'
-          #!/bin/bash
-          /usr/share/cloudstack-common/ipmitool -C3 $@
-          EOF
-          sudo chmod 755 /usr/bin/ipmitool
-
-      - name: Install Python dependencies
-        run: |
-          python3 -m pip install --user --upgrade urllib3 lxml paramiko nose 
texttable ipmisim pyopenssl pycryptodome mock flask netaddr pylint pycodestyle 
six astroid pynose
-
-      - name: Install jacoco dependencies
-        run: |
-          wget 
https://github.com/jacoco/jacoco/releases/download/v0.8.10/jacoco-0.8.10.zip
-          unzip jacoco-0.8.10.zip -d jacoco
-
-      - name: Env details
-        run: |
-          uname -a
-          whoami
-          javac -version
-          mvn -v
-          python3 --version
-          free -m
-          nproc
-          git status
-          ipmitool -V
-
-      - name: Setup MySQL Server
-        run: |
-          # 
https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2004-Readme.md#mysql
-          sudo apt-get install -y mysql-server
-          sudo systemctl start mysql
-          sudo mysql -uroot -proot -e "ALTER USER 'root'@'localhost' 
IDENTIFIED WITH mysql_native_password BY ''; FLUSH PRIVILEGES;"
-          sudo systemctl restart mysql
-          sudo mysql -uroot -e "SELECT VERSION();"
-
-      - name: Build with Maven
-        run: |
-          mvn -B -P developer,systemvm -Dsimulator clean install 
-DskipTests=true -T$(nproc)
-
-      - name: Setup Simulator Prerequisites
-        run: |
-          sudo python3 -m pip install --upgrade netaddr mysql-connector-python
-          python3 -m pip install --user --upgrade 
tools/marvin/dist/[mM]arvin-*.tar.gz
-          mvn -q -Pdeveloper -pl developer -Ddeploydb
-          mvn -q -Pdeveloper -pl developer -Ddeploydb-simulator
-
-      - name: Generate jacoco-coverage.sh
-        run: |
-          echo "java -jar jacoco/lib/jacococli.jar report jacoco-it.exec \\" > 
jacoco-report.sh
-          find . | grep "target/classes" | sed 's/\/classes\//\/classes /g' | 
awk '{print "--classfiles", $1, "\\"}' | sort |uniq >> jacoco-report.sh
-          find . | grep "src/main/java" | sed 's/\/java\//\/java /g' | awk 
'{print "--sourcefiles", $1, "\\"}' | sort | uniq >> jacoco-report.sh
-          echo "--xml jacoco-coverage.xml" >> jacoco-report.sh
-
-      - name: Start CloudStack Management Server with Simulator
-        run: |
-          export MAVEN_OPTS="-Xmx4096m -XX:MaxMetaspaceSize=800m 
-Djava.security.egd=file:/dev/urandom  
-javaagent:jacoco/lib/jacocoagent.jar=address=*,port=36320,output=tcpserver 
--add-opens=java.base/java.lang=ALL-UNNAMED 
--add-exports=java.base/sun.security.x509=ALL-UNNAMED 
--add-opens=java.base/jdk.internal.reflect=ALL-UNNAMED"
-          echo -e "\nStarting simulator"
-          set +e
-          mvn -Dsimulator -Dorg.eclipse.jetty.annotations.maxWait=120 -pl 
:cloud-client-ui jetty:run 2>&1 > /tmp/jetty-log || true &
-          while ! nc -vzw 5 localhost 8096 2>&1 > /dev/null; do grep Exception 
/tmp/jetty-log; sleep 10; done
-          set -e
-          echo -e "\nStarting Advanced Zone DataCenter deployment"
-          python3 tools/marvin/marvin/deployDataCenter.py -i 
setup/dev/advdualzone.cfg 2>&1 || true
-
-      - name: Run Integration Tests with Simulator
-        run: |
-          mkdir -p integration-test-results/smoke/misc
-          mkdir -p integration-test-results/component
-          set -e
-          TESTS="${{ matrix.tests }}"
-          echo "Tests in this job: $TESTS"
-
-          TESTS=($(echo $TESTS | tr -d '\n' | tr -s ' '))
-          for suite in "${TESTS[@]}" ; do
-            echo -e "Currently running test: $suite\n"
-            time nosetests-3.4 --with-xunit 
--xunit-file=integration-test-results/$suite.xml --with-marvin 
--marvin-config=setup/dev/advdualzone.cfg test/integration/$suite.py -s -a 
tags=advanced,required_hardware=false --zone=zim1 --hypervisor=simulator || 
true ;
-          done
-
-          echo -e "Stopping Simulator, integration tests run completed\n"
-          java -jar jacoco/lib/jacococli.jar dump --address localhost --port 
36320 --destfile jacoco-it.exec
-          bash jacoco-report.sh
-          mvn -Dsimulator -pl client jetty:stop 2>&1
-          find /tmp//MarvinLogs -type f -exec echo -e "Printing marvin logs {} 
:\n" \; -exec cat {} \;
-
-      - name: Integration Tests Result
-        run: |
-          echo -e "Simulator CI Test Results: (only failures listed)\n"
-          python3 ./tools/marvin/xunit-reader.py integration-test-results/
-
-      - uses: codecov/codecov-action@v4
-        with:
-          files: jacoco-coverage.xml
-          fail_ci_if_error: true
-          flags: simulator-marvin-tests
-          verbose: true
-          name: codecov
-          token: ${{ secrets.CODECOV_TOKEN }}
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+      with:
+        install-python: 'true'

Review Comment:
   The `steps:` sequence items are not indented under `steps:` for the `test` 
job (e.g., `- uses:` aligns with `steps:`). This makes the workflow YAML 
invalid; indent all step items under `steps:`.



##########
.github/workflows/sonar-check.yml:
##########
@@ -16,58 +16,46 @@
 # under the License.
 
 name: Sonar Quality Check
-
-on: [pull_request]
-
 permissions:
-  contents: read # to fetch code (actions/checkout)
-  pull-requests: write # for sonar to comment on pull-request
-
+  contents: read
+  pull-requests: write
+on:
+  push:
+    branches:
+    - main

Review Comment:
   `on.push.branches` list item is not indented under `branches:` (currently 
`branches:` and `- main` are at the same indentation). This makes the workflow 
YAML invalid; indent `- main` under `branches:`.
   ```suggestion
         - main
   ```



##########
.github/workflows/build.yml:
##########
@@ -16,53 +16,36 @@
 # under the License.
 
 name: Build
-
-on: [push, pull_request]
-
+on:
+- push
+- pull_request
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 permissions:
   contents: read
-
 jobs:
   build:
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v5
-
-      - name: Set up JDK 17
-        uses: actions/setup-java@v5
-        with:
-          distribution: 'temurin'
-          java-version: '17'
-          cache: 'maven'
-
-      - name: Set up Python
-        uses: actions/setup-python@v6
-        with:
-          python-version: '3.10'
-          architecture: 'x64'
-
-      - name: Install Build Dependencies
-        run: |
-          sudo apt-get update
-          sudo apt-get install -y git uuid-runtime genisoimage netcat ipmitool 
build-essential libgcrypt20 libgpg-error-dev libgpg-error0 libopenipmi0 
ipmitool libpython3-dev libssl-dev libffi-dev python3-openssl python3-dev 
python3-setuptools
-
-      - name: Env details
-        run: |
-          uname -a
-          whoami
-          javac -version
-          mvn -v
-          python3 --version
-          free -m
-          nproc
-          git status
-
-      - name: Noredist Build
-        run: |
-          git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss 
&& cd nonoss && bash -x install-non-oss.sh && cd ..
-          rm -fr nonoss
-          mvn -B -P developer,systemvm -Dsimulator -Dnoredist clean install 
-T$(nproc)
+    - uses: actions/checkout@v5
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+      with:
+        install-python: 'true'
+        install-apt-deps: 'true'

Review Comment:
   The `steps:` sequence items are not indented under `steps:` (the `- uses:` 
lines align with `steps:`). This makes the workflow YAML invalid; indent each 
step item under `steps:`.



##########
.github/workflows/ci.yml:
##########
@@ -16,335 +16,227 @@
 # under the License.
 
 name: Simulator CI
-
-on: [push, pull_request]
-
+on:
+  - push
+  - pull_request
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 permissions:
   contents: read
-
 jobs:
   build:
     if: github.repository == 'apache/cloudstack'
     runs-on: ubuntu-24.04
-
+    steps:
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+      with:
+        install-python: 'true'

Review Comment:
   The `steps:` sequence items are not indented under `steps:` in this job 
(e.g., `- uses:` aligns with `steps:`). This breaks YAML parsing for the 
workflow; indent the step list under `steps:`.



##########
.github/workflows/rat.yml:
##########
@@ -16,35 +16,28 @@
 # under the License.
 
 name: License Check
-
-on: [push, pull_request]
-
+on:
+- push
+- pull_request
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 permissions:
   contents: read
-
 jobs:
   build:
     runs-on: ubuntu-22.04
     steps:
-      - uses: actions/checkout@v5
-      - name: Set up JDK 17
-        uses: actions/setup-java@v5
-        with:
-          java-version: '17'
-          distribution: 'adopt'
-          architecture: x64
-          cache: maven
-      - name: RAT licence checks
-        run: |
-          git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss 
&& cd nonoss && bash -x install-non-oss.sh && cd ..
-          rm -fr nonoss
-          mvn -P developer,systemvm -Dsimulator -Dnoredist -pl . 
org.apache.rat:apache-rat-plugin:0.12:check
-      - name: Rat Report
-        if: always()
-        run: |
-          echo -e "Printing RAT report\n"
-          cat target/rat.txt || true
+    - uses: actions/checkout@v5
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+    - name: Install Non-OSS
+      uses: ./.github/actions/install-nonoss

Review Comment:
   The `steps:` sequence items are not indented under `steps:` (the `- uses:` 
lines align with `steps:`). This makes the workflow YAML invalid; indent each 
step item under `steps:`.



##########
.github/workflows/ci.yml:
##########
@@ -16,335 +16,227 @@
 # under the License.
 
 name: Simulator CI
-
-on: [push, pull_request]
-
+on:
+  - push
+  - pull_request
 concurrency:
   group: ${{ github.workflow }}-${{ github.event.pull_request.number || 
github.ref }}
-  cancel-in-progress: true
-
+  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
 permissions:
   contents: read
-
 jobs:
   build:
     if: github.repository == 'apache/cloudstack'
     runs-on: ubuntu-24.04
-
+    steps:
+    - uses: actions/checkout@v5
+      with:
+        fetch-depth: 0
+    - name: Setup Environment
+      uses: ./.github/actions/setup-env
+      with:
+        install-python: 'true'
+        install-apt-deps: 'true'
+    - name: Env details
+      run: |
+        uname -a
+        whoami
+        javac -version
+        mvn -v
+        python3 --version
+        free -m
+        nproc
+        git status
+        ipmitool -V
+    - name: Build with Maven
+      run: |
+        mvn -B -P developer,systemvm -Dsimulator clean install 
-DskipTests=true -T$(nproc)
+    - name: Archive artifacts
+      run: |
+        mkdir -p /tmp/artifacts
+        tar -czf /tmp/artifacts/targets.tar.gz $(find . -name "target" -type 
d) tools/marvin/dist
+        tar -czf /tmp/artifacts/m2-cloudstack.tar.gz -C ~/.m2/repository 
org/apache/cloudstack
+    - name: Upload artifacts
+      uses: actions/upload-artifact@v4
+      with:
+        name: build-artifacts
+        path: /tmp/artifacts/
+  test:
+    needs: build
+    if: github.repository == 'apache/cloudstack'
+    runs-on: ubuntu-24.04
     strategy:
       fail-fast: false
       matrix:
-        tests: [ "smoke/test_accounts
-                  smoke/test_account_access
-                  smoke/test_affinity_groups
-                  smoke/test_affinity_groups_projects
-                  smoke/test_annotations
-                  smoke/test_async_job
-                  smoke/test_attach_multiple_volumes
-                  smoke/test_backup_recovery_dummy
-                  smoke/test_certauthority_root
-                  smoke/test_console_endpoint
-                  smoke/test_create_list_domain_account_project
-                  smoke/test_create_network
-                  smoke/test_deploy_vgpu_enabled_vm
-                  smoke/test_deploy_virtio_scsi_vm
-                  smoke/test_deploy_vm_extra_config_data
-                  smoke/test_deploy_vm_iso
-                  smoke/test_deploy_vm_iso_uefi
-                  smoke/test_deploy_vm_root_resize
-                  smoke/test_deploy_vm_with_userdata
-                  smoke/test_deploy_vms_in_parallel
-                  smoke/test_deploy_vms_with_varied_deploymentplanners
-                  smoke/test_restore_vm
-                  smoke/test_diagnostics
-                  smoke/test_direct_download
-                  smoke/test_disk_offerings
-                  smoke/test_disk_provisioning_types
-                  smoke/test_domain_disk_offerings
-                  smoke/test_domain_network_offerings
-                  smoke/test_domain_service_offerings
-                  smoke/test_domain_vpc_offerings",
-                "smoke/test_cluster_drs
-                  smoke/test_dynamicroles
-                  smoke/test_enable_account_settings_for_domain
-                  smoke/test_enable_role_based_users_in_projects
-                  smoke/test_events_resource
-                  smoke/test_global_settings
-                  smoke/test_guest_vlan_range
-                  smoke/test_host_maintenance
-                  smoke/test_hostha_kvm
-                  smoke/test_hostha_simulator
-                  smoke/test_internal_lb
-                  smoke/test_ipv6_infra
-                  smoke/test_iso
-                  smoke/test_kubernetes_clusters
-                  smoke/test_kubernetes_supported_versions
-                  smoke/test_list_ids_parameter
-                  smoke/test_loadbalance
-                  smoke/test_login
-                  smoke/test_2fa
-                  smoke/test_metrics_api
-                  smoke/test_migration
-                  smoke/test_multipleips_per_nic
-                  smoke/test_nested_virtualization
-                  smoke/test_set_sourcenat
-                  smoke/test_webhook_lifecycle
-                  smoke/test_purge_expunged_vms
-                  smoke/test_extension_lifecycle
-                  smoke/test_extension_custom_action_lifecycle
-                  smoke/test_extension_custom",
-                "smoke/test_network
-                  smoke/test_network_acl
-                  smoke/test_network_ipv6
-                  smoke/test_network_permissions
-                  smoke/test_nic
-                  smoke/test_nic_adapter_type
-                  smoke/test_non_contigiousvlan
-                  smoke/test_object_stores
-                  smoke/test_outofbandmanagement
-                  smoke/test_outofbandmanagement_nestedplugin
-                  smoke/test_over_provisioning
-                  smoke/test_password_server
-                  smoke/test_persistent_network
-                  smoke/test_portable_publicip
-                  smoke/test_portforwardingrules
-                  smoke/test_primary_storage
-                  smoke/test_privategw_acl
-                  smoke/test_privategw_acl_ovs_gre
-                  smoke/test_projects
-                  smoke/test_public_ip_range
-                  smoke/test_pvlan
-                  smoke/test_regions
-                  smoke/test_register_userdata
-                  smoke/test_reset_configuration_settings
-                  smoke/test_reset_vm_on_reboot
-                  smoke/test_resource_accounting
-                  smoke/test_resource_detail
-                  smoke/test_global_acls",
-                "smoke/test_router_dhcphosts
-                  smoke/test_router_dns
-                  smoke/test_router_dnsservice
-                  smoke/test_routers
-                  smoke/test_routers_iptables_default_policy
-                  smoke/test_routers_network_ops
-                  smoke/test_scale_vm
-                  smoke/test_secondary_storage
-                  smoke/test_service_offerings
-                  smoke/test_snapshots
-                  smoke/test_ssvm
-                  smoke/test_staticroles
-                  smoke/test_templates
-                  smoke/test_update_security_group
-                  smoke/test_usage
-                  smoke/test_usage_events
-                  smoke/test_vm_deployment_planner
-                  smoke/test_vm_strict_host_tags
-                  smoke/test_vm_schedule
-                  smoke/test_deploy_vgpu_enabled_vm
-                  smoke/test_vm_life_cycle
-                  smoke/test_vm_lifecycle_unmanage_import
-                  smoke/test_vm_snapshot_kvm
-                  smoke/test_vm_snapshots
-                  smoke/test_volumes
-                  smoke/test_vpc_ipv6
-                  smoke/test_vpc_redundant
-                  smoke/test_vpc_router_nics
-                  smoke/test_vpc_vpn",
-                "component/find_hosts_for_migration
-                  component/test_acl_isolatednetwork
-                  component/test_acl_isolatednetwork_delete
-                  component/test_acl_listsnapshot",
-                "component/test_acl_listvm
-                  component/test_acl_listvolume",
-                "component/test_acl_sharednetwork
-                  component/test_acl_sharednetwork_deployVM-impersonation
-                  component/test_user_private_gateway
-                  component/test_user_shared_network",
-                "component/test_affinity_groups_projects
-                  component/test_allocation_states
-                  component/test_assign_vm",
-                "component/test_concurrent_snapshots_limit
-                  component/test_cpu_domain_limits
-                  component/test_cpu_limits
-                  component/test_cpu_max_limits
-                  component/test_cpu_project_limits
-                  component/test_deploy_vm_userdata_multi_nic
-                  component/test_deploy_vm_lease",
-                "component/test_egress_fw_rules
-                  component/test_invalid_gw_nm
-                  component/test_ip_reservation",
-                "component/test_lb_secondary_ip
-                  component/test_list_nics
-                  component/test_list_pod
-                  component/test_memory_limits",
-                "component/test_mm_domain_limits
-                  component/test_mm_max_limits
-                  component/test_mm_project_limits
-                  component/test_network_offering
-                  component/test_non_contiguous_vlan",
-                "component/test_persistent_networks
-                  component/test_project_configs
-                  component/test_project_limits
-                  component/test_project_resources",
-                "component/test_project_usage
-                  component/test_protocol_number_security_group
-                  component/test_public_ip
-                  component/test_resource_limits
-                  component/test_resource_limit_tags",
-                "component/test_regions_accounts
-                  component/test_routers
-                  component/test_snapshots
-                  component/test_stopped_vm
-                  component/test_tags
-                  component/test_templates
-                  component/test_updateResourceCount
-                  component/test_update_vm",
-                "component/test_volumes
-                  component/test_vpc
-                  component/test_vpc_distributed_routing_offering
-                  component/test_vpc_network
-                  component/test_vpc_offerings
-                  component/test_vpc_routers
-                  component/test_vpn_users
-                  component/test_vpc_network_lbrules",
-                "smoke/test_list_accounts
-                  smoke/test_list_disk_offerings
-                  smoke/test_list_domains
-                  smoke/test_list_hosts
-                  smoke/test_list_service_offerings
-                  smoke/test_list_storage_pools
-                  smoke/test_list_volumes"]
-
+        tests:
+        - smoke/test_accounts smoke/test_account_access 
smoke/test_affinity_groups
+          smoke/test_affinity_groups_projects smoke/test_annotations 
smoke/test_async_job
+          smoke/test_attach_multiple_volumes smoke/test_backup_recovery_dummy 
smoke/test_certauthority_root
+          smoke/test_console_endpoint 
smoke/test_create_list_domain_account_project

Review Comment:
   Under `strategy.matrix.tests`, the list items are not indented under the 
`tests:` key (the `- ...` entries align with `tests:`). This results in invalid 
YAML / an unexpected matrix; indent the `- ...` items beneath `tests:`.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to