mirror of https://github.com/apache/cloudstack.git
Merge branch 'main' into domain-name-regex-characters-not-scaped
This commit is contained in:
commit
062ed31cd4
|
|
@ -50,10 +50,13 @@ github:
|
|||
rebase: false
|
||||
|
||||
collaborators:
|
||||
- gpordeus
|
||||
- ingox
|
||||
- gp-santos
|
||||
- erikbocks
|
||||
- Imvedansh
|
||||
- Damans227
|
||||
- jmsperu
|
||||
- GaOrtiga
|
||||
|
||||
protected_branches: ~
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
/plugins/storage/volume/linstor @rp-
|
||||
/plugins/storage/volume/storpool @slavkap
|
||||
/plugins/storage/volume/ontap @rajiv1 @sandeeplocharla @piyush5 @suryag
|
||||
|
||||
.pre-commit-config.yaml @jbampton
|
||||
/.github/linters/ @jbampton
|
||||
|
|
|
|||
|
|
@ -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
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
name: 'Install CloudStack Non-OSS'
|
||||
description: 'Clones and installs the shapeblue/cloudstack-nonoss repository.'
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Install cloudstack-nonoss
|
||||
shell: bash
|
||||
run: |
|
||||
git clone --depth 1 https://github.com/shapeblue/cloudstack-nonoss.git nonoss
|
||||
cd nonoss
|
||||
bash -x install-non-oss.sh
|
||||
cd ..
|
||||
rm -fr nonoss
|
||||
|
|
@ -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@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||
with:
|
||||
java-version: ${{ inputs.java-version }}
|
||||
distribution: 'adopt'
|
||||
architecture: x64
|
||||
cache: 'maven'
|
||||
|
||||
- name: Set up Python
|
||||
if: ${{ inputs.install-python == 'true' }}
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version: '3.10'
|
||||
architecture: x64
|
||||
|
||||
- name: Install Build Dependencies
|
||||
if: ${{ inputs.install-apt-deps == 'true' }}
|
||||
shell: bash
|
||||
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 libpython3-dev libssl-dev libffi-dev python3-openssl python3-dev python3-setuptools
|
||||
|
|
@ -16,40 +16,27 @@
|
|||
# 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
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
cache: 'maven'
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-env
|
||||
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
|
||||
|
||||
install-python: 'true'
|
||||
install-apt-deps: 'true'
|
||||
- name: Env details
|
||||
run: |
|
||||
uname -a
|
||||
|
|
@ -60,9 +47,8 @@ jobs:
|
|||
free -m
|
||||
nproc
|
||||
git status
|
||||
|
||||
- name: Install Non-OSS
|
||||
uses: ./.github/actions/install-nonoss
|
||||
- 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)
|
||||
|
|
|
|||
|
|
@ -16,21 +16,56 @@
|
|||
# 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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
- 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 engine/schema/dist utils/conf
|
||||
tar -czf /tmp/artifacts/m2-cloudstack.tar.gz -C ~/.m2/repository org/apache/cloudstack
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
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:
|
||||
|
|
@ -215,30 +250,16 @@ jobs:
|
|||
smoke/test_list_service_offerings
|
||||
smoke/test_list_storage_pools
|
||||
smoke/test_list_volumes"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
persist-credentials: false
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-env
|
||||
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
|
||||
|
||||
install-python: 'true'
|
||||
install-apt-deps: 'true'
|
||||
- name: Setup IPMI Tool for CloudStack
|
||||
run: |
|
||||
# Create cloudstack-common directory if it doesn't exist
|
||||
|
|
@ -256,55 +277,43 @@ jobs:
|
|||
/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 mysql -uroot -proot -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY ''; FLUSH PRIVILEGES;"
|
||||
sudo systemctl restart mysql
|
||||
sudo mysql -uroot -e "SELECT VERSION();"
|
||||
|
||||
- name: Build with Maven
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: build-artifacts
|
||||
path: /tmp/artifacts/
|
||||
- name: Extract artifacts
|
||||
run: |
|
||||
mvn -B -P developer,systemvm -Dsimulator clean install -DskipTests=true -T$(nproc)
|
||||
|
||||
tar -xzf /tmp/artifacts/targets.tar.gz
|
||||
mkdir -p ~/.m2/repository
|
||||
tar -xzf /tmp/artifacts/m2-cloudstack.tar.gz -C ~/.m2/repository
|
||||
- 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"
|
||||
|
|
@ -315,7 +324,6 @@ jobs:
|
|||
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
|
||||
|
|
@ -335,13 +343,12 @@ jobs:
|
|||
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
|
||||
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
with:
|
||||
files: jacoco-coverage.xml
|
||||
fail_ci_if_error: true
|
||||
|
|
|
|||
|
|
@ -1,59 +0,0 @@
|
|||
# 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: Coverage Check
|
||||
|
||||
on: [pull_request, push]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'apache/cloudstack'
|
||||
name: codecov
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
cache: 'maven'
|
||||
|
||||
- name: Build CloudStack with Quality Checks
|
||||
run: |
|
||||
git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss
|
||||
cd nonoss && bash -x install-non-oss.sh && cd ..
|
||||
mvn -P quality -Dsimulator -Dnoredist clean install -T$(nproc)
|
||||
|
||||
- uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./client/target/site/jacoco-aggregate/jacoco.xml
|
||||
fail_ci_if_error: true
|
||||
flags: unittests
|
||||
verbose: true
|
||||
name: codecov
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
|
@ -35,14 +35,16 @@ jobs:
|
|||
language: ["actions"]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
uses: github/codeql-action/autobuild@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
with:
|
||||
category: "Security"
|
||||
|
|
|
|||
|
|
@ -54,11 +54,11 @@ jobs:
|
|||
comment_repo: ""
|
||||
steps:
|
||||
- name: Setup
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.45.
|
||||
with:
|
||||
destination: /opt/gh-aw/
|
||||
- name: Check workflow file
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_WORKFLOW_FILE: "daily-repo-status.lock.yml"
|
||||
with:
|
||||
|
|
@ -96,13 +96,13 @@ jobs:
|
|||
secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
|
||||
steps:
|
||||
- name: Setup
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.45.
|
||||
with:
|
||||
destination: /opt/gh-aw/
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.
|
||||
with:
|
||||
persist-credentials:
|
||||
persist-credentials: false
|
||||
- name: Create gh-aw temp
|
||||
run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.
|
||||
- name: Configure Git
|
||||
|
|
@ -120,7 +120,7 @@ jobs:
|
|||
id: checkout-
|
||||
if: |
|
||||
github.event.
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
|
|
@ -132,7 +132,7 @@ jobs:
|
|||
await main();
|
||||
- name: Generate agentic run
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
|
|
@ -469,7 +469,7 @@ jobs:
|
|||
}
|
||||
|
||||
- name: Generate workflow
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
with:
|
||||
script: |
|
||||
const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs');
|
||||
|
|
@ -559,7 +559,7 @@ jobs:
|
|||
{{#runtime-import .github/workflows/daily-repo-status.md}}
|
||||
|
||||
- name: Substitute
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.
|
||||
GH_AW_GITHUB_ACTOR: ${{ github.actor }}
|
||||
|
|
@ -589,7 +589,7 @@ jobs:
|
|||
}
|
||||
});
|
||||
- name: Interpolate variables and render
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.
|
||||
with:
|
||||
|
|
@ -667,7 +667,7 @@ jobs:
|
|||
bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID"
|
||||
- name: Redact secrets in
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -682,7 +682,7 @@ jobs:
|
|||
SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload Safe
|
||||
if: always()
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v6.0.
|
||||
with:
|
||||
name: safe-
|
||||
path: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
|
|
@ -690,7 +690,7 @@ jobs:
|
|||
- name: Ingest agent
|
||||
id:
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com"
|
||||
|
|
@ -704,13 +704,13 @@ jobs:
|
|||
await main();
|
||||
- name: Upload sanitized agent
|
||||
if: always() && env.
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v6.0.
|
||||
with:
|
||||
name: agent-
|
||||
path: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
if-no-files-found:
|
||||
- name: Upload engine output
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v6.0.
|
||||
with:
|
||||
name:
|
||||
path: |
|
||||
|
|
@ -719,7 +719,7 @@ jobs:
|
|||
if-no-files-found:
|
||||
- name: Parse agent logs for step
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/
|
||||
with:
|
||||
|
|
@ -730,7 +730,7 @@ jobs:
|
|||
await main();
|
||||
- name: Parse MCP Gateway logs for step
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -755,7 +755,7 @@ jobs:
|
|||
- name: Upload agent
|
||||
if: always()
|
||||
continue-on-error:
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v6.0.
|
||||
with:
|
||||
name: agent-
|
||||
path: |
|
||||
|
|
@ -784,12 +784,12 @@ jobs:
|
|||
total_count: ${{ steps.missing_tool.outputs.total_count }}
|
||||
steps:
|
||||
- name: Setup
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.45.
|
||||
with:
|
||||
destination: /opt/gh-aw/
|
||||
- name: Download agent output
|
||||
continue-on-error:
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-
|
||||
path: /tmp/gh-aw/safeoutputs/
|
||||
|
|
@ -800,7 +800,7 @@ jobs:
|
|||
echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV"
|
||||
- name: Process No-Op
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_NOOP_MAX:
|
||||
|
|
@ -816,7 +816,7 @@ jobs:
|
|||
await main();
|
||||
- name: Record Missing
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Daily Repo Status"
|
||||
|
|
@ -831,7 +831,7 @@ jobs:
|
|||
await main();
|
||||
- name: Handle Agent
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Daily Repo Status"
|
||||
|
|
@ -851,7 +851,7 @@ jobs:
|
|||
await main();
|
||||
- name: Handle No-Op
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Daily Repo Status"
|
||||
|
|
@ -881,18 +881,18 @@ jobs:
|
|||
success: ${{ steps.parse_results.outputs.success }}
|
||||
steps:
|
||||
- name: Setup
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.45.
|
||||
with:
|
||||
destination: /opt/gh-aw/
|
||||
- name: Download agent
|
||||
continue-on-error:
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-
|
||||
path: /tmp/gh-aw/threat-detection/
|
||||
- name: Download agent output
|
||||
continue-on-error:
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-
|
||||
path: /tmp/gh-aw/threat-detection/
|
||||
|
|
@ -902,7 +902,7 @@ jobs:
|
|||
run: |
|
||||
echo "Agent output-types: $AGENT_OUTPUT_TYPES"
|
||||
- name: Setup threat
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
WORKFLOW_NAME: "Daily Repo Status"
|
||||
WORKFLOW_DESCRIPTION: "This workflow creates daily repo status reports. It gathers recent repository\nactivity (issues, PRs, discussions, releases, code changes) and generates\nengaging GitHub issues with productivity insights, community highlights,\nand project recommendations."
|
||||
|
|
@ -955,7 +955,7 @@ jobs:
|
|||
XDG_CONFIG_HOME: /home/
|
||||
- name: Parse threat detection
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -964,7 +964,7 @@ jobs:
|
|||
await main();
|
||||
- name: Upload threat detection
|
||||
if: always()
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v6.0.
|
||||
with:
|
||||
name: threat-detection.
|
||||
path: /tmp/gh-aw/threat-detection/detection.
|
||||
|
|
@ -993,12 +993,12 @@ jobs:
|
|||
process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }}
|
||||
steps:
|
||||
- name: Setup
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.45.
|
||||
with:
|
||||
destination: /opt/gh-aw/
|
||||
- name: Download agent output
|
||||
continue-on-error:
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-
|
||||
path: /tmp/gh-aw/safeoutputs/
|
||||
|
|
@ -1009,7 +1009,7 @@ jobs:
|
|||
echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV"
|
||||
- name: Process Safe
|
||||
id:
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 #
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_issue\":{\"labels\":[\"report\",\"daily-status\"],\"max\":1,\"title_prefix\":\"[repo-status] \"},\"missing_data\":{},\"missing_tool\":{}}"
|
||||
|
|
|
|||
|
|
@ -35,10 +35,10 @@ concurrency:
|
|||
jobs:
|
||||
build:
|
||||
if: github.repository == 'apache/cloudstack'
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
||||
with:
|
||||
registry: ${{ secrets.DOCKER_REGISTRY }}
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
|
|
@ -47,7 +47,9 @@ jobs:
|
|||
- name: Set Docker repository name
|
||||
run: echo "DOCKER_REPOSITORY=apache" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set ACS version
|
||||
run: echo "ACS_VERSION=$(grep '<version>' pom.xml | head -2 | tail -1 | cut -d'>' -f2 |cut -d'<' -f1)" >> $GITHUB_ENV
|
||||
|
|
|
|||
|
|
@ -53,11 +53,11 @@ jobs:
|
|||
comment_repo: ""
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.71.1
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Check workflow file timestamps
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_WORKFLOW_FILE: "issue-triage-agent.lock.yml"
|
||||
with:
|
||||
|
|
@ -91,7 +91,7 @@ jobs:
|
|||
secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.71.1
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Checkout repository
|
||||
|
|
@ -113,7 +113,7 @@ jobs:
|
|||
echo "Git configured with standard GitHub Actions identity"
|
||||
- name: Generate agentic run info
|
||||
id: generate_aw_info
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
|
|
@ -167,7 +167,7 @@ jobs:
|
|||
run: bash /opt/gh-aw/actions/install_awf_binary.sh v0.18.0
|
||||
- name: Determine automatic lockdown mode for GitHub MCP Server
|
||||
id: determine-automatic-lockdown
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }}
|
||||
GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }}
|
||||
|
|
@ -459,7 +459,7 @@ jobs:
|
|||
}
|
||||
GH_AW_MCP_CONFIG_EOF
|
||||
- name: Generate workflow overview
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const { generateWorkflowOverview } = require('/opt/gh-aw/actions/generate_workflow_overview.cjs');
|
||||
|
|
@ -552,7 +552,7 @@ jobs:
|
|||
{{#runtime-import .github/workflows/issue-triage-agent.md}}
|
||||
GH_AW_PROMPT_EOF
|
||||
- name: Substitute placeholders
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
GH_AW_GITHUB_ACTOR: ${{ github.actor }}
|
||||
|
|
@ -582,7 +582,7 @@ jobs:
|
|||
}
|
||||
});
|
||||
- name: Interpolate variables and render templates
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt
|
||||
GH_AW_GITHUB_REPOSITORY: ${{ github.repository }}
|
||||
|
|
@ -661,7 +661,7 @@ jobs:
|
|||
bash /opt/gh-aw/actions/stop_mcp_gateway.sh "$GATEWAY_PID"
|
||||
- name: Redact secrets in logs
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -676,7 +676,7 @@ jobs:
|
|||
SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Upload Safe Outputs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: safe-output
|
||||
path: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
|
|
@ -684,7 +684,7 @@ jobs:
|
|||
- name: Ingest agent output
|
||||
id: collect_output
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }}
|
||||
GH_AW_ALLOWED_DOMAINS: "api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,github.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com"
|
||||
|
|
@ -698,13 +698,13 @@ jobs:
|
|||
await main();
|
||||
- name: Upload sanitized agent output
|
||||
if: always() && env.GH_AW_AGENT_OUTPUT
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: agent-output
|
||||
path: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
if-no-files-found: warn
|
||||
- name: Upload engine output files
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: agent_outputs
|
||||
path: |
|
||||
|
|
@ -713,7 +713,7 @@ jobs:
|
|||
if-no-files-found: ignore
|
||||
- name: Parse agent logs for step summary
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/
|
||||
with:
|
||||
|
|
@ -724,7 +724,7 @@ jobs:
|
|||
await main();
|
||||
- name: Parse MCP Gateway logs for step summary
|
||||
if: always()
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -749,7 +749,7 @@ jobs:
|
|||
- name: Upload agent artifacts
|
||||
if: always()
|
||||
continue-on-error: true
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: agent-artifacts
|
||||
path: |
|
||||
|
|
@ -780,12 +780,12 @@ jobs:
|
|||
total_count: ${{ steps.missing_tool.outputs.total_count }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.71.1
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download agent output artifact
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-output
|
||||
path: /tmp/gh-aw/safeoutputs/
|
||||
|
|
@ -796,7 +796,7 @@ jobs:
|
|||
echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV"
|
||||
- name: Process No-Op Messages
|
||||
id: noop
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_NOOP_MAX: 1
|
||||
|
|
@ -812,7 +812,7 @@ jobs:
|
|||
await main();
|
||||
- name: Record Missing Tool
|
||||
id: missing_tool
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Issue Triage Agent"
|
||||
|
|
@ -827,7 +827,7 @@ jobs:
|
|||
await main();
|
||||
- name: Handle Agent Failure
|
||||
id: handle_agent_failure
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Issue Triage Agent"
|
||||
|
|
@ -846,7 +846,7 @@ jobs:
|
|||
await main();
|
||||
- name: Handle No-Op Message
|
||||
id: handle_noop_message
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_WORKFLOW_NAME: "Issue Triage Agent"
|
||||
|
|
@ -874,18 +874,18 @@ jobs:
|
|||
success: ${{ steps.parse_results.outputs.success }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.71.1
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download agent artifacts
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-artifacts
|
||||
path: /tmp/gh-aw/threat-detection/
|
||||
- name: Download agent output artifact
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-output
|
||||
path: /tmp/gh-aw/threat-detection/
|
||||
|
|
@ -895,7 +895,7 @@ jobs:
|
|||
run: |
|
||||
echo "Agent output-types: $AGENT_OUTPUT_TYPES"
|
||||
- name: Setup threat detection
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
WORKFLOW_NAME: "Issue Triage Agent"
|
||||
WORKFLOW_DESCRIPTION: "No description provided"
|
||||
|
|
@ -948,7 +948,7 @@ jobs:
|
|||
XDG_CONFIG_HOME: /home/runner
|
||||
- name: Parse threat detection results
|
||||
id: parse_results
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs');
|
||||
|
|
@ -957,7 +957,7 @@ jobs:
|
|||
await main();
|
||||
- name: Upload threat detection log
|
||||
if: always()
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: threat-detection.log
|
||||
path: /tmp/gh-aw/threat-detection/detection.log
|
||||
|
|
@ -987,12 +987,12 @@ jobs:
|
|||
process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }}
|
||||
steps:
|
||||
- name: Setup Scripts
|
||||
uses: github/gh-aw/actions/setup@58d1d157fbac0f1204798500faefc4f7461ebe28 # v0.45.0
|
||||
uses: github/gh-aw/actions/setup@f01a9d118afa6e306f3645ca31e43f4ea8fb4d22 # v0.71.1
|
||||
with:
|
||||
destination: /opt/gh-aw/actions
|
||||
- name: Download agent output artifact
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: agent-output
|
||||
path: /tmp/gh-aw/safeoutputs/
|
||||
|
|
@ -1003,7 +1003,7 @@ jobs:
|
|||
echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/safeoutputs/agent_output.json" >> "$GITHUB_ENV"
|
||||
- name: Process Safe Outputs
|
||||
id: process_safe_outputs
|
||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
env:
|
||||
GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }}
|
||||
GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":1},\"add_labels\":{\"allowed\":[\"bug\",\"feature\",\"enhancement\",\"documentation\",\"question\",\"help-wanted\",\"good-first-issue\"]},\"missing_data\":{},\"missing_tool\":{}}"
|
||||
|
|
|
|||
|
|
@ -15,54 +15,51 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
name: Main Branch Sonar Quality Check
|
||||
|
||||
name: Sonar Quality Check (Main)
|
||||
permissions:
|
||||
contents: read
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
pull-requests: write # for sonar to comment on pull-request
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'apache/cloudstack'
|
||||
name: Main Sonar JaCoCo Build
|
||||
runs-on: ubuntu-22.04
|
||||
name: Sonar JaCoCo Coverage
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK17
|
||||
uses: actions/setup-java@v5
|
||||
persist-credentials: false
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-env
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
cache: 'maven'
|
||||
|
||||
install-python: 'true'
|
||||
install-apt-deps: 'true'
|
||||
- name: Cache SonarCloud packages
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
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 Tests with Coverage
|
||||
- name: Install Non-OSS
|
||||
uses: ./.github/actions/install-nonoss
|
||||
- name: Run Build and Tests with Coverage
|
||||
run: mvn -B -T$(nproc) -P developer,systemvm,quality -Dsimulator -Dnoredist clean install
|
||||
- name: Upload to SonarQube
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
run: |
|
||||
git clone https://github.com/shapeblue/cloudstack-nonoss.git nonoss
|
||||
cd nonoss && bash -x install-non-oss.sh && cd ..
|
||||
mvn -T$(nproc) -P quality -Dsimulator -Dnoredist clean install org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=apache_cloudstack
|
||||
run: mvn -B -P quality org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=apache_cloudstack -Dsonar.branch.name=${{ github.ref_name }}
|
||||
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
with:
|
||||
files: ./client/target/site/jacoco-aggregate/jacoco.xml
|
||||
fail_ci_if_error: true
|
||||
flags: unittests
|
||||
verbose: true
|
||||
name: codecov
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
|
|
|||
|
|
@ -17,28 +17,26 @@
|
|||
|
||||
name: "PR Merge Conflict Check"
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
schedule:
|
||||
- cron: '*/10 * * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: # added using https://github.com/step-security/secure-workflows
|
||||
contents: read
|
||||
permissions: {}
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
group: "gh-aw-${{ github.workflow }}"
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
permissions:
|
||||
pull-requests: write # for eps1lon/actions-label-merge-conflict to label PRs
|
||||
runs-on: ubuntu-22.04
|
||||
pull-requests: write # for eps1lon/actions-label-merge-conflict to label PRs
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Conflict Check
|
||||
uses: eps1lon/actions-label-merge-conflict@v2.0.0
|
||||
with:
|
||||
repoToken: "${{ secrets.GITHUB_TOKEN }}"
|
||||
dirtyLabel: "status:has-conflicts"
|
||||
removeOnDirtyLabel: "status:ready-for-review"
|
||||
continueOnMissingPermissions: true
|
||||
commentOnDirty: "This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch."
|
||||
- name: Conflict Check
|
||||
uses: eps1lon/actions-label-merge-conflict@1df065ebe6e3310545d4f4c4e862e43bdca146f0 # v3.0.3
|
||||
with:
|
||||
repoToken: "${{ secrets.GITHUB_TOKEN }}"
|
||||
dirtyLabel: "status:has-conflicts"
|
||||
removeOnDirtyLabel: "status:ready-for-review"
|
||||
continueOnMissingPermissions: true
|
||||
commentOnDirty: "This pull request has merge conflicts. Dear author, please fix the conflicts and sync your branch with the base branch."
|
||||
|
|
|
|||
|
|
@ -29,17 +29,23 @@ concurrency:
|
|||
jobs:
|
||||
pre-commit:
|
||||
name: Run pre-commit
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: Check Out
|
||||
uses: actions/checkout@v6
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version: '3.11'
|
||||
cache: 'pip'
|
||||
- name: Install
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pre-commit
|
||||
run: pip install pre-commit
|
||||
- name: Set PY
|
||||
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
|
||||
- uses: actions/cache@v5
|
||||
- name: Cache pre-commit environments
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
with:
|
||||
path: ~/.cache/pre-commit
|
||||
key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
|
||||
|
|
|
|||
|
|
@ -16,32 +16,27 @@
|
|||
# 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
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
architecture: x64
|
||||
cache: maven
|
||||
persist-credentials: false
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-env
|
||||
- name: Install Non-OSS
|
||||
uses: ./.github/actions/install-nonoss
|
||||
- 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()
|
||||
|
|
|
|||
|
|
@ -16,58 +16,52 @@
|
|||
# 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:
|
||||
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
|
||||
name: Sonar JaCoCo Coverage
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
ref: "refs/pull/${{ github.event.number }}/merge"
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK17
|
||||
uses: actions/setup-java@v5
|
||||
persist-credentials: false
|
||||
- name: Setup Environment
|
||||
uses: ./.github/actions/setup-env
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
cache: 'maven'
|
||||
|
||||
install-python: 'true'
|
||||
install-apt-deps: 'true'
|
||||
- name: Cache SonarCloud packages
|
||||
uses: actions/cache@v5
|
||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
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: Install Non-OSS
|
||||
uses: ./.github/actions/install-nonoss
|
||||
- name: Run Build and Tests with Coverage
|
||||
id: coverage
|
||||
run: mvn -B -T$(nproc) -P developer,systemvm,quality -Dsimulator -Dnoredist clean install
|
||||
- name: Upload to SonarQube
|
||||
if: github.repository == 'apache/cloudstack' && github.event.pull_request.head.repo.full_name == github.repository
|
||||
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 ..
|
||||
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
|
||||
mvn -B -P quality 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
|
||||
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
with:
|
||||
files: ./client/target/site/jacoco-aggregate/jacoco.xml
|
||||
fail_ci_if_error: true
|
||||
flags: unittests
|
||||
verbose: true
|
||||
name: codecov
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ jobs:
|
|||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v10
|
||||
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
|
||||
with:
|
||||
stale-issue-message: 'This issue is stale because it has been open for 120 days with no activity. It may be removed by administrators of this project at any time. Remove the stale label or comment to request for removal of it to prevent this.'
|
||||
stale-pr-message: 'This PR is stale because it has been open for 120 days with no activity. It may be removed by administrators of this project at any time. Remove the stale label or comment to request for removal of it to prevent this.'
|
||||
|
|
@ -41,7 +41,7 @@ jobs:
|
|||
days-before-pr-close: 240
|
||||
exempt-issue-labels: 'gsoc,good-first-issue,long-term-plan'
|
||||
exempt-pr-labels: 'status:ready-for-merge,status:needs-testing,status:on-hold'
|
||||
- uses: actions/stale@v10
|
||||
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
|
||||
with:
|
||||
stale-issue-label: 'archive'
|
||||
days-before-stale: 240
|
||||
|
|
|
|||
|
|
@ -28,15 +28,19 @@ permissions:
|
|||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
cache-dependency-path: 'ui/package-lock.json'
|
||||
|
||||
- name: Env details
|
||||
run: |
|
||||
|
|
@ -55,7 +59,7 @@ jobs:
|
|||
npm run lint
|
||||
npm run test:unit
|
||||
|
||||
- uses: codecov/codecov-action@v4
|
||||
- uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
if: github.repository == 'apache/cloudstack'
|
||||
with:
|
||||
working-directory: ui
|
||||
|
|
|
|||
|
|
@ -457,3 +457,18 @@ iscsi.session.cleanup.enabled=false
|
|||
|
||||
# Instance conversion VIRT_V2V_TMPDIR env var
|
||||
#convert.instance.env.virtv2v.tmpdir=
|
||||
|
||||
# Time, in seconds, to wait before retrying to rebase during the incremental snapshot process.
|
||||
# incremental.snapshot.retry.rebase.wait=60
|
||||
|
||||
# Path to the VDDK library directory for VMware to KVM conversion via VDDK,
|
||||
# passed to virt-v2v as -io vddk-libdir=<path>
|
||||
#vddk.lib.dir=
|
||||
|
||||
# Ordered VDDK transport preference for VMware to KVM conversion via VDDK, passed as
|
||||
# -io vddk-transports=<value> to virt-v2v. Example: nbd:nbdssl
|
||||
#vddk.transports=
|
||||
|
||||
# Optional vCenter SHA1 thumbprint for VMware to KVM conversion via VDDK, passed as
|
||||
# -io vddk-thumbprint=<value>. If unset, CloudStack computes it on the KVM host via openssl.
|
||||
#vddk.thumbprint=
|
||||
|
|
|
|||
|
|
@ -808,6 +808,30 @@ public class AgentProperties{
|
|||
*/
|
||||
public static final Property<String> CONVERT_ENV_VIRTV2V_TMPDIR = new Property<>("convert.instance.env.virtv2v.tmpdir", null, String.class);
|
||||
|
||||
/**
|
||||
* Path to the VDDK library directory on the KVM conversion host, used when converting VMs from VMware to KVM via VDDK.
|
||||
* This directory is passed to virt-v2v as <code>-io vddk-libdir=<path></code>.
|
||||
* Data type: String.<br>
|
||||
* Default value: <code>null</code>
|
||||
*/
|
||||
public static final Property<String> VDDK_LIB_DIR = new Property<>("vddk.lib.dir", null, String.class);
|
||||
|
||||
/**
|
||||
* Ordered list of VDDK transports for virt-v2v, passed as <code>-io vddk-transports=<value></code>.
|
||||
* Example: <code>nbd:nbdssl</code>.
|
||||
* Data type: String.<br>
|
||||
* Default value: <code>null</code>
|
||||
*/
|
||||
public static final Property<String> VDDK_TRANSPORTS = new Property<>("vddk.transports", null, String.class);
|
||||
|
||||
/**
|
||||
* vCenter TLS certificate thumbprint used by virt-v2v VDDK mode, passed as <code>-io vddk-thumbprint=<value></code>.
|
||||
* If unset, the KVM host computes it at runtime from the vCenter endpoint.
|
||||
* Data type: String.<br>
|
||||
* Default value: <code>null</code>
|
||||
*/
|
||||
public static final Property<String> VDDK_THUMBPRINT = new Property<>("vddk.thumbprint", null, String.class);
|
||||
|
||||
/**
|
||||
* BGP controll CIDR
|
||||
* Data type: String.<br>
|
||||
|
|
@ -885,6 +909,11 @@ public class AgentProperties{
|
|||
*/
|
||||
public static final Property<Boolean> CREATE_FULL_CLONE = new Property<>("create.full.clone", false);
|
||||
|
||||
/**
|
||||
* Time, in seconds, to wait before retrying to rebase during the incremental snapshot process.
|
||||
* */
|
||||
public static final Property<Integer> INCREMENTAL_SNAPSHOT_RETRY_REBASE_WAIT = new Property<>("incremental.snapshot.retry.rebase.wait", 60);
|
||||
|
||||
|
||||
public static class Property <T>{
|
||||
private String name;
|
||||
|
|
|
|||
|
|
@ -26,10 +26,13 @@ public final class BucketTO {
|
|||
|
||||
private String secretKey;
|
||||
|
||||
private long accountId;
|
||||
|
||||
public BucketTO(Bucket bucket) {
|
||||
this.name = bucket.getName();
|
||||
this.accessKey = bucket.getAccessKey();
|
||||
this.secretKey = bucket.getSecretKey();
|
||||
this.accountId = bucket.getAccountId();
|
||||
}
|
||||
|
||||
public BucketTO(String name) {
|
||||
|
|
@ -47,4 +50,8 @@ public final class BucketTO {
|
|||
public String getSecretKey() {
|
||||
return this.secretKey;
|
||||
}
|
||||
|
||||
public long getAccountId() {
|
||||
return this.accountId;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,13 +36,17 @@ public class RemoteInstanceTO implements Serializable {
|
|||
private String vcenterPassword;
|
||||
private String vcenterHost;
|
||||
private String datacenterName;
|
||||
private String clusterName;
|
||||
private String hostName;
|
||||
|
||||
public RemoteInstanceTO() {
|
||||
}
|
||||
|
||||
public RemoteInstanceTO(String instanceName) {
|
||||
public RemoteInstanceTO(String instanceName, String clusterName, String hostName) {
|
||||
this.hypervisorType = Hypervisor.HypervisorType.VMware;
|
||||
this.instanceName = instanceName;
|
||||
this.clusterName = clusterName;
|
||||
this.hostName = hostName;
|
||||
}
|
||||
|
||||
public RemoteInstanceTO(String instanceName, String instancePath, String vcenterHost, String vcenterUsername, String vcenterPassword, String datacenterName) {
|
||||
|
|
@ -55,6 +59,12 @@ public class RemoteInstanceTO implements Serializable {
|
|||
this.datacenterName = datacenterName;
|
||||
}
|
||||
|
||||
public RemoteInstanceTO(String instanceName, String instancePath, String vcenterHost, String vcenterUsername, String vcenterPassword, String datacenterName, String clusterName, String hostName) {
|
||||
this(instanceName, instancePath, vcenterHost, vcenterUsername, vcenterPassword, datacenterName);
|
||||
this.clusterName = clusterName;
|
||||
this.hostName = hostName;
|
||||
}
|
||||
|
||||
public Hypervisor.HypervisorType getHypervisorType() {
|
||||
return this.hypervisorType;
|
||||
}
|
||||
|
|
@ -82,4 +92,12 @@ public class RemoteInstanceTO implements Serializable {
|
|||
public String getDatacenterName() {
|
||||
return datacenterName;
|
||||
}
|
||||
|
||||
public String getClusterName() {
|
||||
return clusterName;
|
||||
}
|
||||
|
||||
public String getHostName() {
|
||||
return hostName;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ public class VirtualMachineTO {
|
|||
|
||||
private long minRam;
|
||||
private long maxRam;
|
||||
private long requestedRam;
|
||||
private String hostName;
|
||||
private String arch;
|
||||
private String os;
|
||||
|
|
@ -207,15 +208,20 @@ public class VirtualMachineTO {
|
|||
return minRam;
|
||||
}
|
||||
|
||||
public void setRam(long minRam, long maxRam) {
|
||||
public void setRam(long minRam, long maxRam, long requestedRam) {
|
||||
this.minRam = minRam;
|
||||
this.maxRam = maxRam;
|
||||
this.requestedRam = requestedRam;
|
||||
}
|
||||
|
||||
public long getMaxRam() {
|
||||
return maxRam;
|
||||
}
|
||||
|
||||
public long getRequestedRam() {
|
||||
return requestedRam;
|
||||
}
|
||||
|
||||
public String getHostName() {
|
||||
return hostName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,19 +22,11 @@ import com.cloud.deploy.DeploymentPlan;
|
|||
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.utils.component.Adapter;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
|
||||
public interface HostAllocator extends Adapter {
|
||||
|
||||
/**
|
||||
* @param UserVm vm
|
||||
* @param ServiceOffering offering
|
||||
**/
|
||||
boolean isVirtualMachineUpgradable(final VirtualMachine vm, final ServiceOffering offering);
|
||||
|
||||
/**
|
||||
* Determines which physical hosts are suitable to
|
||||
* allocate the guest virtual machines on
|
||||
|
|
@ -49,31 +41,6 @@ public interface HostAllocator extends Adapter {
|
|||
|
||||
public List<Host> allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo);
|
||||
|
||||
/**
|
||||
* Determines which physical hosts are suitable to allocate the guest
|
||||
* virtual machines on
|
||||
*
|
||||
* Allocators must set any other hosts not considered for allocation in the
|
||||
* ExcludeList avoid. Thus the avoid set and the list of hosts suitable,
|
||||
* together must cover the entire host set in the cluster.
|
||||
*
|
||||
* @param VirtualMachineProfile
|
||||
* vmProfile
|
||||
* @param DeploymentPlan
|
||||
* plan
|
||||
* @param GuestType
|
||||
* type
|
||||
* @param ExcludeList
|
||||
* avoid
|
||||
* @param int returnUpTo (use -1 to return all possible hosts)
|
||||
* @param boolean considerReservedCapacity (default should be true, set to
|
||||
* false if host capacity calculation should not look at reserved
|
||||
* capacity)
|
||||
* @return List<Host> List of hosts that are suitable for VM allocation
|
||||
**/
|
||||
|
||||
public List<Host> allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo, boolean considerReservedCapacity);
|
||||
|
||||
/**
|
||||
* Determines which physical hosts are suitable to allocate the guest
|
||||
* virtual machines on
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ public interface DeploymentPlanner extends Adapter {
|
|||
boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid);
|
||||
|
||||
public enum AllocationAlgorithm {
|
||||
random, firstfit, userdispersing;
|
||||
random, firstfit, userdispersing, firstfitleastconsumed;
|
||||
}
|
||||
|
||||
public enum PlannerResourceUsage {
|
||||
|
|
|
|||
|
|
@ -26,17 +26,19 @@ public interface Investigator extends Adapter {
|
|||
* Returns if the vm is still alive.
|
||||
*
|
||||
* @param vm to work on.
|
||||
* @return true if vm is alive, otherwise false
|
||||
*/
|
||||
public boolean isVmAlive(VirtualMachine vm, Host host) throws UnknownVM;
|
||||
boolean isVmAlive(VirtualMachine vm, Host host) throws UnknownVM;
|
||||
|
||||
public Status isAgentAlive(Host agent);
|
||||
/**
|
||||
* Returns the agent status of the host.
|
||||
*
|
||||
* @param host
|
||||
* @return status of the host agent
|
||||
*/
|
||||
Status getHostAgentStatus(Host host);
|
||||
|
||||
class UnknownVM extends Exception {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,9 @@ public interface Host extends StateObject<Status>, Identity, Partition, HAResour
|
|||
String HOST_UEFI_ENABLE = "host.uefi.enable";
|
||||
String HOST_VOLUME_ENCRYPTION = "host.volume.encryption";
|
||||
String HOST_INSTANCE_CONVERSION = "host.instance.conversion";
|
||||
String HOST_VDDK_SUPPORT = "host.vddk.support";
|
||||
String HOST_VDDK_LIB_DIR = "vddk.lib.dir";
|
||||
String HOST_VDDK_VERSION = "host.vddk.version";
|
||||
String HOST_OVFTOOL_VERSION = "host.ovftool.version";
|
||||
String HOST_VIRTV2V_VERSION = "host.virtv2v.version";
|
||||
String HOST_SSH_PORT = "host.ssh.port";
|
||||
|
|
|
|||
|
|
@ -510,4 +510,6 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
|
|||
Integer getPrivateMtu();
|
||||
|
||||
Integer getNetworkCidrSize();
|
||||
|
||||
boolean getKeepMacAddressOnPublicNic();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -385,6 +385,11 @@ public class NetworkProfile implements Network {
|
|||
return networkCidrSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getKeepMacAddressOnPublicNic() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("NetworkProfile %s",
|
||||
|
|
|
|||
|
|
@ -107,4 +107,6 @@ public interface Vpc extends ControlledEntity, Identity, InternalIdentity {
|
|||
String getIp6Dns2();
|
||||
|
||||
boolean useRouterIpAsResolver();
|
||||
|
||||
boolean getKeepMacAddressOnPublicNic();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ public interface VpcService {
|
|||
*/
|
||||
Vpc createVpc(long zoneId, long vpcOffId, long vpcOwnerId, String vpcName, String displayText, String cidr, String networkDomain,
|
||||
String ip4Dns1, String ip4Dns2, String ip6Dns1, String ip6Dns2, Boolean displayVpc, Integer publicMtu, Integer cidrSize,
|
||||
Long asNumber, List<Long> bgpPeerIds, Boolean useVrIpResolver) throws ResourceAllocationException;
|
||||
Long asNumber, List<Long> bgpPeerIds, Boolean useVrIpResolver, boolean keepMacAddressOnPublicNic) throws ResourceAllocationException;
|
||||
|
||||
/**
|
||||
* Persists VPC record in the database
|
||||
|
|
@ -104,7 +104,7 @@ public interface VpcService {
|
|||
* @throws ResourceUnavailableException if during restart some resources may not be available
|
||||
* @throws InsufficientCapacityException if for instance no address space, compute or storage is sufficiently available
|
||||
*/
|
||||
Vpc updateVpc(long vpcId, String vpcName, String displayText, String customId, Boolean displayVpc, Integer mtu, String sourceNatIp) throws ResourceUnavailableException, InsufficientCapacityException;
|
||||
Vpc updateVpc(long vpcId, String vpcName, String displayText, String customId, Boolean displayVpc, Integer mtu, String sourceNatIp, Boolean keepMacAddressOnPublicNic) throws ResourceUnavailableException, InsufficientCapacityException;
|
||||
|
||||
/**
|
||||
* Lists VPC(s) based on the parameters passed to the API call
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ public interface ProjectService {
|
|||
|
||||
Project updateProject(long id, String name, String displayText, String newOwnerName, Long userId, Role newRole) throws ResourceAllocationException;
|
||||
|
||||
boolean addAccountToProject(long projectId, String accountName, String email, Long projectRoleId, Role projectRoleType);
|
||||
boolean addAccountToProject(long projectId, String accountName, String email, Long projectRoleId, Role projectRoleType) throws ResourceAllocationException;
|
||||
|
||||
boolean deleteAccountFromProject(long projectId, String accountName);
|
||||
|
||||
|
|
@ -100,6 +100,6 @@ public interface ProjectService {
|
|||
|
||||
Project findByProjectAccountIdIncludingRemoved(long projectAccountId);
|
||||
|
||||
boolean addUserToProject(Long projectId, String username, String email, Long projectRoleId, Role projectRole);
|
||||
boolean addUserToProject(Long projectId, String username, String email, Long projectRoleId, Role projectRole) throws ResourceAllocationException;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@ import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
|
|||
import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
|
||||
import org.apache.cloudstack.config.Configuration;
|
||||
import org.apache.cloudstack.config.ConfigurationGroup;
|
||||
import org.apache.cloudstack.framework.config.ConfigKey;
|
||||
|
||||
import com.cloud.alert.Alert;
|
||||
import com.cloud.capacity.Capacity;
|
||||
|
|
@ -108,14 +107,6 @@ import com.cloud.vm.VirtualMachineProfile;
|
|||
public interface ManagementService {
|
||||
static final String Name = "management-server";
|
||||
|
||||
ConfigKey<Boolean> JsInterpretationEnabled = new ConfigKey<>("Hidden"
|
||||
, Boolean.class
|
||||
, "js.interpretation.enabled"
|
||||
, "false"
|
||||
, "Enable/Disable all JavaScript interpretation related functionalities to create or update Javascript rules."
|
||||
, false
|
||||
, ConfigKey.Scope.Global);
|
||||
|
||||
/**
|
||||
* returns the a map of the names/values in the configuration table
|
||||
*
|
||||
|
|
@ -534,6 +525,4 @@ public interface ManagementService {
|
|||
|
||||
boolean removeManagementServer(RemoveManagementServerCmd cmd);
|
||||
|
||||
void checkJsInterpretationAllowedIfNeededForParameterValue(String paramName, boolean paramValue);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ import org.apache.cloudstack.api.InternalIdentity;
|
|||
|
||||
public interface VMTemplateStorageResourceAssoc extends InternalIdentity {
|
||||
public static enum Status {
|
||||
UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED, BYPASSED
|
||||
UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, LIMIT_REACHED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED, BYPASSED
|
||||
}
|
||||
|
||||
List<Status> ERROR_DOWNLOAD_STATES = List.of(Status.DOWNLOAD_ERROR, Status.ABANDONED, Status.LIMIT_REACHED, Status.UNKNOWN);
|
||||
List<Status> PENDING_DOWNLOAD_STATES = List.of(Status.NOT_DOWNLOADED, Status.DOWNLOAD_IN_PROGRESS);
|
||||
|
||||
String getInstallPath();
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ import com.cloud.exception.ResourceAllocationException;
|
|||
import com.cloud.offering.DiskOffering;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.template.VirtualMachineTemplate;
|
||||
import org.apache.cloudstack.resourcelimit.Reserver;
|
||||
|
||||
public interface ResourceLimitService {
|
||||
|
||||
|
|
@ -191,6 +192,7 @@ public interface ResourceLimitService {
|
|||
*/
|
||||
public void checkResourceLimit(Account account, ResourceCount.ResourceType type, long... count) throws ResourceAllocationException;
|
||||
public void checkResourceLimitWithTag(Account account, ResourceCount.ResourceType type, String tag, long... count) throws ResourceAllocationException;
|
||||
public void checkResourceLimitWithTag(Account account, Long domainId, boolean considerSystemAccount, ResourceCount.ResourceType type, String tag, long... count) throws ResourceAllocationException;
|
||||
|
||||
/**
|
||||
* Gets the count of resources for a resource type and account
|
||||
|
|
@ -251,12 +253,12 @@ public interface ResourceLimitService {
|
|||
List<String> getResourceLimitStorageTags(DiskOffering diskOffering);
|
||||
void updateTaggedResourceLimitsAndCountsForAccounts(List<AccountResponse> responses, String tag);
|
||||
void updateTaggedResourceLimitsAndCountsForDomains(List<DomainResponse> responses, String tag);
|
||||
void checkVolumeResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering) throws ResourceAllocationException;
|
||||
|
||||
void checkVolumeResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering);
|
||||
void checkVolumeResourceLimitForDiskOfferingChange(Account owner, Boolean display, Long currentSize, Long newSize,
|
||||
DiskOffering currentOffering, DiskOffering newOffering) throws ResourceAllocationException;
|
||||
DiskOffering currentOffering, DiskOffering newOffering, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
|
||||
void checkPrimaryStorageResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering) throws ResourceAllocationException;
|
||||
void checkPrimaryStorageResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
|
||||
void incrementVolumeResourceCount(long accountId, Boolean display, Long size, DiskOffering diskOffering);
|
||||
void decrementVolumeResourceCount(long accountId, Boolean display, Long size, DiskOffering diskOffering);
|
||||
|
|
@ -273,25 +275,23 @@ public interface ResourceLimitService {
|
|||
|
||||
void incrementVolumePrimaryStorageResourceCount(long accountId, Boolean display, Long size, DiskOffering diskOffering);
|
||||
void decrementVolumePrimaryStorageResourceCount(long accountId, Boolean display, Long size, DiskOffering diskOffering);
|
||||
void checkVmResourceLimit(Account owner, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template) throws ResourceAllocationException;
|
||||
void checkVmResourceLimit(Account owner, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
void incrementVmResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template);
|
||||
void decrementVmResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template);
|
||||
|
||||
void checkVmResourceLimitsForServiceOfferingChange(Account owner, Boolean display, Long currentCpu, Long newCpu,
|
||||
Long currentMemory, Long newMemory, ServiceOffering currentOffering, ServiceOffering newOffering, VirtualMachineTemplate template) throws ResourceAllocationException;
|
||||
Long currentMemory, Long newMemory, ServiceOffering currentOffering, ServiceOffering newOffering, VirtualMachineTemplate template, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
|
||||
void checkVmResourceLimitsForTemplateChange(Account owner, Boolean display, ServiceOffering offering,
|
||||
VirtualMachineTemplate currentTemplate, VirtualMachineTemplate newTemplate) throws ResourceAllocationException;
|
||||
VirtualMachineTemplate currentTemplate, VirtualMachineTemplate newTemplate, List<Reserver> reservations) throws ResourceAllocationException;
|
||||
|
||||
void checkVmCpuResourceLimit(Account owner, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long cpu) throws ResourceAllocationException;
|
||||
void incrementVmCpuResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long cpu);
|
||||
void decrementVmCpuResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long cpu);
|
||||
void checkVmMemoryResourceLimit(Account owner, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long memory) throws ResourceAllocationException;
|
||||
void incrementVmMemoryResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long memory);
|
||||
void decrementVmMemoryResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long memory);
|
||||
|
||||
void checkVmGpuResourceLimit(Account owner, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long gpu) throws ResourceAllocationException;
|
||||
void incrementVmGpuResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long gpu);
|
||||
void decrementVmGpuResourceCount(long accountId, Boolean display, ServiceOffering serviceOffering, VirtualMachineTemplate template, Long gpu);
|
||||
|
||||
long recalculateDomainResourceCount(final long domainId, final ResourceType type, String tag);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,8 +127,8 @@ public enum ApiCommandResourceType {
|
|||
}
|
||||
|
||||
public static ApiCommandResourceType fromString(String value) {
|
||||
if (StringUtils.isNotEmpty(value) && EnumUtils.isValidEnum(ApiCommandResourceType.class, value)) {
|
||||
return valueOf(value);
|
||||
if (StringUtils.isNotBlank(value) && EnumUtils.isValidEnumIgnoreCase(ApiCommandResourceType.class, value)) {
|
||||
return EnumUtils.getEnumIgnoreCase(ApiCommandResourceType.class, value);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ public class ApiConstants {
|
|||
public static final String BACKUP_VM_OFFERING_REMOVED = "vmbackupofferingremoved";
|
||||
public static final String IS_BACKUP_VM_EXPUNGED = "isbackupvmexpunged";
|
||||
public static final String BACKUP_TOTAL = "backuptotal";
|
||||
public static final String BALANCE = "balance";
|
||||
public static final String BALANCES = "balances";
|
||||
public static final String BASE64_IMAGE = "base64image";
|
||||
public static final String BGP_PEERS = "bgppeers";
|
||||
public static final String BGP_PEER_IDS = "bgppeerids";
|
||||
|
|
@ -157,6 +159,7 @@ public class ApiConstants {
|
|||
public static final String CUSTOM_ID = "customid";
|
||||
public static final String CUSTOM_ACTION_ID = "customactionid";
|
||||
public static final String CUSTOM_JOB_ID = "customjobid";
|
||||
public static final String CURRENCY = "currency";
|
||||
public static final String CURRENT_START_IP = "currentstartip";
|
||||
public static final String CURRENT_END_IP = "currentendip";
|
||||
public static final String ENCRYPT = "encrypt";
|
||||
|
|
@ -170,6 +173,7 @@ public class ApiConstants {
|
|||
public static final String DATACENTER_NAME = "datacentername";
|
||||
public static final String DATADISKS_DETAILS = "datadisksdetails";
|
||||
public static final String DATADISK_OFFERING_LIST = "datadiskofferinglist";
|
||||
public static final String DATE = "date";
|
||||
public static final String DEFAULT_VALUE = "defaultvalue";
|
||||
public static final String DELETE_PROTECTION = "deleteprotection";
|
||||
public static final String DESCRIPTION = "description";
|
||||
|
|
@ -509,6 +513,7 @@ public class ApiConstants {
|
|||
public static final String REPAIR = "repair";
|
||||
public static final String REPETITION_ALLOWED = "repetitionallowed";
|
||||
public static final String REQUIRES_HVM = "requireshvm";
|
||||
public static final String RESERVED_RESOURCE_DETAILS = "reservedresourcedetails";
|
||||
public static final String RESOURCES = "resources";
|
||||
public static final String RESOURCE_COUNT = "resourcecount";
|
||||
public static final String RESOURCE_NAME = "resourcename";
|
||||
|
|
@ -525,7 +530,6 @@ public class ApiConstants {
|
|||
public static final String SCHEDULE = "schedule";
|
||||
public static final String SCHEDULE_ID = "scheduleid";
|
||||
public static final String SCOPE = "scope";
|
||||
public static final String USER_SECRET_KEY = "usersecretkey";
|
||||
public static final String SEARCH_BASE = "searchbase";
|
||||
public static final String SECONDARY_IP = "secondaryip";
|
||||
public static final String SECURITY_GROUP_IDS = "securitygroupids";
|
||||
|
|
@ -541,6 +545,7 @@ public class ApiConstants {
|
|||
public static final String SESSIONKEY = "sessionkey";
|
||||
public static final String SHOW_CAPACITIES = "showcapacities";
|
||||
public static final String SHOW_REMOVED = "showremoved";
|
||||
public static final String SHOW_RESOURCES = "showresources";
|
||||
public static final String SHOW_RESOURCE_ICON = "showicon";
|
||||
public static final String SHOW_INACTIVE = "showinactive";
|
||||
public static final String SHOW_UNIQUE = "showunique";
|
||||
|
|
@ -606,9 +611,11 @@ public class ApiConstants {
|
|||
public static final String TENANT_NAME = "tenantname";
|
||||
public static final String TOTAL = "total";
|
||||
public static final String TOTAL_SUBNETS = "totalsubnets";
|
||||
public static final String TOTAL_QUOTA = "totalquota";
|
||||
public static final String TYPE = "type";
|
||||
public static final String TRUST_STORE = "truststore";
|
||||
public static final String TRUST_STORE_PASSWORD = "truststorepass";
|
||||
public static final String UNIT = "unit";
|
||||
public static final String URL = "url";
|
||||
public static final String USAGE_INTERFACE = "usageinterface";
|
||||
public static final String USED = "used";
|
||||
|
|
@ -629,6 +636,8 @@ public class ApiConstants {
|
|||
public static final String USERNAME = "username";
|
||||
public static final String USER_CONFIGURABLE = "userconfigurable";
|
||||
public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist";
|
||||
public static final String USER_SECRET_KEY = "usersecretkey";
|
||||
public static final String USE_VDDK = "usevddk";
|
||||
public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork";
|
||||
public static final String USE_VIRTUAL_ROUTER_IP_RESOLVER = "userouteripresolver";
|
||||
public static final String UPDATE_IN_SEQUENCE = "updateinsequence";
|
||||
|
|
@ -1298,6 +1307,8 @@ public class ApiConstants {
|
|||
public static final String OBJECT_LOCKING = "objectlocking";
|
||||
public static final String ENCRYPTION = "encryption";
|
||||
public static final String QUOTA = "quota";
|
||||
public static final String QUOTA_CONSUMED = "quotaconsumed";
|
||||
public static final String QUOTA_USAGE = "quotausage";
|
||||
public static final String ACCESS_KEY = "accesskey";
|
||||
|
||||
public static final String SOURCE_NAT_IP = "sourcenatipaddress";
|
||||
|
|
@ -1348,6 +1359,13 @@ public class ApiConstants {
|
|||
public static final String OBJECT_STORAGE_LIMIT = "objectstoragelimit";
|
||||
public static final String OBJECT_STORAGE_TOTAL = "objectstoragetotal";
|
||||
|
||||
public static final String KEEP_MAC_ADDRESS_ON_PUBLIC_NIC = "keepmacaddressonpublicnic";
|
||||
|
||||
public static final String PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC =
|
||||
"Indicates whether to use the same MAC address for the public NIC of VRs on the same network. If \"true\", when creating redundant routers or recreating" +
|
||||
" a VR, CloudStack will use the same MAC address for the public NIC of all VRs. Otherwise, if \"false\", new public NICs will always have " +
|
||||
" a new MAC address.";
|
||||
|
||||
public static final String PARAMETER_DESCRIPTION_ACTIVATION_RULE = "Quota tariff's activation rule. It can receive a JS script that results in either " +
|
||||
"a boolean or a numeric value: if it results in a boolean value, the tariff value will be applied according to the result; if it results in a numeric value, the " +
|
||||
"numeric value will be applied; if the result is neither a boolean nor a numeric value, the tariff will not be applied. If the rule is not informed, the tariff " +
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import java.util.HashMap;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
|
@ -504,12 +503,6 @@ public abstract class BaseCmd {
|
|||
}
|
||||
|
||||
public String getResourceUuid(String parameterName) {
|
||||
UUID resourceUuid = CallContext.current().getApiResourceUuid(parameterName);
|
||||
|
||||
if (resourceUuid != null) {
|
||||
return resourceUuid.toString();
|
||||
}
|
||||
|
||||
return null;
|
||||
return CallContext.current().getApiResourceUuid(parameterName);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,12 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd {
|
|||
description = "Name of the CA service provider, otherwise the default configured provider plugin will be used")
|
||||
private String provider;
|
||||
|
||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN,
|
||||
description = "When true, uses SSH to re-provision the agent's certificate, bypassing the NIO agent connection. " +
|
||||
"Use this when agents are disconnected due to a CA change. Supported for KVM hosts and SystemVMs. Default is false",
|
||||
since = "4.23.0")
|
||||
private Boolean forced;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -79,6 +85,10 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd {
|
|||
return provider;
|
||||
}
|
||||
|
||||
public boolean isForced() {
|
||||
return forced != null && forced;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -90,7 +100,7 @@ public class ProvisionCertificateCmd extends BaseAsyncCmd {
|
|||
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
|
||||
}
|
||||
|
||||
boolean result = caManager.provisionCertificate(host, getReconnect(), getProvider());
|
||||
boolean result = caManager.provisionCertificate(host, getReconnect(), getProvider(), isForced());
|
||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||
response.setSuccess(result);
|
||||
setResponseObject(response);
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ public final class ConfigureHAForHostCmd extends BaseAsyncCmd {
|
|||
final HostHAResponse response = new HostHAResponse();
|
||||
response.setId(resourceUuid);
|
||||
response.setProvider(getHaProvider().toLowerCase());
|
||||
response.setStatus(result);
|
||||
response.setResponseName(getCommandName());
|
||||
setResponseObject(response);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ public class FindHostsForMigrationCmd extends BaseListCmd {
|
|||
for (Host host : result.first()) {
|
||||
HostForMigrationResponse hostResponse = _responseGenerator.createHostForMigrationResponse(host);
|
||||
Boolean suitableForMigration = false;
|
||||
if (hostsWithCapacity.contains(host)) {
|
||||
if (hostsWithCapacity != null && hostsWithCapacity.contains(host)) {
|
||||
suitableForMigration = true;
|
||||
}
|
||||
hostResponse.setSuitableForMigration(suitableForMigration);
|
||||
|
|
|
|||
|
|
@ -252,7 +252,7 @@ public class ListHostsCmd extends BaseListCmd {
|
|||
for (Host host : result.first()) {
|
||||
HostResponse hostResponse = _responseGenerator.createHostResponse(host, getDetails());
|
||||
Boolean suitableForMigration = false;
|
||||
if (hostsWithCapacity.contains(host)) {
|
||||
if (hostsWithCapacity != null && hostsWithCapacity.contains(host)) {
|
||||
suitableForMigration = true;
|
||||
}
|
||||
hostResponse.setSuitableForMigration(suitableForMigration);
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import org.apache.cloudstack.api.ApiConstants;
|
|||
import org.apache.cloudstack.api.BaseCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.response.UserResponse;
|
||||
|
||||
import org.apache.cloudstack.api.ApiArgValidator;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.user.UserAccount;
|
||||
|
||||
|
|
@ -35,7 +35,7 @@ public class GetUserCmd extends BaseCmd {
|
|||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.USER_API_KEY, type = CommandType.STRING, required = true, description = "API key of the user")
|
||||
@Parameter(name = ApiConstants.USER_API_KEY, type = CommandType.STRING, required = true, description = "API key of the user", validations = {ApiArgValidator.NotNullOrEmpty})
|
||||
private String apiKey;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -179,6 +179,14 @@ public class ImportVmCmd extends ImportUnmanagedInstanceCmd {
|
|||
description = "(only for importing VMs from VMware to KVM) optional - the ID of the guest OS for the imported VM.")
|
||||
private Long guestOsId;
|
||||
|
||||
@Parameter(name = ApiConstants.USE_VDDK,
|
||||
type = CommandType.BOOLEAN,
|
||||
since = "4.22.1",
|
||||
description = "(only for importing VMs from VMware to KVM) optional - if true, uses VDDK on the KVM conversion host for converting the VM. " +
|
||||
"This parameter is mutually exclusive with " + ApiConstants.FORCE_MS_TO_IMPORT_VM_FILES + ".")
|
||||
private Boolean useVddk;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -255,6 +263,10 @@ public class ImportVmCmd extends ImportUnmanagedInstanceCmd {
|
|||
return storagePoolId;
|
||||
}
|
||||
|
||||
public boolean getUseVddk() {
|
||||
return BooleanUtils.toBooleanDefaultIfNull(useVddk, true);
|
||||
}
|
||||
|
||||
public String getTmpPath() {
|
||||
return tmpPath;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ package org.apache.cloudstack.api.command.user.account;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import org.apache.cloudstack.api.ApiArgValidator;
|
||||
import org.apache.cloudstack.api.ApiCommandResourceType;
|
||||
import org.apache.cloudstack.api.BaseCmd;
|
||||
|
|
@ -106,7 +107,7 @@ public class AddAccountToProjectCmd extends BaseAsyncCmd {
|
|||
/////////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
public void execute() throws ResourceAllocationException {
|
||||
if (accountName == null && email == null) {
|
||||
throw new InvalidParameterValueException("Either accountName or email is required");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
package org.apache.cloudstack.api.command.user.account;
|
||||
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiArgValidator;
|
||||
|
|
@ -111,7 +112,7 @@ public class AddUserToProjectCmd extends BaseAsyncCmd {
|
|||
/////////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
public void execute() throws ResourceAllocationException {
|
||||
validateInput();
|
||||
boolean result = _projectService.addUserToProject(getProjectId(), getUsername(), getEmail(), getProjectRoleId(), getRoleType());
|
||||
if (result) {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import javax.inject.Inject;
|
|||
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandResourceType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||
|
|
@ -102,6 +103,16 @@ public class AssignVirtualMachineToBackupOfferingCmd extends BaseAsyncCmd {
|
|||
return CallContext.current().getCallingAccount().getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getApiResourceId() {
|
||||
return vmId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiCommandResourceType getApiResourceType() {
|
||||
return ApiCommandResourceType.VirtualMachine;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventType() {
|
||||
return EventTypes.EVENT_VM_BACKUP_OFFERING_ASSIGN;
|
||||
|
|
|
|||
|
|
@ -123,7 +123,12 @@ public class CreateBackupCmd extends BaseAsyncCreateCmd {
|
|||
|
||||
@Override
|
||||
public ApiCommandResourceType getApiResourceType() {
|
||||
return ApiCommandResourceType.Backup;
|
||||
return ApiCommandResourceType.VirtualMachine;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getApiResourceId() {
|
||||
return vmId;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import javax.inject.Inject;
|
|||
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandResourceType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseCmd;
|
||||
|
|
@ -81,7 +82,7 @@ public class CreateBackupScheduleCmd extends BaseCmd {
|
|||
@Parameter(name = ApiConstants.QUIESCE_VM,
|
||||
type = CommandType.BOOLEAN,
|
||||
required = false,
|
||||
description = "Quiesce the instance before checkpointing the disks for backup. Applicable only to NAS backup provider. " +
|
||||
description = "Quiesce the Instance before checkpointing the disks for backup. Applicable only to NAS backup provider. " +
|
||||
"The filesystem is frozen before the backup starts and thawed immediately after. " +
|
||||
"Requires the instance to have the QEMU Guest Agent installed and running.",
|
||||
since = "4.21.0")
|
||||
|
|
@ -139,4 +140,14 @@ public class CreateBackupScheduleCmd extends BaseCmd {
|
|||
public long getEntityOwnerId() {
|
||||
return CallContext.current().getCallingAccount().getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getApiResourceId() {
|
||||
return vmId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiCommandResourceType getApiResourceType() {
|
||||
return ApiCommandResourceType.VirtualMachine;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import javax.inject.Inject;
|
|||
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandResourceType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||
|
|
@ -99,6 +100,16 @@ public class RemoveVirtualMachineFromBackupOfferingCmd extends BaseAsyncCmd {
|
|||
return CallContext.current().getCallingAccount().getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getApiResourceId() {
|
||||
return vmId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiCommandResourceType getApiResourceType() {
|
||||
return ApiCommandResourceType.VirtualMachine;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventType() {
|
||||
return EventTypes.EVENT_VM_BACKUP_OFFERING_REMOVE;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,9 @@ package org.apache.cloudstack.api.command.user.backup;
|
|||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.api.ACL;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandResourceType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||
|
|
@ -53,6 +55,7 @@ public class RestoreVolumeFromBackupAndAttachToVMCmd extends BaseAsyncCmd {
|
|||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@ACL
|
||||
@Parameter(name = ApiConstants.BACKUP_ID,
|
||||
type = CommandType.UUID,
|
||||
entityType = BackupResponse.class,
|
||||
|
|
@ -60,12 +63,14 @@ public class RestoreVolumeFromBackupAndAttachToVMCmd extends BaseAsyncCmd {
|
|||
description = "ID of the Instance backup")
|
||||
private Long backupId;
|
||||
|
||||
@ACL
|
||||
@Parameter(name = ApiConstants.VOLUME_ID,
|
||||
type = CommandType.STRING,
|
||||
required = true,
|
||||
description = "ID of the volume backed up")
|
||||
private String volumeUuid;
|
||||
|
||||
@ACL
|
||||
@Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID,
|
||||
type = CommandType.UUID,
|
||||
entityType = UserVmResponse.class,
|
||||
|
|
@ -123,4 +128,14 @@ public class RestoreVolumeFromBackupAndAttachToVMCmd extends BaseAsyncCmd {
|
|||
public String getEventDescription() {
|
||||
return "Restoring volume "+ volumeUuid + " from backup " + getResourceUuid(ApiConstants.BACKUP_ID) + " and attaching it to Instance " + getResourceUuid(ApiConstants.VIRTUAL_MACHINE_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getApiResourceId() {
|
||||
return vmId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiCommandResourceType getApiResourceType() {
|
||||
return ApiCommandResourceType.VirtualMachine;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package org.apache.cloudstack.api.command.user.bucket;
|
||||
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import org.apache.cloudstack.acl.RoleType;
|
||||
import org.apache.cloudstack.storage.object.Bucket;
|
||||
import com.cloud.user.Account;
|
||||
|
|
@ -82,7 +83,7 @@ public class DeleteBucketCmd extends BaseCmd {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void execute() throws ConcurrentOperationException {
|
||||
public void execute() throws ConcurrentOperationException, ResourceAllocationException {
|
||||
CallContext.current().setEventDetails("Bucket ID: " + getResourceUuid(ApiConstants.ID));
|
||||
boolean result = _bucketService.deleteBucket(id, CallContext.current().getCallingAccount());
|
||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.user.job;
|
|||
import java.util.Date;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiArgValidator;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseListAccountResourcesCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
|
|
@ -40,6 +41,12 @@ public class ListAsyncJobsCmd extends BaseListAccountResourcesCmd {
|
|||
@Parameter(name = ApiConstants.MANAGEMENT_SERVER_ID, type = CommandType.UUID, entityType = ManagementServerResponse.class, description = "The id of the management server", since="4.19")
|
||||
private Long managementServerId;
|
||||
|
||||
@Parameter(name = ApiConstants.RESOURCE_ID, validations = {ApiArgValidator.UuidString}, type = CommandType.STRING, description = "the ID of the resource associated with the job", since="4.22.1")
|
||||
private String resourceId;
|
||||
|
||||
@Parameter(name = ApiConstants.RESOURCE_TYPE, type = CommandType.STRING, description = "the type of the resource associated with the job", since="4.22.1")
|
||||
private String resourceType;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -52,6 +59,14 @@ public class ListAsyncJobsCmd extends BaseListAccountResourcesCmd {
|
|||
return managementServerId;
|
||||
}
|
||||
|
||||
public String getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
public String getResourceType() {
|
||||
return resourceType;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.user.job;
|
||||
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiArgValidator;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
|
|
@ -34,9 +34,15 @@ public class QueryAsyncJobResultCmd extends BaseCmd {
|
|||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.JOB_ID, type = CommandType.UUID, entityType = AsyncJobResponse.class, required = true, description = "The ID of the asynchronous job")
|
||||
@Parameter(name = ApiConstants.JOB_ID, type = CommandType.UUID, entityType = AsyncJobResponse.class, description = "The ID of the asynchronous job")
|
||||
private Long id;
|
||||
|
||||
@Parameter(name = ApiConstants.RESOURCE_ID, validations = {ApiArgValidator.UuidString}, type = CommandType.STRING, description = "the ID of the resource associated with the job", since="4.22.1")
|
||||
private String resourceId;
|
||||
|
||||
@Parameter(name = ApiConstants.RESOURCE_TYPE, type = CommandType.STRING, description = "the type of the resource associated with the job", since="4.22.1")
|
||||
private String resourceType;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -45,6 +51,14 @@ public class QueryAsyncJobResultCmd extends BaseCmd {
|
|||
return id;
|
||||
}
|
||||
|
||||
public String getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
public String getResourceType() {
|
||||
return resourceType;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -199,6 +199,11 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd {
|
|||
@Parameter(name=ApiConstants.AS_NUMBER, type=CommandType.LONG, since = "4.20.0", description="the AS Number of the network")
|
||||
private Long asNumber;
|
||||
|
||||
@Parameter(name = ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
type = CommandType.BOOLEAN, since = "4.23.0", authorized = {RoleType.Admin})
|
||||
private Boolean keepMacAddressOnPublicNic;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -286,6 +291,10 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd {
|
|||
return sourceNatIP;
|
||||
}
|
||||
|
||||
public Boolean getKeepMacAddressOnPublicNic() {
|
||||
return keepMacAddressOnPublicNic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplay() {
|
||||
if(displayNetwork == null)
|
||||
|
|
|
|||
|
|
@ -105,6 +105,11 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd implements UserCmd {
|
|||
@Parameter(name = ApiConstants.SOURCE_NAT_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to the public interface of the network router. This address must already be acquired for this network", since = "4.19")
|
||||
private String sourceNatIP;
|
||||
|
||||
@Parameter(name = ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
type = CommandType.BOOLEAN, since = "4.23.0", authorized = {RoleType.Admin})
|
||||
private Boolean keepMacAddressOnPublicNic;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -186,6 +191,10 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd implements UserCmd {
|
|||
return sourceNatIP;
|
||||
}
|
||||
|
||||
public Boolean getKeepMacAddressOnPublicNic() {
|
||||
return keepMacAddressOnPublicNic;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ public class CreateVMFromBackupCmd extends BaseDeployVMCmd {
|
|||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@ACL
|
||||
@Parameter(name = ApiConstants.BACKUP_ID,
|
||||
type = CommandType.UUID,
|
||||
entityType = BackupResponse.class,
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import org.apache.cloudstack.api.response.DiskOfferingResponse;
|
|||
import org.apache.cloudstack.api.response.DomainResponse;
|
||||
import org.apache.cloudstack.api.response.ProjectResponse;
|
||||
import org.apache.cloudstack.api.response.SnapshotResponse;
|
||||
import org.apache.cloudstack.api.response.StoragePoolResponse;
|
||||
import org.apache.cloudstack.api.response.UserVmResponse;
|
||||
import org.apache.cloudstack.api.response.VolumeResponse;
|
||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||
|
|
@ -109,6 +110,13 @@ public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd implements UserC
|
|||
description = "The ID of the Instance; to be used with snapshot Id, Instance to which the volume gets attached after creation")
|
||||
private Long virtualMachineId;
|
||||
|
||||
@Parameter(name = ApiConstants.STORAGE_ID,
|
||||
type = CommandType.UUID,
|
||||
entityType = StoragePoolResponse.class,
|
||||
description = "Storage pool ID to create the volume in. Cannot be used with the snapshotid parameter.",
|
||||
authorized = {RoleType.Admin})
|
||||
private Long storageId;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -153,6 +161,13 @@ public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd implements UserC
|
|||
return projectId;
|
||||
}
|
||||
|
||||
public Long getStorageId() {
|
||||
if (snapshotId != null && storageId != null) {
|
||||
throw new IllegalArgumentException("StorageId parameter cannot be specified with the SnapshotId parameter.");
|
||||
}
|
||||
return storageId;
|
||||
}
|
||||
|
||||
public Boolean getDisplayVolume() {
|
||||
return displayVolume;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,6 +130,11 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd implements UserCmd {
|
|||
description="(optional) for NSX based VPCs: when set to true, use the VR IP as nameserver, otherwise use DNS1 and DNS2")
|
||||
private Boolean useVrIpResolver;
|
||||
|
||||
@Parameter(name = ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
type = CommandType.BOOLEAN, since = "4.23.0", authorized = {RoleType.Admin})
|
||||
private boolean keepMacAddressOnPublicNic = true;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
|
@ -214,6 +219,10 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd implements UserCmd {
|
|||
return BooleanUtils.toBoolean(useVrIpResolver);
|
||||
}
|
||||
|
||||
public boolean getKeepMacAddressOnPublicNic() {
|
||||
return keepMacAddressOnPublicNic;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -69,6 +69,11 @@ public class UpdateVPCCmd extends BaseAsyncCustomIdCmd implements UserCmd {
|
|||
since = "4.19")
|
||||
private String sourceNatIP;
|
||||
|
||||
@Parameter(name = ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC,
|
||||
type = CommandType.BOOLEAN, since = "4.23.0", authorized = {RoleType.Admin})
|
||||
private Boolean keepMacAddressOnPublicNic;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -97,6 +102,10 @@ public class UpdateVPCCmd extends BaseAsyncCustomIdCmd implements UserCmd {
|
|||
return sourceNatIP;
|
||||
}
|
||||
|
||||
public Boolean getKeepMacAddressOnPublicNic() {
|
||||
return keepMacAddressOnPublicNic;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -85,6 +85,12 @@ public class ExtensionResponse extends BaseResponse {
|
|||
@Param(description = "Removal timestamp of the extension, if applicable")
|
||||
private Date removed;
|
||||
|
||||
@SerializedName(ApiConstants.RESERVED_RESOURCE_DETAILS)
|
||||
@Param(description = "Resource detail names as comma separated string that should be reserved and not visible " +
|
||||
"to end users",
|
||||
since = "4.22.1")
|
||||
protected String reservedResourceDetails;
|
||||
|
||||
public ExtensionResponse(String id, String name, String description, String type) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
|
|
@ -179,4 +185,8 @@ public class ExtensionResponse extends BaseResponse {
|
|||
public void setRemoved(Date removed) {
|
||||
this.removed = removed;
|
||||
}
|
||||
|
||||
public void setReservedResourceDetails(String reservedResourceDetails) {
|
||||
this.reservedResourceDetails = reservedResourceDetails;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -331,6 +331,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement
|
|||
@Param(description = "The BGP peers for the network", since = "4.20.0")
|
||||
private Set<BgpPeerResponse> bgpPeers;
|
||||
|
||||
@SerializedName(ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC)
|
||||
@Param(description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC, since = "4.23.0")
|
||||
private Boolean keepMacAddressOnPublicNic;
|
||||
|
||||
public NetworkResponse() {}
|
||||
|
||||
public Boolean getDisplayNetwork() {
|
||||
|
|
@ -702,4 +706,8 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement
|
|||
public void setIpv6Dns2(String ipv6Dns2) {
|
||||
this.ipv6Dns2 = ipv6Dns2;
|
||||
}
|
||||
|
||||
public void setKeepMacAddressOnPublicNic(Boolean keepMacAddressOnPublicNic) {
|
||||
this.keepMacAddressOnPublicNic = keepMacAddressOnPublicNic;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -185,6 +185,10 @@ public class VpcResponse extends BaseResponseWithAnnotations implements Controll
|
|||
@Param(description = "The BGP peers for the VPC", since = "4.20.0")
|
||||
private Set<BgpPeerResponse> bgpPeers;
|
||||
|
||||
@SerializedName(ApiConstants.KEEP_MAC_ADDRESS_ON_PUBLIC_NIC)
|
||||
@Param(description = ApiConstants.PARAMETER_DESCRIPTION_KEEP_MAC_ADDRESS_ON_PUBLIC_NIC, since = "4.23.0")
|
||||
private Boolean keepMacAddressOnPublicNic;
|
||||
|
||||
public void setId(final String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
|
@ -366,4 +370,8 @@ public class VpcResponse extends BaseResponseWithAnnotations implements Controll
|
|||
}
|
||||
this.bgpPeers.add(bgpPeer);
|
||||
}
|
||||
|
||||
public void setKeepMacAddressOnPublicNic(Boolean keepMacAddressOnPublicNic) {
|
||||
this.keepMacAddressOnPublicNic = keepMacAddressOnPublicNic;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
|
|||
* @param forced Indicates if backup will be force removed or not
|
||||
* @return returns operation success
|
||||
*/
|
||||
boolean deleteBackup(final Long backupId, final Boolean forced);
|
||||
boolean deleteBackup(final Long backupId, final Boolean forced) throws ResourceAllocationException;
|
||||
|
||||
void validateBackupForZone(Long zoneId);
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ import java.security.cert.X509Certificate;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.trilead.ssh2.Connection;
|
||||
|
||||
import org.apache.cloudstack.framework.ca.CAProvider;
|
||||
import org.apache.cloudstack.framework.ca.CAService;
|
||||
import org.apache.cloudstack.framework.ca.Certificate;
|
||||
|
|
@ -39,7 +41,10 @@ public interface CAManager extends CAService, Configurable, PluggableService {
|
|||
ConfigKey<String> CAProviderPlugin = new ConfigKey<>("Advanced", String.class,
|
||||
"ca.framework.provider.plugin",
|
||||
"root",
|
||||
"The CA provider plugin that is used for secure CloudStack management server-agent communication for encryption and authentication. Restart management server(s) when changed.", true);
|
||||
"The CA provider plugin used for CloudStack internal certificate management (MS-agent encryption and authentication). " +
|
||||
"The default 'root' provider auto-generates a CA on first startup, but also supports user-provided custom CA material " +
|
||||
"via the ca.plugin.root.private.key, ca.plugin.root.public.key, and ca.plugin.root.ca.certificate settings. " +
|
||||
"Restart management server(s) when changed.", false);
|
||||
|
||||
ConfigKey<Integer> CertKeySize = new ConfigKey<>("Advanced", Integer.class,
|
||||
"ca.framework.cert.keysize",
|
||||
|
|
@ -85,6 +90,12 @@ public interface CAManager extends CAService, Configurable, PluggableService {
|
|||
"The actual implementation will depend on the configured CA provider.",
|
||||
false);
|
||||
|
||||
ConfigKey<Boolean> CaInjectDefaultTruststore = new ConfigKey<>("Advanced", Boolean.class,
|
||||
"ca.framework.inject.default.truststore", "true",
|
||||
"When true, injects the CA provider's certificate into the JVM default truststore on management server startup. " +
|
||||
"This allows outgoing HTTPS connections from the management server to trust servers with certificates signed by the configured CA. " +
|
||||
"Restart management server(s) when changed.", false);
|
||||
|
||||
/**
|
||||
* Returns a list of available CA provider plugins
|
||||
* @return returns list of CAProvider
|
||||
|
|
@ -130,12 +141,26 @@ public interface CAManager extends CAService, Configurable, PluggableService {
|
|||
boolean revokeCertificate(final BigInteger certSerial, final String certCn, final String provider);
|
||||
|
||||
/**
|
||||
* Provisions certificate for given active and connected agent host
|
||||
* Provisions certificate for given agent host.
|
||||
* When forced=true, uses SSH to re-provision bypassing the NIO agent connection (for disconnected agents).
|
||||
* @param host
|
||||
* @param reconnect
|
||||
* @param provider
|
||||
* @param forced when true, provisions via SSH instead of NIO; supports KVM hosts and SystemVMs
|
||||
* @return returns success/failure as boolean
|
||||
*/
|
||||
boolean provisionCertificate(final Host host, final Boolean reconnect, final String provider);
|
||||
boolean provisionCertificate(final Host host, final Boolean reconnect, final String provider, final boolean forced);
|
||||
|
||||
/**
|
||||
* Provisions certificate for a KVM host using an existing SSH connection.
|
||||
* Runs keystore-setup to generate a CSR, issues a certificate, then runs keystore-cert-import.
|
||||
* Used during host discovery and for forced re-provisioning when the NIO agent is unreachable.
|
||||
* @param sshConnection active SSH connection to the KVM host
|
||||
* @param agentIp IP address of the KVM host agent
|
||||
* @param agentHostname hostname of the KVM host agent
|
||||
* @param caProvider optional CA provider plugin name (null uses default)
|
||||
*/
|
||||
void provisionCertificateViaSsh(Connection sshConnection, String agentIp, String agentHostname, String caProvider);
|
||||
|
||||
/**
|
||||
* Setups up a new keystore and generates CSR for a host
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public class CallContext {
|
|||
private User user;
|
||||
private long userId;
|
||||
private final Map<Object, Object> context = new HashMap<Object, Object>();
|
||||
private final Map<String, UUID> apiResourcesUuids = new HashMap<>();
|
||||
private final Map<String, String> apiResourcesUuids = new HashMap<>();
|
||||
private Project project;
|
||||
private String apiName;
|
||||
|
||||
|
|
@ -389,11 +389,11 @@ public class CallContext {
|
|||
isEventDisplayEnabled = eventDisplayEnabled;
|
||||
}
|
||||
|
||||
public UUID getApiResourceUuid(String paramName) {
|
||||
public String getApiResourceUuid(String paramName) {
|
||||
return apiResourcesUuids.get(paramName);
|
||||
}
|
||||
|
||||
public void putApiResourceUuid(String paramName, UUID uuid) {
|
||||
public void putApiResourceUuid(String paramName, String uuid) {
|
||||
apiResourcesUuids.put(paramName, uuid);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,8 +17,11 @@
|
|||
|
||||
package org.apache.cloudstack.extension;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ExtensionHelper {
|
||||
Long getExtensionIdForCluster(long clusterId);
|
||||
Extension getExtension(long id);
|
||||
Extension getExtensionForCluster(long clusterId);
|
||||
List<String> getExtensionReservedResourceDetails(long extensionId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
// 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.
|
||||
|
||||
package org.apache.cloudstack.resourcelimit;
|
||||
|
||||
/**
|
||||
* Interface implemented by <code>CheckedReservation</code>.
|
||||
* </br></br>
|
||||
* This is defined in <code>cloud-api</code> to allow methods declared in modules that do not depend on <code>cloud-server</code>
|
||||
* to receive <code>CheckedReservations</code> as parameters.
|
||||
*/
|
||||
public interface Reserver extends AutoCloseable {
|
||||
|
||||
void close();
|
||||
|
||||
}
|
||||
|
|
@ -95,7 +95,7 @@ public interface BucketApiService {
|
|||
*/
|
||||
Bucket createBucket(CreateBucketCmd cmd);
|
||||
|
||||
boolean deleteBucket(long bucketId, Account caller);
|
||||
boolean deleteBucket(long bucketId, Account caller) throws ResourceAllocationException;
|
||||
|
||||
boolean updateBucket(UpdateBucketCmd cmd, Account caller) throws ResourceAllocationException;
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ public interface VolumeImportUnmanageService extends PluggableService, Configura
|
|||
Arrays.asList(Hypervisor.HypervisorType.KVM, Hypervisor.HypervisorType.VMware);
|
||||
|
||||
List<Storage.StoragePoolType> SUPPORTED_STORAGE_POOL_TYPES_FOR_KVM = Arrays.asList(Storage.StoragePoolType.NetworkFilesystem,
|
||||
Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.RBD);
|
||||
Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.RBD, Storage.StoragePoolType.SharedMountPoint);
|
||||
|
||||
ConfigKey<Boolean> AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class,
|
||||
"allow.import.volume.with.backing.file",
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class CreateIpv4SubnetForGuestNetworkCmdTest {
|
|||
@Test
|
||||
public void testCreateIpv4SubnetForGuestNetworkCmd() {
|
||||
Long parentId = 1L;
|
||||
UUID parentUuid = UUID.randomUUID();
|
||||
String parentUuid = UUID.randomUUID().toString();
|
||||
String subnet = "192.168.1.0/24";
|
||||
Integer cidrSize = 26;
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class CreateIpv4SubnetForZoneCmdTest {
|
|||
@Test
|
||||
public void testCreateIpv4SubnetForZoneCmd() {
|
||||
Long zoneId = 1L;
|
||||
UUID zoneUuid = UUID.randomUUID();
|
||||
String zoneUuid = UUID.randomUUID().toString();
|
||||
String subnet = "192.168.1.0/24";
|
||||
String accountName = "user";
|
||||
Long projectId = 10L;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class DedicateIpv4SubnetForZoneCmdTest {
|
|||
@Test
|
||||
public void testDedicateIpv4SubnetForZoneCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
String accountName = "user";
|
||||
Long projectId = 10L;
|
||||
Long domainId = 11L;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class DeleteIpv4SubnetForGuestNetworkCmdTest {
|
|||
@Test
|
||||
public void testDeleteIpv4SubnetForGuestNetworkCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
DeleteIpv4SubnetForGuestNetworkCmd cmd = new DeleteIpv4SubnetForGuestNetworkCmd();
|
||||
ReflectionTestUtils.setField(cmd, "id", id);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class DeleteIpv4SubnetForZoneCmdTest {
|
|||
@Test
|
||||
public void testDeleteIpv4SubnetForZoneCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
DeleteIpv4SubnetForZoneCmd cmd = new DeleteIpv4SubnetForZoneCmd();
|
||||
ReflectionTestUtils.setField(cmd, "id", id);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class ReleaseDedicatedIpv4SubnetForZoneCmdTest {
|
|||
@Test
|
||||
public void testReleaseDedicatedIpv4SubnetForZoneCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
ReleaseDedicatedIpv4SubnetForZoneCmd cmd = new ReleaseDedicatedIpv4SubnetForZoneCmd();
|
||||
ReflectionTestUtils.setField(cmd, "id", id);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class UpdateIpv4SubnetForZoneCmdTest {
|
|||
@Test
|
||||
public void testUpdateIpv4SubnetForZoneCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
String subnet = "192.168.1.0/24";
|
||||
|
||||
UpdateIpv4SubnetForZoneCmd cmd = new UpdateIpv4SubnetForZoneCmd();
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public class ChangeBgpPeersForNetworkCmdTest {
|
|||
@Test
|
||||
public void testChangeBgpPeersForNetworkCmd() {
|
||||
Long networkId = 10L;
|
||||
UUID networkUuid = UUID.randomUUID();
|
||||
String networkUuid = UUID.randomUUID().toString();
|
||||
List<Long> bgpPeerIds = Arrays.asList(20L, 21L);
|
||||
|
||||
ChangeBgpPeersForNetworkCmd cmd = new ChangeBgpPeersForNetworkCmd();
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public class ChangeBgpPeersForVpcCmdTest {
|
|||
@Test
|
||||
public void testChangeBgpPeersForVpcCmd() {
|
||||
Long VpcId = 10L;
|
||||
UUID vpcUuid = UUID.randomUUID();
|
||||
String vpcUuid = UUID.randomUUID().toString();
|
||||
List<Long> bgpPeerIds = Arrays.asList(20L, 21L);
|
||||
|
||||
ChangeBgpPeersForVpcCmd cmd = new ChangeBgpPeersForVpcCmd();
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class CreateBgpPeerCmdTest {
|
|||
@Test
|
||||
public void testCreateBgpPeerCmd() {
|
||||
Long zoneId = 1L;
|
||||
UUID zoneUuid = UUID.randomUUID();
|
||||
String zoneUuid = UUID.randomUUID().toString();
|
||||
String accountName = "user";
|
||||
Long projectId = 10L;
|
||||
Long domainId = 11L;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class DedicateBgpPeerCmdTest {
|
|||
@Test
|
||||
public void testDedicateBgpPeerCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
String accountName = "user";
|
||||
Long projectId = 10L;
|
||||
Long domainId = 11L;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class DeleteBgpPeerCmdTest {
|
|||
@Test
|
||||
public void testDeleteBgpPeerCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
DeleteBgpPeerCmd cmd = new DeleteBgpPeerCmd();
|
||||
ReflectionTestUtils.setField(cmd, "id", id);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public class ReleaseDedicatedBgpPeerCmdTest {
|
|||
@Test
|
||||
public void testReleaseDedicatedBgpPeerCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
ReleaseDedicatedBgpPeerCmd cmd = new ReleaseDedicatedBgpPeerCmd();
|
||||
ReflectionTestUtils.setField(cmd, "id", id);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class UpdateBgpPeerCmdTest {
|
|||
@Test
|
||||
public void testUpdateBgpPeerCmd() {
|
||||
Long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
String ip4Address = "ip4-address";
|
||||
String ip6Address = "ip6-address";
|
||||
Long peerAsNumber = 15000L;
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ public class DownloadImageStoreObjectCmdTest {
|
|||
|
||||
@Test
|
||||
public void testGetEventDescription() {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
ReflectionTestUtils.setField(cmd, "storeId", 1L);
|
||||
ReflectionTestUtils.setField(cmd, "path", "path/to/object");
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ public class UnmanageVolumeCmdTest {
|
|||
public void testUnmanageVolumeCmd() {
|
||||
long accountId = 2L;
|
||||
Long volumeId = 3L;
|
||||
UUID volumeUuid = UUID.randomUUID();
|
||||
String volumeUuid = UUID.randomUUID().toString();
|
||||
Volume volume = Mockito.mock(Volume.class);
|
||||
|
||||
Mockito.when(responseGenerator.findVolumeById(volumeId)).thenReturn(volume);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.test;
|
||||
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
|
|
@ -149,6 +150,8 @@ public class AddAccountToProjectCmdTest extends TestCase {
|
|||
addAccountToProjectCmd.execute();
|
||||
} catch (InvalidParameterValueException exception) {
|
||||
Assert.assertEquals("Either accountName or email is required", exception.getLocalizedMessage());
|
||||
} catch (ResourceAllocationException exception) {
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ public class CreateSnapshotCmdTest extends TestCase {
|
|||
AccountService accountService = Mockito.mock(AccountService.class);
|
||||
Account account = Mockito.mock(Account.class);
|
||||
Mockito.when(accountService.getAccount(anyLong())).thenReturn(account);
|
||||
UUID volumeUuid = UUID.randomUUID();
|
||||
String volumeUuid = UUID.randomUUID().toString();
|
||||
|
||||
CallContext.current().putApiResourceUuid("volumeid", volumeUuid);
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public class UpdateConditionCmdTest {
|
|||
private static final Long threshold = 100L;
|
||||
|
||||
private static final long accountId = 5L;
|
||||
private static final UUID conditionUuid = UUID.randomUUID();
|
||||
private static final String conditionUuid = UUID.randomUUID().toString();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ public class DeleteRoutingFirewallRuleCmdTest {
|
|||
ReflectionTestUtils.setField(cmd, "_firewallService", _firewallService);
|
||||
|
||||
long id = 1L;
|
||||
UUID uuid = UUID.randomUUID();
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
long accountId = 2L;
|
||||
long networkId = 3L;
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ public class UpdateVPCCmdTest extends TestCase {
|
|||
responseGenerator = Mockito.mock(ResponseGenerator.class);
|
||||
cmd._responseGenerator = responseGenerator;
|
||||
Mockito.verify(_vpcService, Mockito.times(0)).updateVpc(Mockito.anyLong(), Mockito.anyString(), Mockito.anyString(),
|
||||
Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyInt(), Mockito.anyString());
|
||||
Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,6 +121,11 @@
|
|||
<artifactId>cloud-plugin-storage-volume-adaptive</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cloudstack</groupId>
|
||||
<artifactId>cloud-plugin-storage-volume-ontap</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cloudstack</groupId>
|
||||
<artifactId>cloud-plugin-storage-volume-solidfire</artifactId>
|
||||
|
|
@ -372,11 +377,6 @@
|
|||
<artifactId>cloud-plugin-explicit-dedication</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cloudstack</groupId>
|
||||
<artifactId>cloud-plugin-host-allocator-random</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.cloudstack</groupId>
|
||||
<artifactId>cloud-plugin-outofbandmanagement-driver-ipmitool</artifactId>
|
||||
|
|
@ -716,17 +716,17 @@
|
|||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<artifactId>bcprov-jdk18on</artifactId>
|
||||
<version>${cs.bcprov.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcpkix-jdk15on</artifactId>
|
||||
<artifactId>bcpkix-jdk18on</artifactId>
|
||||
<version>${cs.bcprov.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bctls-jdk15on</artifactId>
|
||||
<artifactId>bctls-jdk18on</artifactId>
|
||||
<version>${cs.bcprov.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
|
@ -906,13 +906,13 @@
|
|||
</artifactItem>
|
||||
<artifactItem>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<artifactId>bcprov-jdk18on</artifactId>
|
||||
<overWrite>false</overWrite>
|
||||
<outputDirectory>${project.build.directory}/lib</outputDirectory>
|
||||
</artifactItem>
|
||||
<artifactItem>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcpkix-jdk15on</artifactId>
|
||||
<artifactId>bcpkix-jdk18on</artifactId>
|
||||
<overWrite>false</overWrite>
|
||||
<outputDirectory>${project.build.directory}/lib</outputDirectory>
|
||||
</artifactItem>
|
||||
|
|
@ -936,7 +936,7 @@
|
|||
</artifactItem>
|
||||
<artifactItem>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bctls-jdk15on</artifactId>
|
||||
<artifactId>bctls-jdk18on</artifactId>
|
||||
<overWrite>false</overWrite>
|
||||
<outputDirectory>${project.build.directory}/lib</outputDirectory>
|
||||
</artifactItem>
|
||||
|
|
@ -971,9 +971,9 @@
|
|||
<exclude>org.apache.tomcat.embed:tomcat-embed-core</exclude>
|
||||
<exclude>org.apache.geronimo.specs:geronimo-servlet_3.0_spec</exclude>
|
||||
<exclude>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</exclude>
|
||||
<exclude>org.bouncycastle:bcprov-jdk15on</exclude>
|
||||
<exclude>org.bouncycastle:bcpkix-jdk15on</exclude>
|
||||
<exclude>org.bouncycastle:bctls-jdk15on</exclude>
|
||||
<exclude>org.bouncycastle:bcprov-jdk18on</exclude>
|
||||
<exclude>org.bouncycastle:bcpkix-jdk18on</exclude>
|
||||
<exclude>org.bouncycastle:bctls-jdk18on</exclude>
|
||||
<exclude>com.mysql:mysql-connector-j</exclude>
|
||||
<exclude>org.apache.cloudstack:cloud-plugin-storage-volume-storpool</exclude>
|
||||
<exclude>org.apache.cloudstack:cloud-plugin-storage-volume-linstor</exclude>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ package com.cloud.agent.api;
|
|||
|
||||
public class CheckConvertInstanceCommand extends Command {
|
||||
boolean checkWindowsGuestConversionSupport = false;
|
||||
boolean useVddk = false;
|
||||
String vddkLibDir;
|
||||
|
||||
public CheckConvertInstanceCommand() {
|
||||
}
|
||||
|
|
@ -26,6 +28,11 @@ public class CheckConvertInstanceCommand extends Command {
|
|||
this.checkWindowsGuestConversionSupport = checkWindowsGuestConversionSupport;
|
||||
}
|
||||
|
||||
public CheckConvertInstanceCommand(boolean checkWindowsGuestConversionSupport, boolean useVddk) {
|
||||
this.checkWindowsGuestConversionSupport = checkWindowsGuestConversionSupport;
|
||||
this.useVddk = useVddk;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return false;
|
||||
|
|
@ -34,4 +41,20 @@ public class CheckConvertInstanceCommand extends Command {
|
|||
public boolean getCheckWindowsGuestConversionSupport() {
|
||||
return checkWindowsGuestConversionSupport;
|
||||
}
|
||||
|
||||
public boolean isUseVddk() {
|
||||
return useVddk;
|
||||
}
|
||||
|
||||
public void setUseVddk(boolean useVddk) {
|
||||
this.useVddk = useVddk;
|
||||
}
|
||||
|
||||
public String getVddkLibDir() {
|
||||
return vddkLibDir;
|
||||
}
|
||||
|
||||
public void setVddkLibDir(String vddkLibDir) {
|
||||
this.vddkLibDir = vddkLibDir;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ public class CheckOnHostAnswer extends Answer {
|
|||
|
||||
public CheckOnHostAnswer(CheckOnHostCommand cmd, String details) {
|
||||
super(cmd, false, details);
|
||||
determined = false;
|
||||
alive = false;
|
||||
}
|
||||
|
||||
public boolean isDetermined() {
|
||||
|
|
@ -47,5 +49,4 @@ public class CheckOnHostAnswer extends Answer {
|
|||
public boolean isAlive() {
|
||||
return alive;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import com.cloud.host.Host;
|
|||
|
||||
public class CheckOnHostCommand extends Command {
|
||||
HostTO host;
|
||||
boolean reportCheckFailureIfOneStorageIsDown;
|
||||
boolean reportIfHeartBeatFailedForOneStoragePool;
|
||||
|
||||
protected CheckOnHostCommand() {
|
||||
}
|
||||
|
|
@ -34,17 +34,17 @@ public class CheckOnHostCommand extends Command {
|
|||
setWait(20);
|
||||
}
|
||||
|
||||
public CheckOnHostCommand(Host host, boolean reportCheckFailureIfOneStorageIsDown) {
|
||||
public CheckOnHostCommand(Host host, boolean reportIfHeartBeatFailedForOneStoragePool) {
|
||||
this(host);
|
||||
this.reportCheckFailureIfOneStorageIsDown = reportCheckFailureIfOneStorageIsDown;
|
||||
this.reportIfHeartBeatFailedForOneStoragePool = reportIfHeartBeatFailedForOneStoragePool;
|
||||
}
|
||||
|
||||
public HostTO getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public boolean isCheckFailedOnOneStorage() {
|
||||
return reportCheckFailureIfOneStorageIsDown;
|
||||
public boolean shouldReportIfHeartBeatFailedForOneStoragePool() {
|
||||
return reportIfHeartBeatFailedForOneStoragePool;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ public class ConvertInstanceCommand extends Command {
|
|||
private boolean exportOvfToConversionLocation;
|
||||
private int threadsCountToExportOvf = 0;
|
||||
private String extraParams;
|
||||
private boolean useVddk;
|
||||
private String vddkLibDir;
|
||||
private String vddkTransports;
|
||||
private String vddkThumbprint;
|
||||
|
||||
public ConvertInstanceCommand() {
|
||||
}
|
||||
|
|
@ -90,6 +94,38 @@ public class ConvertInstanceCommand extends Command {
|
|||
this.extraParams = extraParams;
|
||||
}
|
||||
|
||||
public boolean isUseVddk() {
|
||||
return useVddk;
|
||||
}
|
||||
|
||||
public void setUseVddk(boolean useVddk) {
|
||||
this.useVddk = useVddk;
|
||||
}
|
||||
|
||||
public String getVddkLibDir() {
|
||||
return vddkLibDir;
|
||||
}
|
||||
|
||||
public void setVddkLibDir(String vddkLibDir) {
|
||||
this.vddkLibDir = vddkLibDir;
|
||||
}
|
||||
|
||||
public String getVddkTransports() {
|
||||
return vddkTransports;
|
||||
}
|
||||
|
||||
public void setVddkTransports(String vddkTransports) {
|
||||
this.vddkTransports = vddkTransports;
|
||||
}
|
||||
|
||||
public String getVddkThumbprint() {
|
||||
return vddkThumbprint;
|
||||
}
|
||||
|
||||
public void setVddkThumbprint(String vddkThumbprint) {
|
||||
this.vddkThumbprint = vddkThumbprint;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ import com.cloud.resource.ResourceState;
|
|||
public class PropagateResourceEventCommand extends Command {
|
||||
long hostId;
|
||||
ResourceState.Event event;
|
||||
boolean forced;
|
||||
boolean forceDeleteStorage;
|
||||
|
||||
protected PropagateResourceEventCommand() {
|
||||
|
||||
|
|
@ -34,6 +36,13 @@ public class PropagateResourceEventCommand extends Command {
|
|||
this.event = event;
|
||||
}
|
||||
|
||||
public PropagateResourceEventCommand(long hostId, ResourceState.Event event, boolean forced, boolean forceDeleteStorage) {
|
||||
this.hostId = hostId;
|
||||
this.event = event;
|
||||
this.forced = forced;
|
||||
this.forceDeleteStorage = forceDeleteStorage;
|
||||
}
|
||||
|
||||
public long getHostId() {
|
||||
return hostId;
|
||||
}
|
||||
|
|
@ -42,6 +51,14 @@ public class PropagateResourceEventCommand extends Command {
|
|||
return event;
|
||||
}
|
||||
|
||||
public boolean isForced() {
|
||||
return forced;
|
||||
}
|
||||
|
||||
public boolean isForceDeleteStorage() {
|
||||
return forceDeleteStorage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
// TODO Auto-generated method stub
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ public class ScaleVmCommand extends Command {
|
|||
Integer maxSpeed;
|
||||
long minRam;
|
||||
long maxRam;
|
||||
private boolean limitCpuUseChange;
|
||||
|
||||
public VirtualMachineTO getVm() {
|
||||
return vm;
|
||||
|
|
@ -43,7 +44,7 @@ public class ScaleVmCommand extends Command {
|
|||
return cpus;
|
||||
}
|
||||
|
||||
public ScaleVmCommand(String vmName, int cpus, Integer minSpeed, Integer maxSpeed, long minRam, long maxRam, boolean limitCpuUse) {
|
||||
public ScaleVmCommand(String vmName, int cpus, Integer minSpeed, Integer maxSpeed, long minRam, long maxRam, boolean limitCpuUse, Double cpuQuotaPercentage, boolean limitCpuUseChange) {
|
||||
super();
|
||||
this.vmName = vmName;
|
||||
this.cpus = cpus;
|
||||
|
|
@ -52,6 +53,8 @@ public class ScaleVmCommand extends Command {
|
|||
this.minRam = minRam;
|
||||
this.maxRam = maxRam;
|
||||
this.vm = new VirtualMachineTO(1L, vmName, null, cpus, minSpeed, maxSpeed, minRam, maxRam, null, null, false, limitCpuUse, null);
|
||||
this.vm.setCpuQuotaPercentage(cpuQuotaPercentage);
|
||||
this.limitCpuUseChange = limitCpuUseChange;
|
||||
}
|
||||
|
||||
public void setCpus(int cpus) {
|
||||
|
|
@ -102,6 +105,10 @@ public class ScaleVmCommand extends Command {
|
|||
return vm;
|
||||
}
|
||||
|
||||
public boolean getLimitCpuUseChange() {
|
||||
return limitCpuUseChange;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ public class LoadBalancerConfigCommand extends NetworkElementCommand {
|
|||
public String lbStatsAuth = "admin1:AdMiN123";
|
||||
public String lbStatsUri = "/admin?stats";
|
||||
public String maxconn = "";
|
||||
public Long idleTimeout = 50000L; /* 0=infinite, >0 = timeout in milliseconds */
|
||||
public String lbProtocol;
|
||||
public boolean keepAliveEnabled = false;
|
||||
NicTO nic;
|
||||
|
|
@ -50,7 +51,7 @@ public class LoadBalancerConfigCommand extends NetworkElementCommand {
|
|||
}
|
||||
|
||||
public LoadBalancerConfigCommand(LoadBalancerTO[] loadBalancers, String publicIp, String guestIp, String privateIp, NicTO nic, Long vpcId, String maxconn,
|
||||
boolean keepAliveEnabled) {
|
||||
boolean keepAliveEnabled, Long idleTimeout) {
|
||||
this.loadBalancers = loadBalancers;
|
||||
this.lbStatsPublicIP = publicIp;
|
||||
this.lbStatsPrivateIP = privateIp;
|
||||
|
|
@ -59,6 +60,7 @@ public class LoadBalancerConfigCommand extends NetworkElementCommand {
|
|||
this.vpcId = vpcId;
|
||||
this.maxconn = maxconn;
|
||||
this.keepAliveEnabled = keepAliveEnabled;
|
||||
this.idleTimeout = idleTimeout;
|
||||
}
|
||||
|
||||
public NicTO getNic() {
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ public class DownloadAnswer extends Answer {
|
|||
}
|
||||
|
||||
public Long getTemplateSize() {
|
||||
return templateSize;
|
||||
return templateSize == 0 ? templatePhySicalSize : templateSize;
|
||||
}
|
||||
|
||||
public void setTemplatePhySicalSize(long templatePhySicalSize) {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue