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]